Siapa yang hidup baik di Rusia? Bagaimana kami mencari kota paling hijau menggunakan OpenStreetMap dan Overpass API

Setiap kartu memiliki legenda: dialah yang memberi tahu pembaca apa yang ditunjukkan di dalamnya dan bagaimana caranya. Rumah sesuai dengan poligon abu-abu, jalan - segmen dan kurva, taman dan bujur sangkar diisi dengan warna hijau muda dan didekorasi dengan piktogram pohon. Dan pada beberapa peta mereka menambahkan aplikasi yang berguna - daftar jalan ini dengan panjangnya, jumlah taman, toko dan tempat sampah.



Ketika kami bersiap untuk mengotomatiskan pekerjaan layanan kota lokal, kami menarik perhatian pada penggunaan kartografi, yang kami temukan sebagai alat yang sangat kuat dan efektif untuk menyelesaikan berbagai tugas. Pada peta, Anda dapat menampilkan informasi terkini tentang lokasi objek, rute pergerakan peralatan panen, transportasi, rencana kerja dan peta panas dengan masalah dan area “sehat”.



Penggunaan kartografi secara umum membantu mempercepat waktu reaksi dan pengambilan keputusan tentang masalah yang mendesak, menyederhanakan proses perencanaan dan peramalan, dan yang terpenting, semua informasi tersedia dalam bentuk yang paling visual.



Saat bekerja dengan salah satu pelanggan, kami menghadapi tugas yang menarik - menghitung jumlah objek di peta berdasarkan kategori.



Mencari



Tentukan kota "paling hijau" di Distrik Federal Pusat dengan kombinasi data berikut: jumlah toko, tempat sampah, dan taman.



Diberikan



Pemetaan. Kami memilih OpenStreetMap (selanjutnya - OSM ) sebagai batu loncatan karena alasan yang sangat sederhana - Open Source.



Keputusan



Ada beberapa pendekatan untuk menyelesaikan masalah ini. Misalnya, kita dapat menggunakan PostgreSQL untuk menanyakan database OSM dan mengambil data yang diperlukan, atau menggunakan QGIS, sistem untuk membuat, menganalisis, dan menerbitkan informasi geospasial. Namun, kami menemukan cara yang lebih elegan dan efisien - Overpass API .



Overpass API adalah alat yang ampuh untuk mengekstraksi data dari database OSM atas permintaan pengguna. Ini dioptimalkan untuk tugas dalam skala apa pun: dari mengambil beberapa elemen dari database hingga ratusan juta objek yang dipilih sesuai dengan permintaan dalam bentuk XML atau Overpass QL - versi upgrade dari Overpass XML. Baca lebih lanjut tentang Overpass API di sini .
Mari kita mulai dari awal: pertama-tama, Anda perlu menerapkan OSM di server. Ubuntu digunakan sebagai sistem operasi di mesin kami.



T: Mengapa menerapkan OSM Anda?

J: Untuk bekerja dengan data, kita membutuhkan Overpass API, yang server publiknya memiliki batasan jumlah permintaan per hari. Karena alasan inilah kami akan menyebarkan server kami dengan blackjack OSM dan API Overpass.

Instruksi lengkap untuk menginstal OSM ada di sini .
Langkah selanjutnya adalah menginstal Overpass API - rilis terbarunya dapat ditemukan di sini .



sudo apt-get update
sudo apt-get install g++ make expat libexpat1-dev zlib1g-dev apache2 -y
wget http://dev.overpass-api.de/releases/osm-3s_.tar.gz
tar -zxvf osm-3s_.tar.gz
cd osm-3s_
./configure CXXFLAGS="-O2" --prefix=$EXEC_DIR
make install
cd ../
chmod -R 755 ./overpass


Setelah instalasi, Anda perlu mengisi - membuat database. Kami tidak memerlukan database seluruh dunia, jadi kami akan menggunakan layanan Geofabrik , yang memungkinkan kami mendapatkan data untuk wilayah administratif yang ditentukan.

Alternatif yang layak untuk Geofabrik adalah BBBike .



Kami mengunduh dan membongkar database yang diunduh dari direktori Eropa> Federasi Rusia> Distrik Federal Pusat dalam format .osm.bz2, sebagai berikut:

PATH_TO_INIT_OSM3S.SH PATH_TO_FILE_BZ2 PATH_WERE_Unpack_OVERPASS_API DIRECTORY

Catatan: dalam hal ini, semua tindakan dilakukan di direktori overpass .



Jadi, peronnya hampir siap - sekarang kami dapat membuat permintaan pertama kami dan mengetahui jumlah taman di seluruh wilayah.

