Contents

แปลงข้อมูล 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

/images/2025-04-16/example_chile_boundary.webp
รูปที่ 1 แสดงตัวอย่างขอบเขตของประเทศชิลี

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

/images/2025-04-16/example_chonburi_province_boundary.webp
รูปที่ 2 แสดงตัวอย่างขอบเขตของจังหวัดชลบุรี

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

/images/2025-04-16/example_one_bangkok_boundary.webp
รูปที่ 3 แสดงตัวอย่างขอบเขตของ One Bangkok

⚙️ หมายเหตุ: การแปลงข้อมูลระหว่างไฟล์ .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