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
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.