So richten Sie die Adressensuche nach Koordinaten ein (und wo erhalten Sie das erforderliche Verzeichnis)



Im Frühjahr haben wir der DaData.ru-API die Funktion "Reverse Geocoding" hinzugefügt, die auch als " Address by Coordinates " bezeichnet wird. Der Name weist darauf hin: Die Methode verwendet Geokoordinaten und gibt Daten über die Adresse an.

Ein solides Produkt mit der gleichen Funktionalität bietet Yandex - es heißt Geocoder . Der Yandex-Service ist jedoch nur für offene nichtkommerzielle Projekte kostenlos. Der Standardtarif - ab 120 000 ₽ pro Jahr - ist nicht für jeden geeignet.

Wir dachten - wenn Sie eine kostenlose oder kostengünstige Alternative zu "Geocoder" machen, werden sich die Entwickler wahrscheinlich bedanken. Und sie taten es. In dem Artikel werde ich Ihnen erklären, wie die Struktur "Adresse nach Koordinaten" funktioniert: Wie wir die Suche einrichten, ein Verzeichnis zusammenstellen und es in eine vorgefertigte Methode packen.

Woher bekommen wir die Daten und wie suchen wir die Adresse


Als wir uns der Aufgabe näherten, untersuchten wir vorgefertigte Lösungen: Woher kommt das Koordinatenverzeichnis mit den Adressen und wie wird dann aus diesem Verzeichnis nach geografischen Objekten gesucht? Es stellte sich heraus, dass Sie nicht einmal weit gehen müssen, um die richtigen Werkzeuge zu finden.

Wir nehmen die Adressobjekte in FIAS - Federal Information Address System . Dies ist das umfassendste der offenen und offiziellen Adressverzeichnisse. Wir haben bereits ausführlich über Habré darüber geschrieben , und jetzt sind vier Fakten wichtig:

  • FIAS speichert alle adressierbaren Objekte des Landes, von Regionen und darunter - bis hin zu Gebäuden und zusätzlichen Gebieten;
  • Das Verzeichnis ist in den Formaten DBF und XML frei verfügbar.
  • FIAS ist nicht perfekt - es fehlen Zehntausende von Häusern und viele Straßen, insbesondere neue;
  • Jedes Adressobjekt im Verzeichnis entspricht einer eindeutigen ID - FIAS-Code. Der Objektcode wird manchmal geändert, aber für unseren Artikel ist dies nicht so wichtig.

Von FIAS heruntergeladene Adressobjekte bilden zusammen mit der ID die Grundlage unseres Verzeichnisses für die umgekehrte Geokodierung.

Laden Sie die Koordinaten von OpenStreetMap (OSM) herunter. OSM ist ein Projekt mit einer kostenlosen Lizenz: Enthusiasten sammeln die Koordinaten verschiedener Objekte und veröffentlichen sie an alle.

In einfachen Worten ist OSM eine Reihe von Punkten, Linien und Polygonen auf einer Karte. Jedes Objekt hat eine eigene Beschreibung, einen eigenen Typ und einen eigenen Satz von Koordinaten. OSM-Daten für Russland finden Sie unter needgeo.com , osm.sbin.ru/osm_dump/ und osmosis.svimik.com/latest/ .


Die Liste der Quellen wird auf einer speziellen Seite im „Wiki“ des Projekts veröffentlicht.

Das Entladen besteht aus PBF-Dateien - dieses Format wird anstelle von XML als kompakteres verwendet. Die Umwandlung von PBF in OSM-XML kostet nichts. Eine Reihe von von der Community genehmigten Dienstprogrammen kann damit umgehen.

Für unser eigenes Verzeichnis nehmen wir die Adressobjekte von FIAS und suchen dann in OSM nach ihren Koordinaten. Wenn gefunden, speichern Sie die kombinierten Daten. Es stellt sich heraus, dass FIAS und OSM eine solche Schnittstelle bilden.

