Impor OpenStreetMap. Dari sumber biner ke tabel dalam database dalam beberapa langkah

Biasanya, ketika seseorang berbicara tentang OSM, salah satu layanan web muncul di kepala Anda, atau aplikasi seperti Maps.me, berdasarkan data OSM. Faktanya, proyek OSM terutama adalah data, yang lainnya pada dasarnya adalah kasus khusus penggunaannya. Layanan biasanya hanya menyediakan sebagian dari informasi yang diambil sesuai dengan aturan mereka.

Awalnya, OSM adalah kumpulan poin, tautan antara poin, dan tag untuk mereka. Sumber komunitas memiliki dua format. Awalnya, XML digunakan sebagai cara prioritas mendistribusikan data, tetapi file Planet.osm telah melebihi terabyte dalam bentuk yang tidak terkompresi, dan saya tidak melihat alasan untuk menggunakannya untuk informasi yang relatif banyak. PBF memiliki keuntungan besar - biner dan seluruh file bumi memiliki ukuran sekitar 50 GB (XML dikompresi sekitar 80 GB).

Ini adalah tentang mengimpor data OSM dari format "asli" menggunakan alat Osmosis.

Kita juga membutuhkan PostgreSql dengan ekstensi Postgis, di mana kita akan mengimpor data OSM.

Akibatnya, dimungkinkan untuk memperoleh informasi tentang objek dengan tag yang tercantum di sini dalam database mereka .



Persiapan DB.


Pertama, buat database di Postgresql, namanya tidak terlalu penting.

psql -c "CREATE DATABASE map;" 

Selanjutnya, tambahkan ekstensi yang diperlukan untuk pekerjaan lebih lanjut.

 psql -d map -c "CREATE EXTENSION postgis; CREATE EXTENSION hstore; " 

Ekstensi Postgis "menghubungkan" ke database modul aktual untuk bekerja dengan geodata (saya mengingatkan Anda bahwa Anda harus menginstal Postgis sendiri). Ekstensi hstore dirancang untuk bekerja dengan set kunci / nilai, seperti banyak informasi akan terkandung dalam tag OSM.

Unduh Osmosis . Singkatnya, ini adalah perangkat lunak untuk berbagai operasi dengan data OSM. Ada beberapa dokumentasi yang baik untuk bekerja dengan baris perintah. Sumber di Jawa. Di bawah ini kita akan menggunakan baris perintah. Saya juga menggunakan Osmosis sebagai perpustakaan Java, kode sumber (tersedia di GitHub) tampak cukup jelas bagi saya, dan API mudah digunakan.

Sekarang kami sedang mempersiapkan database untuk impor. Tabel dan fungsi yang diperlukan dapat dibuat menggunakan skrip yang terletak di folder osmosis / skrip. Selain skrip utama, kami akan mengeksekusi kode SQL yang akan membuat bidang untuk menyimpan geometri garis. Ini disebabkan oleh fakta bahwa data OSM lebih cenderung direpresentasikan sebagai koneksi titik daripada sebagai seperangkat bentuk geometris.

 psql -d map -fc:\osmosis\script\pgsnapshot_schema_0.6.sql psql -d map -fc:\osmosis\script\pgsnapshot_schema_0.6_linestring.sql 

Impor data OSM ke dalam basis data


Nah, sekarang hampir semuanya sudah siap. Anda bahkan dapat menjalankan impor. Kita perlu memutuskan apa yang akan kita ambil sebagai sumber. Yaitu, Anda perlu memilih format dan sumber. Awalnya, komunitas OSM menggunakan (dan menggunakan) format XML. Namun, jumlah data bertambah dan bertambah, sehingga format teks secara bertahap menjadi ramai. Menggunakan PBF agak lebih nyaman. Sumber pusat planet.openstreetmap.org berisi data untuk seluruh dunia. Dengan satu file Anda dapat mengunduh seluruh basis pengetahuan proyek, yang telah melebihi 40 gigabytes dalam bentuk biner. Dalam kasus-kasus ketika saya ingin memotong sepotong data dari sana, saya biasanya meninggalkan laptop bekerja sepanjang malam, memberikan lebih dari 100GB ruang kosong pada SSD untuk file-file sementara.

Dalam kasus kami, kami dapat mulai dengan menggunakan unggahan dari anggota komunitas. Ada sumber daya yang memungkinkan untuk mengunduh data hanya untuk wilayah tertentu. Misalnya, unduh.geofabrik.de . Ambil wilayah Voronezh. Di sana dimasukkan dalam file yang berisi data untuk seluruh distrik federal pusat. Anda dapat mengunduh central-fed-district-latest.osm.pbf, dan kemudian memotong โ€œbagianโ€ yang diinginkan ke dalam file atau filter terpisah dengan koordinat saat mengimpor ke database. Saya akan menyarankan opsi pertama:

 c:\osmosis\bin\osmosis.bat --read-pbf file="c:\downloads\central-fed-district-latest.osm.pbf" --bounding-box top=52.059564 left=37.92290 bottom=49.612297 right=43.225858 --write-pbf file="c:\map\voronezh.osm.pbf" 