PATH_TO_OSM3S_QUERY --db-dir = PATH_TO_DB


Permintaan dan tanggapan kami terlihat seperti ini:



root@MIP-USER55:~# cd overpass/
root@MIP-USER55:~/overpass# ./osm-3s_v0.7.56.7/bin/osm3s_query --db-dir=db
encoding remark: Please enter your query and terminate it with CTRL+D.
[out:json][timeout:25];
(
nwr["landuse"="forest"];
);
out count;
{
  ...,
  "elements": [

{
  "type": "count",
  "id": 0,
  "tags": {
    "nodes": "23",
    "ways": "19723",
    "relations": "4206",
    "total": "23952"
  }
}

  ]
}


Kita sudah dekat: yang tersisa hanyalah membagi taman menurut wilayah dan kota. Dispatcher yang berjalan secara terpisah dan terus berjalan akan membantu kita mengatasi tugas ini .



Kami meluncurkan API dan menambahkan PORT Dengarkan di direktori /etc/apache2/ports.conf .



echo "_ localhost" | sudo tee /etc/apache2/conf-available/_.conf && sudo a2enconf _

sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport  -j ACCEPT
sudo a2enmod cgi
sudo a2enmod ext_filter
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/___.conf


Memeriksa konfigurasi. Seharusnya terlihat seperti ini.



<VirtualHost *:>
   ServerAdmin webmaster@localhost
   ExtFilterDefine gzip mode=output cmd=/bin/gzip

   DocumentRoot __OVERPASS_API/html

   ScriptAlias /api/ __OVERPASS_API/cgi-bin/

   <Directory "__OVERPASS_API">
      AllowOverride None
      Options Indexes FollowSymLinks
      Require all granted
   </Directory>

   <Directory "__OVERPASS_API/cgi-bin/">
      AllowOverride None
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
      Require all granted
   </Directory>

   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>


Selanjutnya, kami menghidupkan host baru dan mengirim yang lama untuk beristirahat.



sudo a2ensite .conf
sudo a2dissite 000-default.conf
sudo a2dissite __.conf
sudo service apache2 reload


Sekarang saatnya mengaktifkan Dispatcher pertama yang akan menangani permintaan kita. Untuk melakukan ini, kami akan menggunakan perintah.



nohup __OVERPASS_API/bin/dispatcher --osm-base --db-dir=__DB --meta &


Tanda pertama bahwa semuanya berjalan sesuai rencana adalah pembuatan file

osm3s_OVERPASS_API_VERSION_osm_base di direktori database. File nohup.out menampilkan pesan status Dispatcher - dispatcher baru saja dimulai .



Namun, pekerjaan ini tidak berakhir di situ: Anda harus memulai Dispatcher lain. Pertama, salin folder aturan ke direktori dengan database dan distribusikan hak ke osm3s_OVERPASS_API_VERSION_areas yang dihasilkan .




nohup __OVERPASS_API/bin/dispatcher --areas --db-dir=__DB &

chmod 666 "../db/osm3s_OVERPASS_API__areas"
nohup __OVERPASS_API/bin/rules_loop.sh __DB &


Sekarang kami dapat membuat permintaan untuk wilayah tersebut dan menghitung jumlah taman di Ryazan. Dan omong-omong, ini sudah berfungsi di bilah alamat browser.



http://localhost:/api/interpreter?data=[output:json][timeout:25]; area[name=""]->.searchArea; ( nwr["leisure"="park"](area.searchArea); ); out count;


Jawaban yang sudah lama ditunggu!



"elements": [

{
  "type": "count",
  "id": 0,
  "tags": {
    "nodes": "0",
    "ways": "57",
    "relations": "11",
    "areas": "0",
    "total": "68"
  }
}

  ]
}


Jadi, sekarang kita dapat menyelami masalah analitik dan perbaikan: kita akan menemukan jumlah taman, toko, dan tempat sampah di 25 kota besar di Distrik Federal Pusat dan membandingkan indikator ini menggunakan alat analisis platform ODANT .

ODANT adalah platform integrasi digital buatan Rusia yang dirancang untuk membangun sistem informasi dengan berbagai kompleksitas dan distribusi. Baca lebih lanjut tentang ODANT di sini .
Seperti inilah tampilan parameter kami untuk mencari tempat sampah: dalam kerangka tugas, kami tidak membedakan antara lokasi kontainer, tempat sampah yang berdiri sendiri, dan tempat pengumpulan sampah padat.




nwr["amenity"="recycling"](area.searchArea);
nwr["amenity"="waste_disposal"](area.searchArea);
nwr["amenity"="waste_basket"](area.searchArea);