Und das alles ist wunderbar, aber es gibt ein Problem: Die Qualität der Daten in OSM ist nicht einfach. Die Koordinaten von Objekten entsprechen oft nicht der Realität. Beispielsweise sind Polygone für Regionen und Bezirke ausreichend. Aber für Städte und darunter - nicht so sehr.


Polygone sind Polygone, die Bereiche auf einer Karte begrenzen. Sie bestehen aus einem verknüpften Satz von Punkten mit Koordinaten. Polygone geben die Grenzen von Regionen, Bezirken, Städten und sogar Gebäuden an

Die Hauptaufgabe besteht bei weitem darin, angemessene Daten von OSM zu sammeln und die Ehe auszusortieren. Die Aufgabe ist so umfangreich, dass ich ihr im Artikel einen eigenen Abschnitt gewidmet habe.

Wir laden auch Häuser, die nicht in FIAS sind, von OSM herunter. Wie ich oben sagte, gibt es in FIAS Zehntausende von Häusern. Dies ist nicht einmal ein Problem, sondern einfach eine Realität, ein Hintergrund. Daher füllen wir unser Verzeichnis mit Häusern von OSM auf. Aber nur diejenigen, für die es in FIAS eine Straße gibt. Die Gebäude, die von OSM stammen, haben keine FIAS-ID, daher identifizieren wir sie als FIAS-Code + Hausnummer der Eltern .

Im Verzeichnis suchen wir mit Hilfe der schönen Lucene - unserer langjährigen Assistentin. Vielen Dank für den Tipp an einen versierten Inder, der den Beitrag Indizieren geografischer Daten mit Lucene geschrieben hat (eine gute Ergänzung ist das Material Ad Spatial in räumliche Suchalgorithmen - über die kd-Bäume, auf denen der Suchalgorithmus basiert).

Sobald wir von Lucene erfahren hatten, war das Suchproblem fast von selbst gelöst. Das Geschäft bleibt bestehen - Sandpapier.

  1. Wir haben in Lucene Ihr Verzeichnis mit Koordinaten und Adressen geladen und einen Suchindex erhalten. Der Einfachheit halber wurde fast alles entfernt, wobei nur die Adress-IDs und Koordinaten übrig blieben.
  2. Wir richten eine Suche nach Index ein: Eingabe - Koordinaten, Ausgabe - ID der gefundenen Adressobjekte. Die Suche gibt keine anderen Informationen zurück, da der Index vollständig gekürzt wurde.
  3. Befriedigte die Ausgabe und lud Daten aus dem "großen" FIAS durch die gefundenen IDs. Wir fügen viel von allem hinzu, von der Adresse, die jeder in einer Zeile benötigt, bis zum Zeichen der regionalen Hauptstadt der Städte.
  4. Wir haben herausgefunden, wie man die empfangenen Objekte sortiert und gibt.

Bisher sieht alles einfach aus, aber das ist nur ein kleiner Teil der Arbeit. Keine Suche nach der Adresse nach Koordinaten hätte funktioniert, wenn wir kein anständiges Verzeichnis zusammengestellt hätten.

So sammeln Sie die Basis von Koordinaten und Adressen


Zunächst lege ich das Gepäck aus: Nach dem Lesen des Artikels funktioniert ein solches Handbuch schnell nicht. Wir sammeln es seit 2014 und ergänzen es ständig. Ich werde über diesen verdammt langen Weg sprechen.

Der schwierigste Teil beim Kompilieren eines Verzeichnisses besteht darin, die von OSM stammenden Koordinaten zu sortieren. Zu Beginn haben wir sie so gut wie möglich überprüft, auch mit unseren Händen. Das Hauptziel war es dann, Referenzpunkte in Großstädten zu erhalten und daraus einen Referenzleitfaden zu erstellen. Da es viele solcher Punkte gibt, ist es fast nicht mehr erforderlich, manuell nach neuen Daten zu suchen. Wir fügen dem Referenzverzeichnis jeweils 200.000 bis 300.000 Adressen mit Koordinaten hinzu. So gehen wir vor.

