แปลงข้อมูล OpenStreetMap เป็น GeoJSON พร้อมเลือกเฉพาะพื้นที่ที่ต้องการ
บทความนี้จะสอนวิธีแปลงไฟล์ข้อมูลจาก OpenStreetMap (OSM) ให้อยู่ในรูปแบบ GeoJSON พร้อมทั้งเลือกเฉพาะบริเวณที่สนใจ เช่น จังหวัด หรือพื้นที่เฉพาะ ด้วยเครื่องมือ ogr2ogr
1 จาก GDAL 2
1. โครงสร้างข้อมูลพื้นฐานของไฟล์ OSM
ข้อมูลใน OSM มีรูปแบบหลัก 2 ชนิด คือ .osm
(XML) และ .pbf
(Binary ซึ่งบีบอัดขนาดให้เล็กลง เหมาะกับการประมวลผล) 3
ข้อมูลใน OSM แบ่งออกเป็น 4 ประเภทหลัก 4 ได้แก่: Node, Way, Relation, และ Tags
ข้อมูลประเภท Node 5
Node
ใช้แทนตำแหน่งจุดบนแผนที่ เช่น ร้าน Warabimochi Kamakura ที่มีพิกัดละติจูด 13.7260766
และลองจิจูด 100.5476849
<node id="12762661383" lat="13.7260766" lon="100.5476849" ...>
<tag k="name" v="Warabimochi Kamakura (One Bangkok)"/>
<tag k="name:en" v="Kamakura Thailand"/>
<tag k="amenity" v="cafe"/>
<tag k="addr:street" v="ถนนพระรามที่ 4"/>
<tag k="phone" v="+66931395236"/>
...
</node>
ข้อมูลประเภท Way 6
Way
คือชุดของ Node
ที่เชื่อมต่อกันเป็นเส้น (Polyline) หรือพื้นที่ (Polygon) เช่น ขอบเขตของ One Bangkok
<way id="608350816" ...>
<nd ref="5763750191"/>
<nd ref="5763750192"/>
...
<nd ref="5763750191"/> <!-- ปิดลูปเพื่อเป็น Polygon -->
<tag k="landuse" v="commercial"/>
<tag k="name" v="One Bangkok"/>
<tag k="name:th" v="วัน แบงค็อก"/>
...
</way>
ข้อมูลประเภท Relation 7
Relation
ใช้แสดงความสัมพันธ์ระหว่าง Node
, Way
, หรือ Relation
อื่น ๆ เช่น เขตประทุมวัน ที่มีเลข ID 92063
<relation id="92063" ...>
<member type="node" ref="384900039" role="label"/>
<member type="way" ref="872380831" role="outer"/>
<member type="relation" ref="3320986" role="subarea"/>
...
<tag k="name" v="เขตปทุมวัน"/>
<tag k="name:en" v="Pathum Wan District"/>
<tag k="admin_level" v="6"/>
...
</relation>
ข้อมูลประเภท Tags 8
Tags ใช้เก็บข้อมูล metadata ของแต่ละ Node, Way หรือ Relation ในรูปแบบ key=value เช่น:
name=เขตปทุมวัน
→ ชื่อของเขตname:en=Pathum Wan District
→ ชื่อในภาษาอังกฤษname:th=วัน แบงค็อก
→ ชื่อในภาษาไทยaddr:street=ถนนพระรามที่ 4
→ ชื่อถนนที่อยู่
โดยใช้ :
เพื่อระบุขอบเขตหรือภาษา เช่น name:th
หมายถึงชื่อภาษาไทย
2. ดาวน์โหลดข้อมูล OSM เพื่อสร้างขอบเขตที่สนใจ
เพื่อแปลงข้อมูล OpenStreetMap เฉพาะประเทศหรือพื้นที่ที่เราต้องการใช้งาน เราสามารถดาวน์โหลดไฟล์ .osm.pbf
จาก Geofabrik ซึ่งจัดเตรียมข้อมูลแยกตามทวีปและประเทศไว้ให้
2.1 🌎 ตัวอย่าง: ดาวน์โหลดข้อมูลทวีปอเมริกาใต้
ในกรณีที่ต้องการสร้างขอบเขตของประเทศชิลี เราสามารถเริ่มจากดาวน์โหลดข้อมูลของทั้งทวีปอเมริกาใต้ ตามตัวอย่างคำสั่งด้านล่าง:
wget https://download.geofabrik.de/south-america-latest.osm.pbf
2.2 🇹🇭 ตัวอย่าง: ดาวน์โหลดข้อมูลประเทศไทย
หากสนใจแปลงข้อมูลเฉพาะพื้นที่ในประเทศไทย เช่น จังหวัดหรืออำเภอ สามารถดาวน์โหลดข้อมูลระดับประเทศ ตามตัวอย่างคำสั่งด้านล่าง:
wget https://download.geofabrik.de/asia/thailand-latest.osm.pbf
3. แปลงข้อมูล OSM เป็น GeoJSON ด้วย ogr2ogr
จาก GDAL
ในบทความนี้ เราเลือกใช้ ogr2ogr
เพื่อแปลงข้อมูล OpenStreetMap (.osm.pbf
) ให้เป็นไฟล์ GeoJSON ซึ่งสามารถนำไปใช้งานกับระบบ GIS หรือแสดงผลบนเว็บแผนที่เช่น GeoJSON.io
คำสั่งพื้นฐานของ ogr2ogr
ogr2ogr ...
[-of <output_format>]
[-select <field_list>]
[-where <restricted_where>|@<filename>]
<dst_dataset_name> <src_dataset_name> [<layer_name>]
-of GeoJSON
: กำหนดรูปแบบไฟล์ผลลัพธ์-where
: ใช้ตัวกรองข้อมูลแบบ SQL เช่นname='Chile'
-select
: เลือกเฉพาะฟิลด์ที่ต้องการ
3.1 🌎 ตัวอย่าง: สร้าง GeoJSON ขอบเขตประเทศชิลีจากข้อมูลทวีปอเมริกาใต้
คำสั่งด้านล่างนี้ใช้ ogr2ogr
เพื่อแปลงข้อมูลภูมิศาสตร์จากไฟล์ OSM รูปแบบ .pbf
ของทวีปอเมริกาใต้ (ชื่อไฟล์ south-america-latest.osm.pbf
) ให้กลายเป็นไฟล์ GeoJSON ที่มีเฉพาะขอบเขตของ ประเทศชิลี เท่านั้น 9
โดยใช้พารามิเตอร์ -where
เพื่อกรองข้อมูลเฉพาะที่มีชื่อ (name
) เป็น 'Chile'
และระดับการปกครอง (admin_level
) เท่ากับ 2
ซึ่งเป็นระดับประเทศในข้อมูล OSM
docker run --rm -v $(pwd):/data ghcr.io/osgeo/gdal:alpine-small-latest \
ogr2ogr \
-of GeoJSON \
-where "name='Chile' AND admin_level='2'" \
/data/chile-boundary.geojson \
/data/south-america-latest.osm.pbf \
multipolygons
3.2 🇹🇭 ตัวอย่าง: สร้าง GeoJSON ขอบเขตจังหวัดชลบุรีจากข้อมูลประเทศไทย
คำสั่งนี้ใช้ ogr2ogr
เพื่อแปลงข้อมูลจากไฟล์ OpenStreetMap ประเทศไทย (thailand-latest.osm.pbf
) เป็นไฟล์ GeoJSON ที่ระบุเฉพาะขอบเขตของ จังหวัดชลบุรี เท่านั้น 10
ใช้พารามิเตอร์ -where
เพื่อกรองเฉพาะข้อมูลที่มี name
เป็น 'จังหวัดชลบุรี'
และ admin_level
เท่ากับ 4
ซึ่งใน OpenStreetMap หมายถึงระดับ “จังหวัด”
gdal:alpine-small-latest \
ogr2ogr \
-of GeoJSON \
-where "name='จังหวัดชลบุรี' AND admin_level='4'" \
/data/chonburi-boundary.geojson \
/data/thailand-latest.osm.pbf \
multipolygons
3.3 🏙️ ตัวอย่าง: สร้าง GeoJSON ขอบเขต One Bangkok จากข้อมูลประเทศไทย
ในตัวอย่างนี้ใช้คำสั่ง ogr2ogr
เพื่อแปลงข้อมูลจากไฟล์ OpenStreetMap ของประเทศไทย (thailand-latest.osm.pbf
) เป็นไฟล์ GeoJSON ที่แสดงขอบเขตของพื้นที่ One Bangkok 11
โดยใช้พารามิเตอร์ -where
เพื่อกรองข้อมูลที่มี name
เป็น 'One Bangkok'
ซึ่งเป็นชื่อของพื้นที่ที่ต้องการ
docker run --rm -v $(pwd):/data ghcr.io/osgeo/gdal:alpine-small-latest \
ogr2ogr \
-of GeoJSON \
-where "name='One Bangkok'" \
/data/one-bangkok-boundary.geojson \
/data/thailand-latest.osm.pbf \
multipolygons
⚙️ หมายเหตุ: การแปลงข้อมูลระหว่างไฟล์ .osm
และ .osm.pbf
เมื่อทำงานกับข้อมูล OSM ในรูปแบบต่าง ๆ เช่น .osm
และ .osm.pbf
บางครั้งเราอาจต้องแปลงไฟล์ระหว่างสองรูปแบบนี้เพื่อให้สามารถอ่านได้ในรูปแบบ XML
การดาวน์โหลดและใช้งาน osmconvert 12
osmconvert
เป็นเครื่องมือที่ใช้สำหรับแปลงไฟล์ข้อมูล OSM ที่มีนามสกุลต่าง ๆ เช่น .osm
, .osc
, .osc.gz
, .osh
, .o5m
, .o5c
, และ .pbf
13
สามารถดาวน์โหลด osmconvert
โดยใช้คำสั่งด้านล่าง:
wget -O - http://m.m.i24.cc/osmconvert.c | cc -x c - -lz -O3 -o osmconvert
การแปลงไฟล์ .osm.pbf
เป็น .osm
หากต้องการแปลงไฟล์ .osm.pbf
(เช่น one-bangkok.osm.pbf
) ให้เป็นไฟล์ .osm
(ในรูปแบบ XML) สามารถใช้คำสั่งดังนี้:
./osmconvert one-bangkok.osm.pbf --out-osm -o=one-bangkok.osm
คำสั่งนี้จะทำการแปลงไฟล์ one-bangkok.osm.pbf
14 ให้อยู่ในรูปแบบ .osm
และบันทึกเป็นไฟล์ one-bangkok.osm
15