
Pada musim semi, kami menambahkan fitur "Reverse Geocoding" ke API DaData.ru, yang juga disebut "
Alamat oleh Koordinat ". Namanya mengisyaratkan: metode ini mengambil geocoordinate dan memberikan data tentang alamat.
Produk padat dengan fungsi yang sama menawarkan Yandex - disebut
Geocoder . Tetapi layanan Yandex gratis hanya untuk proyek non-komersial terbuka. Tarif standar - mulai 120 000 ₽ per tahun - tidak cocok untuk semua orang.
Kami pikir - jika Anda membuat alternatif gratis atau murah untuk "Geocoder", pengembang mungkin akan mengucapkan terima kasih. Dan mereka melakukannya. Dalam artikel ini saya akan memberi tahu Anda bagaimana struktur "Alamat oleh Koordinat" bekerja: bagaimana kami mengatur pencarian, menyusun direktori dan mengemasnya menjadi metode yang sudah jadi.
Di mana kami mendapatkan data dan bagaimana kami mencari alamatnya
Mendekati tugas, kami mempelajari solusi yang sudah jadi: di mana mendapatkan direktori koordinat dengan alamat dan cara mencari objek geografis dari direktori ini. Ternyata Anda bahkan tidak perlu pergi jauh untuk alat yang tepat.
Kami mengambil objek alamat di FIAS -
Sistem Alamat Informasi Federal . Ini adalah direktori alamat terbuka dan resmi paling komprehensif.
Kami sudah menulis tentang
Habré secara detail, dan sekarang empat fakta penting:
- FIAS menyimpan semua objek yang dapat dialamatkan di negara itu, dari daerah dan di bawah - ke bangunan dan wilayah tambahan;
- direktori tersedia secara bebas dalam format DBF dan XML;
- FIAS tidak sempurna - tidak memiliki puluhan ribu rumah dan banyak jalan, terutama yang baru;
- Setiap objek alamat dalam direktori sesuai dengan kode ID - FIAS unik. Kode objek terkadang diubah, tetapi untuk artikel kami ini tidak begitu penting.
Objek alamat yang diunduh dari FIAS bersama ID adalah dasar dari direktori kami untuk geocoding terbalik.
Unduh koordinat dari OpenStreetMap (OSM). OSM adalah proyek dengan lisensi gratis: penggemar mengumpulkan koordinat berbagai objek dan mempostingnya kepada semua orang.
Secara sederhana, OSM adalah sekumpulan titik, garis, dan poligon pada peta. Setiap objek memiliki deskripsi, jenis, dan set koordinatnya sendiri. Data OSM untuk Rusia terletak di
needgeo.com ,
osm.sbin.ru/osm_dump/ dan
osmosis.svimik.com/latest/ .
Daftar sumber diterbitkan pada halaman khusus pada "Wiki" proyekBongkar terdiri dari file PBF - format ini digunakan bukan XML sebagai yang lebih kompak. Mengubah PBF menjadi OSM XML tidak memerlukan biaya,
banyak utilitas yang disetujui komunitas dapat menangani hal ini.
Untuk direktori kami sendiri, kami mengambil objek alamat dari FIAS, dan kemudian mencari koordinatnya di OSM. Jika ditemukan, simpan data gabungan. Ternyata persimpangan seperti FIAS dan OSM.
Dan semua ini luar biasa, tetapi ada satu masalah: semuanya tidak mudah dengan kualitas data di OSM. Koordinat objek seringkali tidak sesuai dengan kenyataan. Misalnya, poligon untuk daerah dan kabupaten sudah memadai. Tetapi untuk kota dan di bawah - tidak begitu banyak.
Poligon adalah poligon yang membatasi area pada peta. Mereka terdiri dari serangkaian titik yang terhubung dengan koordinat. Poligon menunjukkan batas wilayah, kabupaten, kota, dan bahkan bangunanPekerjaan utama, dan dengan margin yang luas, adalah untuk mengumpulkan data yang memadai dari OSM dan menyingkirkan pernikahan. Tugas ini sangat banyak sehingga saya mendedikasikan bagian terpisah untuk itu dalam artikel.
Kami juga mengunduh rumah yang tidak ada dalam FIAS dari OSM. Seperti yang saya katakan di atas, ada puluhan ribu rumah di FIAS. Ini bahkan bukan masalah, tetapi hanya kenyataan, latar belakang. Karena itu, kami mengisi direktori kami dengan rumah-rumah dari OSM. Tapi hanya mereka yang ada jalan di FIAS. Bangunan yang berasal dari OSM tidak memiliki ID FIAS, jadi kami mengidentifikasikannya sebagai
kode rumah + nomor FIAS induk .
Dalam direktori yang kami cari dengan bantuan Lucene yang cantik - asisten jangka panjang kami. Terima kasih atas tipnya, kepada orang India yang fasih yang menulis pos
Pengindeksan Data Geografis Dengan Lucene (tambahan yang baik adalah materi
Iklan spasial ke dalam algoritma pencarian spasial - tentang pohon-pohon kd di mana
algoritma pencarian dibangun).
Segera setelah kami mengetahui tentang Lucene, masalah pencarian diselesaikan hampir dengan sendirinya. Bisnis tetap - pergi untuk amplas.
- Kami memuat di Lucene direktori koordinat dan alamat Anda, mendapat indeks pencarian. Untuk memudahkan, hampir semuanya telah dihapus darinya, hanya menyisakan ID dan koordinat alamat.
- Kami menyiapkan pencarian berdasarkan indeks: input - koordinat, output - ID objek alamat yang ditemukan. Pencarian tidak menghasilkan informasi lain, karena indeks benar-benar dipersingkat.
- Puas penerbitan, memuat data dari FIAS "besar" oleh ID yang ditemukan. Kami menambahkan banyak segalanya, mulai dari alamat yang dibutuhkan semua orang dalam satu baris hingga tanda ibukota regional kota.
- Kami menemukan cara menyortir dan memberikan objek yang diterima.
Sejauh ini, semuanya terlihat sederhana, tetapi ini hanya sebagian kecil dari pekerjaan. Tidak ada pencarian untuk alamat berdasarkan koordinat yang akan berhasil, jika kami tidak menyusun direktori yang layak.
Cara mengumpulkan basis koordinat dan alamat
Untuk memulai, saya akan meletakkan koper: setelah membaca artikel, lakukan dengan cepat buku pegangan seperti itu tidak berfungsi. Kami telah mengumpulkannya sejak 2014, terus-menerus menambahnya. Saya akan berbicara tentang ini sangat jauh.
Bagian tersulit ketika menyusun direktori adalah memilah koordinat yang berasal dari OSM. Pada awalnya, kami memverifikasi mereka sebaik mungkin, termasuk dengan tangan kami. Tujuan utamanya adalah untuk mendapatkan poin referensi di kota-kota besar dan membuat panduan referensi dari mereka. Sekarang ada banyak titik seperti itu, hampir tidak perlu secara manual memeriksa data baru. Pada suatu waktu, kami menambahkan 200.000-300.000 alamat dengan koordinat ke direktori referensi, dan inilah cara kami melakukannya.
Kami membentuk alamat lengkap dari tag OSM. Dalam unggahan OSM, bagian komponen alamat disebarkan oleh berbagai tag:
- addr: kota - desa Bulatnikovo ;
- addr: street - Central street ;
- addr: housenumber - 103 .
Kami membaca tag dan mengumpulkan alamat lengkap dari mereka:
desa Bulatnikovo, 103 Central Street .
Kami menjalankan setiap alamat baru melalui API standardisasi Dadat . Layanan ini mengubah alamat menjadi format tunggal "Suka dalam FIAS":
- mengoreksi kesalahan ketik;
- menerjemahkan singkatan seperti "NiNo" dan "Msk";
- mengubah nama lama menjadi yang baru;
- menemukan kota yang hilang dalam alamat berdasarkan indeks;
- mendefinisikan kode FIAS.
Alamat dari API bersih, meskipun sekarang mereka mengirim surat atau paket.
Kami menyimpan rumah, jalan, dan pemukiman standar sebagai satu titik. Untuk jalan dan desa, titik ini adalah pusatnya. Akibatnya, semua objek alamat berada di tabel yang sama, di dalam - alamat, ID FIAS, lintang dan bujur.
Kami menganalisis alamat yang tidak distandarisasi oleh Dadata. Alamat yang tidak dapat dicocokkan dengan FIAS ditandai dengan bendera oleh layanan. Kami memeriksanya secara manual, ada beberapa opsi.
- Alamatnya tidak datang dalam tag unggah OSM yang tepat, tetapi iblis tahu di mana. Bertemu dan tidak mengisi tag alamat, dan kota di tag jalan, dan banyak lagi.
- Di OSM terletak objek eksotis seperti taman bermain, lapangan sepak bola perguruan tinggi atau bahkan kuburan. Tidak ada yang seperti ini di FIAS, dan untuk tujuan kami hasil ini tidak cocok. Objek seperti itu hanya disaring.
- Kesalahan - dan bukan kesalahan sama sekali. Misalnya, distrik kota yang tidak ada di FIAS berasal dari OSM. Atau di OSM, objek tersebut terletak di pemukiman, tetapi dalam FIAS pemukiman ini dilampirkan ke kota dan dihapus. Kemudian kami menyelesaikan algoritme untuk data yang dimuat dan menjalankannya kembali.
Mengurai pembongkaran, dan di sana - kebingungan dalam tagKami memeriksa seberapa memadai koordinat yang dimuat. Untuk melakukan ini, kita melihat dengan utilitas khusus apakah koordinat objek baru jatuh ke dalam poligon wilayah induk atau distrik. Jika alamat menginformasikan bahwa objek tersebut terletak di wilayah Omsk, harap berbaik hati untuk masuk ke tempat pembuangan sampah. Masuk ke kota tidak diperlukan - tidak semua kota secara akurat dicakup dalam OSM, bagi banyak orang, data tidak diperbarui.
Kami memuat referensi poligon dari OSM dan menyimpannya apa adanya - dalam format
GeoJSON . Untuk memilih poligon mana yang akan dicoba pada suatu titik, lihat di tabel terpisah. Di dalamnya, kami membandingkan awalan kode CLADR dan ID poligon: Anda menemukan kode CLADR untuk alamat dan Anda melihat poligon mana yang harus dipilih.
Kode KLADR adalah pengidentifikasi unik yang digunakan sebelum FIAS. Sejuta layanan dapat menemukan kode ini untuk alamatUtilitas memungkinkan objek untuk berdiri 1.700 meter dari TPA. Aturan ini ditambahkan karena jalan raya yang sering melampaui batas wilayah. Tetapi jarak yang lebih besar dari 1.700 meter adalah tanda kesalahan, kata statistik.
Untuk ini untuk kota dan jalan-jalan, cek berakhir.
Sekali lagi, lebih tepatnya, kami memeriksa koordinat rumah yang dimuat. Utilitas yang disebutkan kembali berperan, dan inilah fungsinya.
- Dia mengambil alamat rumah baru dan menemukan tetangga untuknya di direktori referensi.
- Menurut koordinat, itu mempertimbangkan jarak antara rumah baru yang belum diverifikasi dan tetangga yang dapat diandalkan.
Sangat mudah untuk menemukan tetangga: 1. Kami mengambil rumah baru dan menemukan ID FIAS induk. 2. Kami memilih dari rumah direktori referensi yang orang tuanya memiliki ID FIAS yang samaInspeksi hanya dilakukan di rumah, yang berjarak tidak lebih dari 150 meter dari kolega yang andal. Selain itu, kami mempertimbangkan setiap rumah baru yang disetujui ketika menganalisis yang berikut. Begini cara kerjanya.
Misalkan, dalam panduan referensi, rumah
No. 1, 2, dan 3 disimpan di
sepanjang Jalan Kommunarov . Dalam data baru datang rumah
No 5, 6 dan 7 di jalan yang sama. Dilihat oleh koordinat, rumah-rumah baru di dekatnya. Utilitas melihat bahwa
nomor rumah
5 berada di sebelah
nomor rumah
1, 2, dan 3 dan menambahkannya ke direktori referensi. Jadi, rumah
nomor 6 dan 7 juga sedang diuji.
Dan kemudian nasib data yang berasal dari OSM diputuskan:
- rumah yang telah melewati kedua pemeriksaan: untuk tempat pembuangan sampah dan untuk tetangga, kami menambah direktori referensi;
- jika objek tidak jatuh ke dalam poligon, data baru tidak cocok. Sama jika jarak antara rumah dan tetangga terlalu besar;
- rumah yang tidak memiliki tetangga, kami sedang menunda. Mereka terletak di database yang terpisah, suatu hari nanti kita akan menganalisis.
Kami membagi benda yang diuji menjadi dua bagian. Mereka akan pergi ke berbagai pelat manual referensi kami.
Di tabel pertama - semua objek dengan ID FIAS ke rumah: wilayah, pemukiman, jalan-jalan. Di kedua - di rumah dan tautan ke induk dari tabel pertamaDiperlukan dua tabel untuk menetapkan kunci ke rumah-rumah yang hilang dari FIAS. Mereka tidak memiliki kode FIAS sendiri, jadi inilah caranya:
- kami mengumpulkan objek alamat ke rumah dalam satu tabel, masing-masing memiliki kode FIAS sendiri;
- di kedua - hanya di rumah, sambil merujuk ke orang tua di tabel pertama.
Sebagai hasil dari bangunan tanpa kode FIAS, kami mengidentifikasi
ID + nomor rumah orang
tua menggunakan kunci
FIAS .
Referensi sudah siap, masih harus diuji. Kami menjalankan layanan uji fungsional semalam dan menguji kinerja. Kami memeriksa kecepatan di Moskow, meminta semua rumah dalam radius tiga kilometer. Yang pasti. Tentu saja, mereka menutupi semuanya dengan autotest.
Hal utama setelah pembaruan adalah tidak menjadi lebih buruk.
Membalik geocoding melalui mata pengguna
Metode input mengambil tiga parameter: koordinat, jumlah hasil, dan radius pencarian. Jari-jari default adalah 100 meter, maksimum adalah satu kilometer. Nilai persisnya diatur dalam pengaturan.
curl -X POST \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -H "Authorization: Token ${API_KEY}" \ -d '{ "lat": 55.878, "lon": 37.653, "radius_meters": 50 }' \ https:
Metode mengembalikan objek yang ditemukan: rumah, jalan, dan permukiman. Ini memilah mereka dalam urutan akurasi menurun.
- Di rumah
- Jalanan.
- Permukiman.
- Kota
Kemudian memilah lagi - dengan jarak dari koordinat yang diberikan. Jika metode ini telah menemukan empat rumah dan satu jalan, rumah-rumah pertama akan berdiri dalam urutan jarak dari titik tertentu. Di belakang mereka ada jalan.
Setelah semua kastil ini, metode akhirnya mengembalikan objek yang ditemukannya.
{ "suggestions": [ { "value": " , , 11", "unrestricted_value": " , , 11", "data": {...} }, { "value": " , , 11", "unrestricted_value": " , , 11", "data": {...} } ] }
Di dalam - banyak hal berbeda tentang objek yang ditemukan: garis dengan alamat lengkap dan disingkat, nama saat ini dan yang sudah ketinggalan zaman, kode pos, kode FIAS objek induk dan sebagainya.
Semua data yang diberikan metode ini ada dalam dokumentasiCakupan oleh koordinat untuk berbagai daerah berbeda, seperti ini dengan rumah:
- Moskow - 96%,
- St. Petersburg - 88%,
- juta kota lainnya - 74%,
- sisa Rusia adalah 47%.
Dan ini dia - menutupi jalan-jalan:
- Moskow - 92%
- St. Petersburg - 79%,
- kota-kota jutawan lainnya - 75%,
- sisa Rusia adalah 67%.
Mereka tidak mempertimbangkan kota-kota - dalam skala Rusia, bahkan fakta memiliki nama kota yang bangga itu tidak stabil. Sebagai contoh,
wilayah Yaroslavl, distrik Poshekhonsky, s / o Fedorkovsky adalah sebuah kota, menurut direktori resmi FIAS. Namun pada kenyataannya, dan di alamat - distrik pedesaan. Secara fisik, distrik pedesaan menyerupai penyatuan beberapa desa dalam noda besar. Sulit tidak hanya untuk menentukan pusat, tetapi bahkan untuk menemukan penyelesaian di peta.
Kami sudah memikirkan apa yang akan ditambahkan ke metode: izinkan penyaringan berdasarkan jenis objek, kembalikan jarak ke titik tertentu, sesuatu yang lain. Kami memantau permintaan dan memutuskan apakah akan berinvestasi.
Kalau tidak, semuanya sudah ada di prod. Hingga 10.000 permintaan per hari - gratis, lebih banyak - dengan berlangganan mulai dari 5.000 ₽ per tahun. Jika Anda memerlukan alamat berdasarkan koordinat untuk proyek komersial, dan Geocoder terlalu mahal, coba
Dadati API .
Artikel asli diterbitkan di blog HFLabs .