Wir bilden vollständige Adressen aus OSM-Tags. Bei OSM-Uploads werden die Bestandteile von Adressen durch verschiedene Tags verteilt:

  • Adresse: Stadt - Dorf Bulatnikovo ;
  • Adresse: Straße - Hauptstraße ;
  • Adresse: Hausnummer - 103 .

Wir gehen die Tags durch und sammeln die vollständige Adresse von ihnen: Bulatnikovo Village, 103 Central Street .

Wir führen jede neue Adresse über die Dadat-Standardisierungs-API aus . Der Dienst konvertiert Adressen in ein einziges Format "Wie in FIAS":

  • korrigiert Tippfehler;
  • dekodiert Abkürzungen wie "NiNo" und "Msk";
  • ändert alte Namen in neue;
  • findet die fehlende Stadt in der Adresse nach Index;
  • definiert einen FIAS-Code.

Die Adressen von der API sind sauber, obwohl sie jetzt einen Brief oder ein Paket senden.
Vor der StandardisierungNachher
Bulatnikovo Dorf, Central Street, 103

142718, Region Moskau, Bezirk Leninsky, mit Bulatnikovo, Central St., 103.


FIAS-Code - a8b6a52f-e96d-4ec3-a0ff-641013ab0445

Wir speichern standardisierte Häuser, Straßen und Siedlungen als einen Punkt. Für die Straße und das Dorf ist dieser Punkt das Zentrum. Infolgedessen befinden sich alle Adressobjekte in derselben Tabelle - Adresse, FIAS-ID, Breite und Länge.
Die AdresseFIAS IDBreitengradLängengrad
142718, Region Moskau, Bezirk Leninsky, mit Bulatnikovo, Central St., 103a8b6a52f-e96d-4ec3-a0ff-641013ab044555.55877337.667103
119034, Moskau, Gasse Turchaninov, d 6 Gebäude 28c925e61-9173-48b3-999e-dc85c86d89e755.73709637.597190
Wir analysieren Adressen, die Dadata nicht standardisiert hat. Adressen, die nicht mit FIAS übereinstimmen konnten, werden vom Dienst mit einem Flag gekennzeichnet. Wir überprüfen sie manuell, es gibt verschiedene Möglichkeiten.

  1. Die Adresse kam nicht in den richtigen OSM-Upload-Tags, aber der Teufel weiß wo. Erfüllte und nicht ausgefüllte Adressschilder und die Stadt auf der Straße und vieles mehr.
  2. In OSM liegt ein exotisches Objekt wie ein Spielplatz, ein College-Football-Feld oder sogar ein Friedhof. In FIAS gibt es nichts Vergleichbares, und für unsere Zwecke sind diese Ergebnisse nicht geeignet. Solche Objekte werden einfach ausgesiebt.
  3. Ein Fehler - und überhaupt kein Fehler. Beispielsweise stammte ein Stadtteil, der in FIAS nicht existiert, von OSM. Oder in OSM befindet sich das Objekt in einer Siedlung, aber in FIAS wurde diese Siedlung an die Stadt angehängt und entfernt. Dann beenden wir den Algorithmus für die geladenen Daten und führen ihn erneut aus.


Analysieren Sie das Entladen und dort - Verwirrung in Tags

Wir prüfen, wie ausreichend die geladenen Koordinaten sind. Dazu prüfen wir mit einem besonderen Dienstprogramm, ob die Koordinaten des neuen Objekts in das Polygon der übergeordneten Region oder des übergeordneten Distrikts fallen. Wenn die Adresse mitteilt, dass sich das Objekt in der Region Omsk befindet, seien Sie bitte so freundlich, auf die Deponie zu gelangen. Der Eintritt in die Stadt ist nicht erforderlich - nicht alle Städte werden in OSM genau abgedeckt, für viele werden die Daten nicht aktualisiert.