Kami mengekspor output dari ODANT sebagai tabel datar.



Kota



Guci



Populasi



Populasi / Guci



Vladimir



1525



356937



234



Krasnogorsk



274



175554



641



Kaluga



376



332039



883



Tambov



279



292140



1047



Moskow



11473



12678079



1105



Kolomna



111



140129



1262



Balashikha



378



507366



1342



Kursk



336



452976



1348



Rybinsk



129



184635



1431



Mytishchi



140



235504



1682



Lyubertsy



119



205295



1725



Zelenograd



140



250453



1789



Voronezh



544



1058261



1945



Tver



225



449507



1998



Yaroslavl



273



608353



2228



Murom



43



106984



2488



Podolsk



114



308130



2703



Khimki



89



259550



2916



Kostroma



72



276929



3846



Lipetsk



124



509420



4108



Ryazan



118



539290



4570



Korolev



49



224348



4579



Tula



101



475161



4705



Elektrostal



32



156026



4876







Dalam peringkat ini, kota Vladimir menempati baris pertama yang terhormat: hanya 234 orang di sana untuk satu tempat penumpukan sampah. Dengan menggunakan alat ODANT bawaan, kami membuat dua bagan yang lucu.











Mari beralih ke elemen berikutnya - bangku.



nwr["amenity"="bench"](area.searchArea);


Kami mendapatkan hasil berikut dalam bentuk tabel.



Kota



Bangku



Populasi



Populasi / toko



Vladimir



593



356937



602



Tambov



413



292140



707



Moskow



13970



12678079



908



Krasnogorsk



143



175554



1228



Balashikha



411



507366



1234



Zelenograd



185



250453



1354



Tver



268



449507



1677



Lyubertsy



115



205295



1785



Kaluga



176



332039



1887



Kursk



214



452976



2117



Murom



42



106984



2547





172



475161



2763





49



140129



2860





272



848752



3120





79



308130



3900





132



539290



4086





61



276929



4540





43



259550



6036





25



184635



7385





78



608353



7799





55



509420



9262





16



156026



9752





23



224348



9754





17



235504



13853





Dan sekali lagi, Vladimir menjadi yang paling nyaman dari semua pesaing: tidak mungkin menempatkan 602 orang di satu bangku cadangan, tetapi di Mytishchi perjuangan yang jauh lebih sengit sedang berlangsung untuk memperebutkan tempat. Namun, Anda selalu bisa membuat jadwal.



Kami memvisualisasikan hasil kami.











Mari beralih ke bagian yang paling menarik: menghitung luas taman. Kita dapat menggunakan beberapa metode untuk memecahkan masalah ini, tetapi yang paling open source dan menakjubkan yang kita temukan adalah pustaka Leaflet . Dalam kueri itu sendiri, Anda perlu mengganti out count dengan out geom, yang akan memberi kita koordinat wilayah.

Leaflet adalah pustaka JavaScript open source untuk menampilkan peta di situs web. Mendukung sebagian besar platform seluler dan desktop yang mendukung HTML5 dan CSS3. Leaflet memungkinkan pengembang yang tidak terbiasa dengan GIS untuk dengan mudah menampilkan peta raster yang terdiri dari ubin kecil, mungkin dengan lapisan tambahan yang dihamparkan di atas yang utama. Baca lebih lanjut tentang Leaflet di sini .


Mari buat poligon.



const polygon = L.polygon().addTo(map);
const area = L.GeometryUtil.geodesicArea(polygon.getLatLngs());


Sekarang daerah tersebut berisi luas daerah dalam m2. Kami mengekstrak data untuk kota yang kami pilih dan mendapatkan tabel berikut.



Kota



Total luas taman (km2)



Area kota (km2)



Persentase ruang yang ditempati taman



Jml

taman



Zelenograd



4.13



37,199



0.111



26



Kaluga



12.60



168.8



0,075



140



Moskow



121.75



2561.5



0,048



1469



Lyubertsy



0.60



12.87



0,047



28



Vladimir



4.62



137.14



0,034



104



Khimki



3.55



109.8



0,032



27



Podolsk



1.29



40.39



0,032



53



Balashikha



1.78



62.8



0,028



55



Tambov



2.71



96.58



0,028



140



Tula



4.09



145.8



0,028



102



Kostroma



3.95



144.5



0,027



50



Krasnogorsk



0.69



25.65



0,027



21



Ryazan



4.32



224.163



0,019



96



Yaroslavl



3.68



205.8



0,018



176



Korolev



0.97



55.47



0,017



tigapuluh



Kursk



3.31



208.2



0,016



862



