ดาวน์โหลดถนน หรือข้อมูลอื่น จาก OpenStreetMap เพื่อนำมาใช้งานในรูปแบบ shapefile ทำได้ง่าย ๆ และ ฟรี แต่อย่างไรก็ดี โปรดอ่านข้อจำกัดทางลิขสิทธิ์ประเภทอนุญาตเฉพาะสำหรับการแบ่งปันข้อมูลสาธารณะ Open Data Commons Open Database License (ODbL) เสียก่อน อย่าไปทำอะไรขัดกับสิ่งที่เขาอนุญาตนะจ๊ะ
OpenStreetMap เป็นโครงการแผนที่เสรี ที่สร้างและแก้ไขแผนที่โดยผู้ใช้งาน หากท่านสนใจรายละเอียดเกี่ยวกับ OpenStreetMap โปรดอ่านที่นี่
ข้อดีของ OpenStreetMap คือ ฟรี! (อย่างที่บอกข้างต้น ต้องอยู่ภายใต้สัญญา ODbL) โดยไฟล์จะอยุ่ในนามสกุล .osm ซีงสามารถใช้งานได้ทั้ง QGIS และ ArcMap โดย QGIS 3 ได้ออกแบบให้ใช้งานข้อมูล raster และ vector จาก OpenStreetMap ได้ในตัวเองอยู่แล้ว และสามารถอัปโหลดข้อมูลเพื่อปรับปรุงแผนที่ได้โดยตรง หรือจะใช้งานปลั๊กอินส์เพื่อความสะดวกรวดเร็วก็ได้ ส่วน ArcMap ต้องลงปลั๊กอินส์ (สำหรับเครื่องมืออื่น ๆ ที่ทำได้มีอะไรบ้าง ลองดูที่ https://wiki.openstreetmap.org/wiki/Editors) ซึ่ง จะมีตัวเลือกที่น่าสนใจ ในแง่ WMS ก็คือตัว Java OpenStreetMap Editor กับ Merkaartor ที่น่าสนใจมากพอสมควร
ดาวน์โหลดถนน โดยใช้ QGS
การใช้ Vector จาก OpenStreetMap
สำหรับ vector นั้น QGIS รองรับไฟล์ osm อยู่แล้ว ถ้า download มาใช้ก็ add เข้ามาได้เลย แหล่งดาวน์โหลดก็เช่น จาก https://download.geofabrik.de/asia.html หรือ ถ้าเราเปิด https://www.openstreetmap.org เลือกพื้นที่ที่ต้องการ แล้วกดปุ่ม Export ก็จะได้ไฟล์ osm มาใช้งาน
แต่มีอีกวิธีที่สะดวกกว่า คือใช้ปลั๊กอิน QuickOSM เพื่อเพิ่มชั้นข้อมูล และ นำมาแก้ไขดัดแปลงใน QGIS ได้โดยตรง
QuickOSM
สำหรับคนที่ยังไม่เคยลงปลั๊กอิน QuickOSM ไปที่เมนู Plugins เลือก manage and install plugins ค้นหา QuickOSM (พิมพ์ตรง Search ได้เลย) คลิกติดตั้งหรือ install ให้เรียบร้อย
เวลาใช้งาน ไปที่เมนู Vector เลือก QuickOSM เลือก QuickOSM
เมื่อเลือกแล้ว จะมีหน้าต่าง Quick query โผล่ขึ้นมา ตรงนี้มี 3 ช่องสำคัญที่ต้องใส่ นั่นคือ key value และ in สำหรับ Key กับ Value ที่ต้องระบุ แนะนำให้ดู tag ที่หน้า https://wiki.openstreetmap.org/wiki/Map_Features) เพื่อดูว่า Key มีอะไรบ้าง Value มีอะไรบ้าง และ เป็นข้อมูลประเภทไหน
อย่างในตัวอย่างนี้ จะดาวน์โหลดถนนในกรุงเทพ ก็จะเลือก
- Key = route
- Value = road
- In = Bangkok
ปรับเปลี่ยน in เป็น around หรือ Layer Extend, Canvas Extend ตามความเหมาะสม แต่ตัวอย่างนี้จะดาวน์โหลดถนนหลักที่มีในกรุงเทพฯ จึงเลือกเป็น in และกำหนดเป็น Bangkok
ถ้าต้องการตั้งค่าละเอียดขึ้น ให้เลือก Advance เพิ่มเติมก็ได้ อย่างเช่น จะดาวน์โหลดถนน แต่ไม่อยากได้พวกตำแหน่ง point จะเอาแต่ line ก็กด Advacne จะมีให้เลือกว่าจะเอาประเภทไหนบ้าง เช่น point line เพราะข้อมูลบางอย่างมีหลายประเภทข้อมูล เมื่อเลือกได้แล้วกด run query ก็จะเป็นการดึงข้อมูลจาก OpenStreetMap เข้ามาทำงานใน QGIS
Layer ที่ได้ จะเป็น temporary หรือ layer ที่สร้างขึ้นชั่วคราว (จะมีสัญลักษณ์เตือนที่หลังชื่อ layer) ถ้าปิด QGIS ก็จะหายไป หากต้องการเก็บไว้เพื่อนำมาใช้ต่อโดยไม่ต้องโหลดอีก จะใช้วิธี Export แล้ว save เป็น shapefile เอาไว้ใช้งานต่อ
ขั้น Advance
ถ้าหากท่านตามวิธีข้างต้น จะนำเข้าข้อมูลได้ทีละข้อมูลเท่านั้น ซึ่ง บางทีเราอาจจะอยากได้อะไรหลาย ๆ อย่างมารวมกันทีเดียว
อย่างเช่น อยากได้ ข้อมูลที่ตั้ง ธนาคาร (bank) กับ ที่ตั้ง ATM ในกรุงเทพ เป็น point อยู่ใน layer เดียวกัน แต่ OpenStreetMap จะแยกข้อมูลเป็น 2 กลุ่ม (และข้อมูล bank ก็มีทั้ง polygon และ point) ถ้าดาวน์โหลดมา ก็จะแยกทำเป็น 2 ครั้งคือ
- Key = amenity
- Value = bank
- In = Bangkok
ถ้าข้อมูลประเภทนั้น มีประเภทข้อมูลมากกว่า 1 อย่าง เราควรแล้วคลิก Advance เพื่อเลือกเฉพาะที่ต้องการ ตรวจสอบจากลิงก์ด้านบนได้ว่า OpenStreetMap มีชั้นข้อมูลอะไรบ้าง อย่างในที่นี้ เนื่องจาก Bank มีข้อมูลมากกว่า 1 ประเภท ก็เลยเลือก Node กับ Point เพื่อจะเอาไปรวมกับของ ATM
กับ
- Key = amenity
- Value = atm
- In = Bangkok
ซึ่งปกติ ถ้าท่านจะนำเข้าตามวิธีข้างบน จะต้องนำเข้า 2 รอบ คือ รอบแรก เอา ธนาคาร (bank) มาก่อน (โดยเอาเฉพาะ point) แล้วค่อยนำข้อมูล ATM เข้ามาอีกครั้ง แล้วจึง merge ให้เป็น 1 เดียว
วิธีการ merge คือ
- ไปที่เมนู Processing > Toolbox
- มองหา Vector general > Merge vector layers tool ดับเบิลคลิกเรียกใช้งาน
- ในMerge Vector Layers คลิก … (สามจุด) ตรง Input layers. เลือกที่ต้องการ คลิก OK.
- กำหนดระบบพิกัด
- สุดท้าย เลือกว่าจะ save to file หรือจะ Save to GeoPackage ก็ได้
การ merge จะทำได้เฉพาะข้อมูลประเภทเดียวกันเท่านั้น
แต่เรามีวิธีลัด…
อย่างแรก ลองดึงตำแหน่ง Bank เข้ามาก่อน ตามปกติ นั่นคือ
- ไปที่เมนู Vector เลือก QuickOSM เลือก QuickOSM
- Key = amenity
- Value = bank
- In = Bangkok
จากนั้น แทนที่เราจะคลิก run query ให้กด show query ก่อน ซึ่งเราจะได้เห็นโค้ด xml ดังนี้
<osm-script output="xml" timeout="25">
<id-query {{geocodeArea:Bangkok}} into="area_0"/>
<union>
<query type="node">
<has-kv k="amenity" v="bank"/>
<area-query from="area_0"/>
</query>
</union>
<union>
<item/>
<recurse type="down"/>
</union>
<print mode="body"/>
</osm-script>
จะเห็นตรง
<query type="node">
<has-kv k="amenity" v="bank"/>
<area-query from="area_0"/>
</query>
เรา copy มาเลย ว่างต่อด้านล่าง แล้วเปลี่ยนจาก bank เป็น atm เพราะจะเอา atm มาเพิ่ม โค้ดที่ได้จะเป็นแบบนี้
<osm-script output="xml" timeout="25">
<id-query {{geocodeArea:Bangkok}} into="area_0"/>
<union>
<query type="node">
<has-kv k="amenity" v="bank"/>
<area-query from="area_0"/>
</query>
<query type="node">
<has-kv k="amenity" v="atm"/>
<area-query from="area_0"/>
</query>
</union>
<union>
<item/>
<recurse type="down"/>
</union>
<print mode="body"/>
</osm-script>
เพียงเท่านี้ ก็จะได้ชั้นข้อมูลชั้นเดียว ที่มีทั้ง bank และ atm อยู่ใน feature เดียวกัน save ใช้งานได้โดยไม่ต้องมา merge ให้มันยุ่งยาก
การดึง Raster จาก OpenStreetMap
วิธีการเรียกใช้ Raster จาก OpenStreetMap มาใช้ จะอยู่ใน XYZ Tiles ให้มองที่ Panel Browser (ถ้าหน้าจอไม่มี Panel นี้อยู่ ให้คลิกขวาที่ว่าง ๆ ตรงเมนูด้านบน ดูตรง Panel ว่าติ๊กถูกหน้า Browser หรือเปล่า) เลื่อนลงมาด้านล่าง จนเจอคำว่า XYZ Tiles คลิกตรงสามเหลี่ยมลูกศรลงมาดู จะเห็นคำว่า OpenStreetMap ดึงมาใช้งานได้เลยจ้า
หรือจะใช้ปลั๊กอิน QuickMapService ก็ได้
ทั้งหมดนี้ก็เป็นการดึงข้อมูลจาก OpenStreetMap มาใช้งานเป็น Shapefile ตั้งต้นได้ อย่างไรก็ดี สิ่งที่ควรจำเอาไว้ก็คือ ข้อมูลของ OSM เป็นลิขสิทธิ์แบบ Open Data Commons Open Database License (ODbL) อย่าเผลอนำไปใช้ผิดสัญญาที่เขาอนุญาตให้ใช้