Wir laden Referenzpolygone aus OSM und speichern sie unverändert im GeoJSON- Format. Um auszuwählen, welches Polygon an einem Punkt ausprobiert werden soll, schauen Sie in eine separate Tabelle. Darin haben wir die Präfixe der CLADR-Codes und der Polygon-IDs verglichen: Sie finden den CLADR-Code für die Adresse und sehen, welches Polygon Sie auswählen müssen.


Der KLADR-Code ist eine eindeutige Kennung, die vor dem FIAS verwendet wurde. Eine Million Dienste können diesen Code für eine Adresse finden

Das Dienstprogramm ermöglicht es dem Objekt, 1.700 Meter von der Deponie entfernt zu stehen. Diese Regel wurde aufgrund von Autobahnen hinzugefügt, die häufig über die Grenzen der Region hinausgehen. Eine Entfernung von mehr als 1.700 Metern ist laut Statistik ein Zeichen für einen Fehler.

Damit endet für Städte und Straßen die Prüfung.

Noch einmal, strenger, überprüfen wir die geladenen Koordinaten der Häuser. Das wieder erwähnte Dienstprogramm kommt ins Spiel, und genau das tut es.

  1. Er nimmt die Adresse des neuen Hauses und findet im Referenzverzeichnis Nachbarn für ihn.
  2. Gemäß den Koordinaten wird die Entfernung zwischen dem nicht überprüften neuen Haus und zuverlässigen Nachbarn berücksichtigt.


Es ist einfach, Nachbarn zu finden: 1. Wir nehmen ein neues Haus und finden die FIAS-ID des Elternteils. 2. Wir wählen aus dem Referenzverzeichnis Häuser aus, deren Eltern dieselbe FIAS-ID haben

Die Inspektion wird nur zu Hause durchgeführt, nicht mehr als 150 Meter von zuverlässigen Kollegen entfernt. Darüber hinaus berücksichtigen wir jedes neue genehmigte Haus bei der Analyse der folgenden Punkte. So funktioniert es

Angenommen, im Referenzhandbuch sind die Häuser Nr. 1, 2 und 3 entlang der Kommunarov-Straße gelagert. In den neuen Daten kamen die Häuser Nr. 5, 6 und 7 in derselben Straße. Nach den Koordinaten zu urteilen, sind die neuen Häuser in der Nähe. Das Dienstprogramm erkennt, dass sich Hausnummer 5 neben Hausnummer 1, 2 und 3 befindet, und fügt es dem Referenzverzeichnis hinzu. Daher werden auch die Häuser 6 und 7 getestet.

Und dann wird das Schicksal der Daten entschieden, die von OSM stammen:

  • Häuser, die beide Prüfungen bestanden haben: Für Deponien und für Nachbarn fügen wir dem Referenzverzeichnis hinzu;
  • Wenn das Objekt nicht in das Polygon fällt, sind die neuen Daten nicht geeignet. Das gleiche, wenn der Abstand zwischen dem Haus und den Nachbarn zu groß ist;
  • Häuser, die keine Nachbarn haben, verschieben wir. Sie liegen in einer separaten Datenbank, die wir eines Tages analysieren werden.

Wir teilen die getesteten Objekte in zwei Teile. Sie werden zu verschiedenen Tafeln unseres Referenzhandbuchs gehen.


In der ersten Tabelle alle Objekte mit FIAS-ID für Häuser: Regionen, Siedlungen, Straßen. Im zweiten - zu Hause und ein Link zum Elternteil aus der ersten Tabelle

Es werden zwei Tabellen benötigt, um Schlüssel für Häuser zuzuweisen, die in FIAS fehlen. Sie haben keinen eigenen FIAS-Code. So geht's:

  • Wir sammeln Adressobjekte für das Haus in einer Tabelle, von denen jede ihren eigenen FIAS-Code hat.
  • in der zweiten - nur zu Hause, unter Bezugnahme auf die Eltern in der ersten Tabelle.

Als Ergebnis eines Gebäudes ohne FIAS-Code identifizieren wir die ID + Hausnummer des Elternteils mit dem FIAS- Schlüssel.