Semuanya sederhana di sini. Kami membaca file PBF, memfilter hasil membaca dengan persegi panjang koordinat, dan menulis hasilnya setelah memfilter ke file output. Anda dapat memfilter menurut koordinat lebih akurat menggunakan bukan persegi panjang, tetapi poligon yang koordinatnya berada dalam file terpisah.

File voronezh.osm.pbf yang dihasilkan kemudian diimpor ke dalam basis data. Untuk menghubungkan, buat file properti dengan parameter akses database:

 host=localhost database=map user=pguser password=pgpassword dbType=postgresql 

Nah, impor itu sendiri:

 c:\osmosis\bin\osmosis.bat --read-pbf c:\map\voronezh.osm.pbf --write-pgsql authFile=c:\map\databaseinfo.properties 

Data yang Diimpor


Sekarang Anda sudah dapat mulai mempelajari apa yang kami miliki di database. Pikiran pertama adalah bahwa ada serangkaian angka, tetapi ini tidak sepenuhnya benar. Seperti yang saya katakan, elemen utamanya adalah intinya. Segala sesuatu yang lain dibuat dengan membuat tautan (hubungan) antar titik. Kami tidak akan pergi jauh, terutama karena tangan sudah gatal untuk membuat tabel "flat" sendiri dengan beberapa data. Nah, untuk garis dan titik semuanya sudah siap, Anda hanya perlu membuat tabel dengan bidang yang diperlukan, dan masukkan entri yang diperlukan di sana. Dan bidang apa yang kita miliki? Di sini untuk membantu wiki. Misalnya, ambil pasangan kunci / nilai pasangan daya = . Pilih daftar bidang yang akan kita gunakan, misalnya: nama, voltase, operator, kabel. Ternyata kami ingin memilih garis yang tentu saja memiliki properti power = line, bersama dengan nama bidang, tegangan, operator, kabel. Buat tabel:

 CREATE TABLE power_lines ( name varchar, voltage varchar, operator varchar, cables varchar, geom geometry ) 

Dan permintaan itu sendiri untuk mengisi tabel baru kami:

 INSERT INTO power_lines SELECT ways.tags -> 'name' as name, ways.tags -> 'voltage' as voltage, ways.tags -> 'operator' as operator, ways.tags -> 'cables' as cables, ways.linestring as geom FROM ways WHERE ways.tags -> 'power' IN ( 'line' ) 

Selesai, kami memiliki meja dengan saluran listrik, di mana beberapa saluran bahkan memiliki beberapa bidang yang diisi! Yah, tabelnya tentu menarik, tetapi memvisualisasikan data untuk melihat geometri juga akan menyenangkan. Cara tercepat untuk melakukan ini adalah dengan QGIS, kecuali bahwa GIS yang kuat ini harus diinstal terlebih dahulu. Di sana kita sudah menambahkan lapisan Postgis, gunakan peta apa pun sebagai substrat (Anda dapat menggunakan plugin OpenLayers). Dikonfigurasi, lihat:



Hore! Bahkan sangat mirip dengan kebenaran, pikirku, memandang ke luar jendela ke saluran listrik.

Dan poligon?

Situasi dengan titik hampir sama, kecuali bahwa Anda perlu menggunakan tabel node. KDPV hanya berisi data pada gardu induk . Dan bagaimana dengan poligon? Poligon juga terdiri dari garis-garis (tertutup). Tampaknya Anda dapat menutup dialog dan menikmati hasilnya, tetapi itu tidak akan berhasil. Ada banyak jebakan. Poligon dapat terdiri dari beberapa garis tertutup.

Misalnya, sebuah pulau mungkin berada di danau. Karena itu, kami mendapat "lubang" di TPA. Saya juga harus belajar tentang arti kata "exclave" (yang memalukan, saya hanya tahu tentang "kantong"). Poligon juga dikelompokkan. Sebagai contoh, hutan dapat terdiri dari beberapa "potongan". Yang harus kita wakili sebagai satu objek. Untuk melengkapi semuanya, kita harus memotong poligon terbuka jika beberapa data berada di luar peta. Saya memecahkan ini, dan beberapa masalah lain dalam skrip SQL, yang saya simpan dengan aman di rak setelah berhasil. Proyek osmosis-multipoligon ditemukan di GitHub. Dengan enggan, saya memutuskan bahwa menggunakan solusi ini adalah pilihan yang lebih baik daripada set script saya yang ditulis di atas lutut saya dalam beberapa hari. Kami melakukan seperti yang dikatakan dalam README, yaitu, kami mengeksekusi daftar skrip, dan kami memiliki tabel multipoligon, yang diisi dengan instruksi dari assemble.sql. Setelah kami mengisi tabel dengan poligon, Anda dapat menemukan apa yang ingin kami dapatkan. Mari kita pilih wilayah taman ?

Kami melihat wiki dan menulis skrip:

 CREATE TABLE parks ( name varchar, geom geometry ); INSERT INTO parks SELECT m.tags -> 'name' as name, m.geom FROM multipolygons m WHERE m.tags -> 'leisure' IN ( 'park' ) 

Sekarang kami memvisualisasikan:



Yah, jujur โ€‹โ€‹saja, di sini Anda bisa berdebat tentang relevansi data. Tapi ini adalah topik untuk diskusi lain.

Source: https://habr.com/ru/post/id467043/


All Articles