
Au printemps, nous avons ajouté la fonction «Géocodage inversé» à l'API DaData.ru, également appelée «
Adresse par coordonnées ». Le nom indique: la méthode prend des coordonnées géographiques et fournit des données sur l'adresse.
Un produit solide avec les mêmes fonctionnalités offre Yandex - il s'appelle
Geocoder . Mais le service Yandex est gratuit uniquement pour les projets non commerciaux ouverts. Le tarif standard - Ă partir de 120 000 â‚˝ par an - ne convient pas Ă tout le monde.
Nous avons pensé - si vous faites une alternative gratuite ou peu coûteuse à "Geocoder", les développeurs vous diront probablement merci. Et ils l'ont fait. Dans l'article, je vais vous expliquer le fonctionnement de la structure "Adresse par coordonnées": comment nous configurons la recherche, créons un répertoire et l'empaquetons dans une méthode toute faite.
Où obtenons-nous les données et comment recherchons-nous l'adresse
En approchant de la tâche, nous avons étudié des solutions toutes faites: où trouver le répertoire de coordonnées avec des adresses et comment ensuite rechercher des objets géographiques à partir de ce répertoire. Il s'est avéré que vous n'avez même pas besoin d'aller loin pour les bons outils.
Nous prenons les objets d'adresse dans FIAS -
Federal Information Address System . Il s'agit du répertoire d'adresses ouvert et officiel le plus complet.
Nous avons déjà écrit à ce sujet en détail sur
Habré , et maintenant quatre faits sont importants:
- FIAS stocke tous les objets adressables du pays, des régions et en dessous - aux bâtiments et territoires supplémentaires;
- le répertoire est disponible gratuitement aux formats DBF et XML;
- FIAS n'est pas parfait - il manque des dizaines de milliers de maisons et de nombreuses rues, en particulier de nouvelles;
- Chaque objet adresse du répertoire correspond à un code ID - FIAS unique. Le code objet est parfois modifié, mais pour notre article, ce n'est pas si important.
Les objets d'adresse téléchargés depuis FIAS avec ID sont la base de notre annuaire pour le géocodage inversé.
Téléchargez les coordonnées depuis OpenStreetMap (OSM). OSM est un projet avec une licence gratuite: les passionnés collectent les coordonnées de divers objets et les affichent à tout le monde.
En termes simples, OSM est un ensemble de points, de lignes et de polygones sur une carte. Chaque objet a sa propre description, type et ensemble de coordonnées. Les données OSM pour la Russie se trouvent sur
needgeo.com ,
osm.sbin.ru/osm_dump/ et
osmosis.svimik.com/latest/ .
La liste des sources est publiée sur une page spéciale sur le «Wiki» du projetLe déchargement consiste en des fichiers PBF - ce format est utilisé à la place de XML comme un format plus compact. Transformer PBF en OSM XML ne coûte rien, un
tas d'utilitaires approuvés par la communauté peuvent gérer cela.
Pour notre propre répertoire, nous prenons les objets d'adresse de FIAS, puis recherchons leurs coordonnées dans OSM. S'il est trouvé, enregistrez les données combinées. Il s'avère une telle intersection de FIAS et OSM.
Et tout cela est merveilleux, mais il y a un problème: les choses ne sont pas faciles avec la qualité des données dans OSM. Les coordonnées des objets ne correspondent souvent pas à la réalité. Par exemple, les polygones pour les régions et les districts sont adéquats. Mais pour les villes et en dessous - pas tant.
Les polygones sont des polygones qui délimitent des zones sur une carte. Ils se composent d'un ensemble de points liés avec des coordonnées. Les polygones indiquent les limites des régions, des quartiers, des villes et même des bâtimentsLe travail principal, et dans une large mesure, consiste à collecter des données adéquates auprès de l'OSM et à éliminer le mariage. La tâche est si volumineuse que je lui ai consacré une section distincte dans l'article.
Nous téléchargeons également des maisons qui ne sont pas dans FIAS à partir d'OSM. Comme je l'ai dit plus haut, il y a des dizaines de milliers de logements à FIAS. Ce n'est même pas un problème, mais simplement une réalité, un arrière-plan. Par conséquent, nous réapprovisionnons notre répertoire avec des maisons d'OSM. Mais seulement ceux pour lesquels il y a une rue à FIAS. Les bâtiments provenant d'OSM n'ont pas d'ID FIAS, nous les identifions donc comme
code FIAS + numéro de maison du
parent .
Dans le répertoire que nous recherchons avec l'aide de la belle Lucene - notre assistante à long terme. Merci pour le conseil, à un Indien bien versé qui a écrit le post
Indexing Geographical Data With Lucene (un bon ajout est le matériel
Ad spatial dans les algorithmes de recherche spatiale - sur les kd-arbres sur lesquels l'
algorithme de recherche est construit).
Dès que nous avons découvert Lucene, le problème de recherche a été résolu presque tout seul. Les affaires restent - optez pour du papier de verre.
- Nous avons chargé dans Lucene votre répertoire de coordonnées et d'adresses, obtenu un index de recherche. Pour plus de facilité, presque tout a été supprimé, ne laissant que les identifiants et coordonnées des adresses.
- Nous mettons en place une recherche par index: entrée - coordonnées, sortie - ID des objets d'adresse trouvés. La recherche ne renvoie pas d'autres informations, car l'index a été totalement raccourci.
- Satisfait de l'émission, chargement des données de la "grande" FIAS par les identifiants trouvés. Nous ajoutons beaucoup de tout, de l'adresse dont tout le monde a besoin en une seule ligne au signe de la capitale régionale des villes.
- Nous avons compris comment trier et donner les objets reçus.
Jusqu'à présent, tout semble simple, mais ce n'est qu'une petite partie du travail. Aucune recherche d'adresse par coordonnées n'aurait fonctionné si nous n'avions pas compilé un répertoire décent.
Comment collecter la base de coordonnées et d'adresses
Pour commencer, je vais disposer les bagages: après avoir lu l'article, faire rapidement un tel manuel ne fonctionne pas. Nous le collectons depuis 2014, en le complétant constamment. Je vais parler de ce putain de long chemin.
La partie la plus difficile lors de la compilation d'un répertoire est de trier les coordonnées provenant d'OSM. Au début, nous les avons vérifiés du mieux que nous pouvions, y compris avec nos mains. L'objectif principal était alors d'obtenir des points de référence dans les grandes villes et d'en faire un guide de référence. Maintenant qu'il existe de nombreux points de ce type, il n'est presque plus nécessaire de vérifier manuellement les nouvelles données. À la fois, nous ajoutons 200 000 à 300 000 adresses avec coordonnées au répertoire de référence, et voici comment procéder.
Nous formons des adresses complètes à partir de balises OSM. Dans les téléchargements OSM, les composants des adresses sont dispersés par différentes balises:
- addr: ville - village Bulatnikovo ;
- addr: rue - rue centrale ;
- addr: numéro de maison - 103 .
Nous parcourons les tags et collectons l'adresse complète d'eux:
village Bulatnikovo, 103, rue Central .
Nous exécutons chaque nouvelle adresse via l' API de normalisation Dadat . Le service convertit les adresses dans un format unique "comme dans FIAS":
- corrige les fautes de frappe;
- décode les abréviations comme "NiNo" et "Msk";
- change les anciens noms en nouveaux;
- trouve la ville manquante dans l'adresse par index;
- définit un code FIAS.
Les adresses de l'API sont propres, bien qu'elles envoient maintenant une lettre ou un colis.
Nous stockons les maisons, les rues et les colonies standardisées comme un seul point. Pour la rue et le village, ce point est le centre. Par conséquent, tous les objets d'adresse sont dans la même table, à l'intérieur - l'adresse, l'ID FIAS, la latitude et la longitude.
Nous analysons les adresses que Dadata n'a pas standardisées. Les adresses qui n'ont pas pu être mises en correspondance avec FIAS sont marquées d'un drapeau par le service. Nous les vérifions manuellement, il existe plusieurs options.
- L'adresse n'est pas entrée dans les balises de téléchargement OSM appropriées, mais le diable sait où. Étiquettes d'adresse remplies et non remplies, et la ville dans l'étiquette de rue, et bien plus encore.
- Dans OSM se trouve un objet exotique comme une aire de jeux, un terrain de football universitaire ou même un cimetière. Il n'y a rien de tel dans FIAS, et pour nos besoins, ces résultats ne conviennent pas. Ces objets sont simplement filtrés.
- Une erreur - et pas une erreur du tout. Par exemple, un quartier d'une ville qui n'existe pas dans FIAS provenait de l'OSM. Ou dans OSM, l'objet est situé dans une colonie, mais dans FIAS, cette colonie a été attachée à la ville et supprimée. Ensuite, nous terminons l'algorithme pour les données chargées et le réexécutons.
Analyser le déchargement, et là - confusion dans les balisesNous vérifions l'adéquation des coordonnées chargées. Pour ce faire, nous regardons avec un utilitaire spécial si les coordonnées du nouvel objet tombent dans le polygone de la région ou du district parent. Si l'adresse informe que l'objet se trouve dans la région d'Omsk, veuillez avoir la gentillesse de rentrer dans sa décharge. L'entrée dans la ville n'est pas obligatoire - toutes les villes ne sont pas couvertes avec précision dans OSM, pour beaucoup, les données ne sont pas mises à jour.
Nous chargeons les polygones de référence depuis OSM et les stockons tels
quels - au format
GeoJSON . Pour choisir le polygone à essayer sur un point, regardez dans un tableau séparé. Dans ce document, nous avons comparé les préfixes des codes CLADR et les ID de polygone: vous trouvez le code CLADR pour l'adresse et vous voyez quel polygone choisir.
Le code KLADR est un identifiant unique utilisé avant la FIAS. Un million de services peuvent trouver ce code pour une adresseL'utilitaire permet à l'objet de se tenir à 1 700 mètres de la décharge. Cette règle a été ajoutée en raison des autoroutes qui dépassent souvent les frontières de la région. Mais une distance supérieure à 1700 mètres est un signe d'erreur, selon les statistiques.
Sur ceci pour les villes et les rues, le contrĂ´le se termine.
Encore une fois, plus strictement, nous vérifions les coordonnées chargées des maisons. L'utilitaire mentionné à nouveau entre en jeu, et c'est ce qu'il fait.
- Il prend l'adresse de la nouvelle maison et trouve des voisins pour lui dans le répertoire de référence.
- Selon les coordonnées, il considère la distance entre la nouvelle maison non vérifiée et les voisins fiables.
Il est facile de trouver des voisins: 1. Nous prenons une nouvelle maison et trouvons l'ID FIAS du parent. 2. Nous sélectionnons dans l'annuaire de référence les maisons dont les parents ont le même identifiant FIASL'inspection est effectuée uniquement à domicile, à moins de 150 mètres de collègues fiables. De plus, nous considérons chaque nouvelle maison approuvée lors de l'analyse des éléments suivants. Voici comment cela fonctionne.
Supposons que, dans le guide de référence, les maisons
n ° 1, 2 et 3 soient stockées le
long de la rue Kommunarov . Dans les nouvelles données, les maisons
n ° 5, 6 et 7 se trouvaient dans la même rue. A en juger par les coordonnées, les nouvelles maisons sont à proximité. L'utilitaire voit que la maison
numéro 5 est à côté des maisons
numéro 1, 2 et 3 et l'ajoute au répertoire de référence. Ainsi, les maisons
numéro 6 et 7 sont également testées.
Et puis le sort des données provenant d'OSM est décidé:
- maisons qui ont passé les deux contrôles: pour les décharges et pour les voisins, nous ajoutons au répertoire de référence;
- si l'objet ne tombe pas dans le polygone, les nouvelles données ne conviennent pas. De même si la distance entre la maison et les voisins est trop grande;
- les maisons qui n'ont pas de voisins, nous reportons. Ils se trouvent dans une base de données distincte, un jour nous analyserons.
Nous divisons les objets testés en deux parties. Ils iront aux différentes plaques de notre manuel de référence.
Dans le premier tableau - tous les objets avec ID FIAS aux maisons: régions, agglomérations, rues. Dans le second - à la maison et un lien vers le parent de la première tableDeux tables sont nécessaires pour attribuer les clés aux maisons manquantes dans FIAS. Ils n'ont pas leur propre code FIAS, alors voici comment:
- nous collectons des objets d'adresse Ă la maison dans une table, chacun d'eux a son propre code FIAS;
- dans le second - uniquement à la maison, en se référant au parent dans le premier tableau.
Ă€ la suite d'un immeuble sans code FIAS, nous identifions l'
ID + le numéro de maison du
parent à l' aide de la clé
FIAS .
La référence est prête, il reste à tester. Nous exécutons un service de test fonctionnel pendant la nuit et testons les performances. Nous vérifions la vitesse à Moscou, en demandant toutes les maisons dans un rayon de trois kilomètres. Pour être sûr. Bien sûr, ils ont tout recouvert d'autotests.
L'essentiel après la mise à jour est de ne pas empirer.
Géocodage inversé à travers les yeux de l'utilisateur
La méthode de saisie prend trois paramètres: coordonnées, nombre de résultats et rayon de recherche. Le rayon par défaut est de 100 mètres, le maximum est d'un kilomètre. La valeur exacte est définie dans les paramètres.
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:
La méthode renvoie les objets trouvés: maisons, rues et habitations. Il les trie par ordre décroissant de précision.
- À la maison.
- Les rues.
- Règlements.
- Les villes
Ensuite, il trie à nouveau - par distance des coordonnées données. Si la méthode a trouvé quatre maisons et une rue, les maisons se tiendront d'abord par ordre de distance d'un point donné. Derrière eux, la rue.
Après tous ces châteaux, la méthode retourne enfin les objets qu'elle a trouvés.
{ "suggestions": [ { "value": " , , 11", "unrestricted_value": " , , 11", "data": {...} }, { "value": " , , 11", "unrestricted_value": " , , 11", "data": {...} } ] }
À l'intérieur - beaucoup de choses différentes sur les objets trouvés: lignes avec l'adresse complète et abrégée, noms actuels et obsolètes, code postal, code FIAS de l'objet parent et ainsi de suite.
Toutes les données fournies par la méthode se trouvent dans la documentationLa couverture par coordonnées pour différentes régions est différente, comme ceci avec les maisons:
- Moscou - 96%,
- Saint-Pétersbourg - 88%,
- autres millions de villes - 74%,
- le reste de la Russie est de 47%.
Et le voici - couvrant les rues:
- Moscou - 92%
- Saint-Pétersbourg - 79%,
- autres villes millionnaires - 75%,
- le reste de la Russie est de 67%.
Ils ne considéraient pas les villes - à l'échelle de la Russie, même le fait d'appartenir au titre fier de la ville était instable. Par exemple, la
région de Yaroslavl, le district de Poshekhonsky, s / o Fedorkovsky est une ville, selon le répertoire officiel de la FIAS. Mais en fait, et à l'adresse - le district rural. Physiquement, le district rural ressemble à l'union de plusieurs villages dans une grande tache. Il est difficile non seulement de déterminer le centre, mais même de trouver la colonie sur la carte.
Nous réfléchissons déjà à ce qu'il faut ajouter à la méthode: permettre le filtrage par type d'objet, renvoyer la distance à un point donné, autre chose. Nous surveillons la demande et décidons d'investir.
Sinon, tout est déjà sur la prod. Jusqu'à 10 000 demandes par jour - gratuitement, plus - par abonnement à partir de 5 000 ₽ par an. Si vous avez besoin d'adresses par coordonnées pour un projet commercial et que Geocoder est trop cher, essayez
l'API Dadati .
L'article original est publié sur le blog HFLabs .