Die Referenz ist fertig, es bleibt zu testen. Wir führen über Nacht einen Funktionstestservice durch und testen die Leistung. Wir überprüfen die Geschwindigkeit in Moskau und fordern alle Häuser im Umkreis von drei Kilometern an. Um sicher zu sein. Natürlich haben sie alles mit Autotests überlagert.

Die Hauptsache nach dem Update ist, nicht schlechter zu werden.

Umgekehrte Geokodierung mit den Augen des Benutzers


Die Eingabemethode verwendet drei Parameter: Koordinaten, Anzahl der Ergebnisse und Suchradius. Der Standardradius beträgt 100 Meter, das Maximum ist ein Kilometer. Der genaue Wert wird in den Einstellungen eingestellt.

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://suggestions.dadata.ru/suggestions/api/4_1/rs/geolocate/address 

Die Methode gibt die gefundenen Objekte zurück: Häuser, Straßen und Siedlungen. Es sortiert sie in absteigender Reihenfolge der Genauigkeit.

  1. Zu Hause.
  2. Die Straßen.
  3. Siedlungen.
  4. Städte

Dann sortiert es erneut - nach Abstand von den angegebenen Koordinaten. Wenn die Methode vier Häuser und eine Straße gefunden hat, stehen die Häuser zunächst in der Reihenfolge der Entfernung von einem bestimmten Punkt. Hinter ihnen ist die Straße.

Nach all diesen Burgen gibt die Methode schließlich die gefundenen Objekte zurück.

 { "suggestions": [ { "value": " ,  ,  11", "unrestricted_value": " ,  ,  11", "data": {...} }, { "value": " ,  ,  11", "unrestricted_value": " ,  ,  11", "data": {...} } ] } 

Im Inneren - viele verschiedene Dinge über die gefundenen Objekte: Zeilen mit der vollständigen und abgekürzten Adresse, aktuellen und veralteten Namen, Postleitzahl, FIAS-Code des übergeordneten Objekts und so weiter.


Alle von der Methode angegebenen Daten befinden sich in der Dokumentation

Die Abdeckung durch Koordinaten für verschiedene Regionen ist unterschiedlich, wie bei Häusern:

  • Moskau - 96%,
  • St. Petersburg - 88%,
  • andere mehr als eine Million Städte - 74%,
  • der Rest von Russland ist 47%.

Und hier ist es - auf den Straßen:

  • Moskau - 92%
  • St. Petersburg - 79%,
  • andere Millionärsstädte - 75%,
  • der Rest von Russland ist 67%.

Sie haben die Städte nicht berücksichtigt - auf der Skala Russlands war sogar die Tatsache, zum stolzen Titel der Stadt zu gehören, unbeständig. Zum Beispiel ist die Region Jaroslawl, Bezirk Poshekhonsky, s / o Fedorkovsky , laut dem offiziellen FIAS-Verzeichnis eine Stadt. Aber in der Tat und an der Adresse - dem Landkreis. Physisch ähnelt der Landkreis der Vereinigung mehrerer Dörfer in einem großen Fleck. Es ist schwierig, nicht nur das Zentrum zu bestimmen, sondern auch die Siedlung auf der Karte zu finden.

Wir überlegen bereits, was wir der Methode hinzufügen sollen: Filtern nach Objekttyp zulassen, Entfernung zu einem bestimmten Punkt zurückgeben, etwas anderes. Wir überwachen die Nachfrage und entscheiden, ob wir investieren.

Ansonsten ist schon alles auf dem Prod. Bis zu 10.000 Anfragen pro Tag - kostenlos, mehr - im Abonnement ab 5.000 ₽ pro Jahr. Wenn Sie Adressen nach Koordinaten für ein kommerzielles Projekt benötigen und Geocoder zu teuer ist, probieren Sie die Dadati-API aus .

Der Originalartikel wird im HFLabs-Blog veröffentlicht .

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


All Articles