Kolomna



1.03



65.1



0,016



21



Mytishchi



0,53



34.59



0,015



tigapuluh



Voronezh



8.25



596.51



0,014



414



Lipetsk



4.44



330.15



0,013



78



Tver



1.38



152.22



0,009



129



Murom



0.33



43.78



0,008



sebelas



Rybinsk



0.65



101.42



0,006



62



Elektrostal



0.25



51.45



0,005



52





Menurut OSM, Zelenograd sepenuhnya membenarkan namanya - 11% wilayah kota ditempati oleh area hijau. Mari kita dapatkan rasio jumlah penghuni dengan jumlah taman.



Kota



Total luas taman (m2)



Jumlah m2 taman per penghuni



Jumlah penduduk per 1 taman



Kaluga



12.600.000



37.95



2372



Zelenograd



4.130.000



16.49



9633



Kostroma



3.950.000



14.26



5539



Khimki



3.550.000



13.68



9613



Vladimir



4.620.000



12.94



3432



Voronezh



8.250.000



9.72



2050



Moskow



121.750.000



9.60



8630



Tambov



2.710.000



9.28



2087



Lipetsk



4.440.000



8.72



6531



Tula



4.090.000



8.61



4658



Ryazan



4.320.000



8.01



5618



Kolomna



1.030.000



7.35



6673



Kursk



3,310,000



7.31



525



Yaroslavl



3.680.000



6.05



3457



Korolev



970.000



4.32



7478



Podolsk



1.290.000



4.19



5814



Krasnogorsk



690.000



3.93



8360



Rybinsk



650.000



3.52



2978



Balashikha



1.780.000



3.51



9225



Murom



330.000



3.08



9726



Tver



1,380,000



3.07



3485



Lyubertsy



600.000



2.92



7332



Mytishchi



530,000



2.25



7850



Elektrostal



250.000



1.60



3001





Mari kita sajikan data dalam bentuk grafik.











Dan di final - peringkat kota, dihitung berdasarkan tempat yang ditempati.



Kota



Peringkat



Sebuah tempat



Vladimir



12



1



Kaluga



limabelas



2



Moskow



delapan belas



3



Zelenograd



21



4



Tambov



23



lima



Krasnogorsk



35



6



Balashikha



39



7



Lyubertsy



45



8



Khimki



46



sembilan



Kursk



47



sepuluh



Kolomna



48



sebelas



Kostroma



50



12



Voronezh



52



tigabelas



Podolsk



55



empat belas



Tula



55



limabelas



Ryazan



61



enambelas



Tver



63



17



Yaroslavl



63



delapan belas



Murom



69



19



Rybinsk



69



20



Lipetsk



70



21



Korolev



75



22



Mytishchi



75



23



Elektrostal



94



24





Epilog dan kesimpulan



Dengan keputusan panel juri yang terdiri dari OpenStreetMap, Overpass API dan ODANT,

Vladimir mengambil tempat pertama yang terhormat dan menerima gelar "Yang Paling Hijau di Distrik Federal Pusat".



Perlu diperhatikan fakta berikut: penelitian kami hanya didasarkan pada data yang tercermin dalam OSM. Secara alami, ada beberapa ratus bangku di Mytishchi, dan di Tula ada lebih banyak tempat untuk mengumpulkan sampah. Hasil kami dapat dilihat dari sisi lain, misalnya untuk menilai dinamika penambahan objek infrastruktur perkotaan ke database OSM. Namun, secara rata-rata, orang-orang “sama lambatnya” untuk memasukkan data ke dalam OSM, sehingga dapat diasumsikan bahwa data tersebut relatif dapat diandalkan dan layak dipertimbangkan.



Kami berhasil memecahkan masalah dan menemukan cara yang efektif untuk bekerja dengan objek pada peta OSM: ternyata merupakan kombinasi dari Overpass API dan Leaflet. Dengan menggunakan seperangkat alat ini, kita dapat membuat kueri ke database OSM dan menerima data tentang jumlah objek, menghitung luas area. Untuk presentasi dan analitik data, kami menyusun solusi berbasis web berdasarkan ODANT yang memenuhi semua kebutuhan kami.



Ada banyak sekali industri, bisnis dan ekonomi yang dapat dibantu oleh solusi ini. Jika Anda memiliki ide atau umpan balik, akan sangat menyenangkan untuk berdiskusi. Kami menghabiskan 28 jam bersih untuk tugas tersebut, Anda mungkin dapat melakukannya lebih cepat.



Pemimpin Frontend Developer, Infostandard - Daniel Epifanov.

Editor, Infostandard - Nikita Morozov.



All Articles