Cómo configurar la búsqueda de direcciones por coordenadas (y dónde obtener el directorio necesario)



En primavera, agregamos la característica "Geocodificación inversa" a la API DaData.ru, que también se llama " Dirección por coordenadas ". El nombre sugiere: el método toma geocoordenadas y proporciona datos sobre la dirección.

Un producto sólido con la misma funcionalidad ofrece Yandex: se llama Geocoder . Pero el servicio Yandex es gratuito solo para proyectos abiertos no comerciales. La tarifa estándar, de 120 000 ₽ por año, no es adecuada para todos.

Pensamos que si realiza una alternativa gratuita o económica a "Geocoder", los desarrolladores probablemente le darán las gracias. Y lo hicieron. En el artículo, le diré cómo funciona la estructura "Dirección por coordenadas": cómo configuramos la búsqueda, armamos un directorio y lo empaquetamos en un método listo para usar.

¿Dónde obtenemos los datos y cómo buscamos la dirección?


Al abordar la tarea, estudiamos soluciones ya preparadas: dónde obtener el directorio de coordenadas con direcciones y cómo buscar objetos geográficos desde este directorio. Resultó que ni siquiera tiene que ir muy lejos para obtener las herramientas adecuadas.

Tomamos los objetos de dirección en FIAS - Sistema de direcciones de información federal . Este es el más completo de los directorios de direcciones abiertos y oficiales. Ya escribimos al respecto en detalle sobre Habré , y ahora cuatro hechos son importantes:

  • FIAS almacena todos los objetos direccionables del país, desde regiones y más abajo, hasta edificios y territorios adicionales;
  • el directorio está disponible gratuitamente en formatos DBF y XML;
  • FIAS no es perfecto: carece de decenas de miles de casas y muchas calles, especialmente nuevas;
  • Cada objeto de dirección en el directorio corresponde a un ID único: código FIAS. El código objeto a veces se cambia, pero para nuestro artículo esto no es tan importante.

Los objetos de dirección descargados de FIAS junto con la ID son la base de nuestro directorio para la geocodificación inversa.

Descargar coordenadas de OpenStreetMap (OSM). OSM es un proyecto con una licencia gratuita: los entusiastas recopilan las coordenadas de varios objetos y las publican para todos.

En términos simples, OSM es un conjunto de puntos, líneas y polígonos en un mapa. Cada objeto tiene su propia descripción, tipo y conjunto de coordenadas. Los datos de OSM para Rusia se encuentran en needgeo.com , osm.sbin.ru/osm_dump/ y osmosis.svimik.com/latest/ .


La lista de fuentes se publica en una página especial en el "Wiki" del proyecto.

La descarga consiste en archivos PBF: este formato se usa en lugar de XML como uno más compacto. Convertir PBF en OSM XML no cuesta nada, un montón de utilidades aprobadas por la comunidad pueden manejar esto.

Para nuestro propio directorio, tomamos los objetos de dirección de FIAS y luego buscamos sus coordenadas en OSM. Si se encuentra, guarde los datos combinados. Resulta una intersección de FIAS y OSM.

Y todo esto es maravilloso, pero hay un problema: las cosas no son fáciles con la calidad de los datos en OSM. Las coordenadas de los objetos a menudo no corresponden a la realidad. Por ejemplo, los polígonos para regiones y distritos son adecuados. Pero para las ciudades y más abajo, no tanto.


Los polígonos son polígonos que delimitan áreas en un mapa. Consisten en un conjunto vinculado de puntos con coordenadas. Los polígonos indican los límites de regiones, distritos, ciudades e incluso edificios.

El trabajo principal, y por un amplio margen, es recopilar datos adecuados de OSM y eliminar el matrimonio. La tarea es tan voluminosa que le dediqué una sección separada en el artículo.

También descargamos casas que no están en FIAS desde OSM. Como dije anteriormente, hay decenas de miles de hogares en FIAS. Esto ni siquiera es un problema, sino simplemente una realidad, un trasfondo. Por lo tanto, reponemos nuestro directorio con casas de OSM. Pero solo aquellos para los que hay una calle en FIAS. Los edificios que provienen de OSM no tienen una identificación FIAS, por lo que los identificamos como el código FIAS + número de casa de los padres .

En el directorio que buscamos con la ayuda de la bella Lucene , nuestra asistente a largo plazo. Gracias por el consejo, a un indio bien versado que escribió la publicación Indexación de datos geográficos con Lucene (una buena adición es el material Ad espacial en algoritmos de búsqueda espacial , sobre los árboles kd en los que se basa el algoritmo de búsqueda ).

Tan pronto como nos enteramos de Lucene, el problema de búsqueda se resolvió casi por sí solo. Los negocios permanecen - ve por papel de lija

  1. Cargamos en Lucene su directorio de coordenadas y direcciones, obtuvimos un índice de búsqueda. Para mayor facilidad, se eliminó casi todo, dejando solo las ID y coordenadas de la dirección.
  2. Configuramos una búsqueda por índice: entrada - coordenadas, salida - ID de los objetos de dirección encontrados. La búsqueda no devuelve otra información, ya que el índice se acortó por completo.
  3. Satisfecho la emisión, cargando datos de las FIAS "grandes" por los ID encontrados. Agregamos mucho de todo, desde la dirección que todos necesitan en una línea hasta el letrero de la capital regional de las ciudades.
  4. Descubrimos cómo ordenar y entregar los objetos recibidos.

Hasta ahora, todo parece simple, pero esto es solo una pequeña parte del trabajo. Ninguna búsqueda de la dirección por coordenadas hubiera funcionado si no hubiéramos compilado un directorio decente.

Cómo recopilar la base de coordenadas y direcciones


Para comenzar, tendré el equipaje: después de leer el artículo, hacer rápidamente tal manual no funciona. Lo hemos estado recolectando desde 2014, completándolo constantemente. Hablaré de este maldito largo camino.

La parte más difícil al compilar un directorio es ordenar las coordenadas que provienen de OSM. Al principio, los verificamos lo mejor que pudimos, incluso con nuestras manos. El objetivo principal era obtener puntos de referencia en las grandes ciudades y hacer una guía de referencia de ellos. Ahora que hay muchos de esos puntos, casi no hay necesidad de verificar manualmente si hay nuevos datos. A la vez, agregamos 200,000-300,000 direcciones con coordenadas al directorio de referencia, y así es como lo hacemos.

Formamos direcciones completas a partir de etiquetas OSM. En las cargas de OSM, las partes componentes de las direcciones están dispersas por diferentes etiquetas:

  • addr: ciudad - pueblo Bulatnikovo ;
  • addr: street - Calle central ;
  • addr: número de vivienda - 103 .

Revisamos las etiquetas y recopilamos la dirección completa de ellos: pueblo de Bulatnikovo, 103 Central Street .

Ejecutamos cada nueva dirección a través de la API de estandarización de Dadat . El servicio convierte las direcciones a un formato único "Me gusta en FIAS":

  • corrige errores tipográficos;
  • decodifica abreviaturas como "NiNo" y "Msk";
  • cambia los nombres antiguos a los nuevos;
  • encuentra la ciudad que falta en la dirección por índice;
  • define un código FIAS.

Las direcciones de la API están limpias, aunque ahora están enviando una carta o un paquete.
Antes de la estandarizaciónDespues
Pueblo Bulatnikovo, Calle Central, 103

142718, región de Moscú, distrito de Leninsky, con Bulatnikovo, Central St., 103.


Código FIAS - a8b6a52f-e96d-4ec3-a0ff-641013ab0445

Almacenamos casas estandarizadas, calles y asentamientos como un punto. Para la calle y el pueblo, este punto es el centro. Como resultado, todos los objetos de dirección están en la misma tabla, en el interior: la dirección, el ID de FIAS, la latitud y la longitud.
La direccionID FIASLatitudLongitud
142718, región de Moscú, distrito de Leninsky, con Bulatnikovo, Central St., 103a8b6a52f-e96d-4ec3-a0ff-641013ab044555.55877337.667103
119034, Moscú, carril Turchaninov, d 6 bldg.28c925e61-9173-48b3-999e-dc85c86d89e755,73709637.597190
Analizamos direcciones que Dadata no estandarizó. Las direcciones que no pueden coincidir con FIAS están marcadas con una bandera por el servicio. Los revisamos manualmente, hay varias opciones.

  1. La dirección no vino en las etiquetas de carga OSM adecuadas, pero el diablo sabe dónde. Etiquetas de dirección cumplidas y no completadas, y la etiqueta de la ciudad en la calle, y mucho más.
  2. En OSM se encuentra un objeto exótico como un parque infantil, un campo de fútbol americano universitario o incluso un cementerio. No hay nada como esto en FIAS, y para nuestros propósitos estos resultados no son adecuados. Tales objetos son simplemente apantallados.
  3. Un error, y no un error en absoluto. Por ejemplo, un distrito de una ciudad que no existe en FIAS proviene de OSM. O en OSM, el objeto se encuentra en un asentamiento, pero en FIAS este asentamiento se adjuntó a la ciudad y se eliminó. Luego terminamos el algoritmo para los datos cargados y lo ejecutamos nuevamente.


Parse descarga, y allí - confusión en las etiquetas

Verificamos cuán adecuadas son las coordenadas cargadas. Para hacer esto, observamos con una utilidad especial si las coordenadas del nuevo objeto caen en el polígono de la región o distrito principal. Si la dirección informa que el objeto se encuentra en la región de Omsk, tenga la amabilidad de entrar en su vertedero. No es necesario ingresar a la ciudad: no todas las ciudades están cubiertas con precisión en OSM, para muchos, los datos no se actualizan.

Cargamos polígonos de referencia desde OSM y lo almacenamos como está, en formato GeoJSON . Para elegir qué polígono probar en un punto, busque en una tabla separada. En él, comparamos los prefijos de los códigos CLADR y las ID de polígono: encuentra el código CLADR para la dirección y ve qué polígono elegir.


El código KLADR es un identificador único que se utilizó antes de FIAS. Un millón de servicios pueden encontrar este código para una dirección

La utilidad permite que el objeto se encuentre a 1.700 metros del vertedero. Esta regla se agregó debido a las carreteras que a menudo van más allá de las fronteras de la región. Pero una distancia mayor a 1,700 metros es una señal de error, según las estadísticas.

En esto para ciudades y calles, el cheque termina.

Una vez más, más estrictamente, verificamos las coordenadas cargadas de las casas. La utilidad mencionada nuevamente entra en juego, y esto es lo que hace.

  1. Toma la dirección de la nueva casa y encuentra vecinos para él en el directorio de referencia.
  2. Según las coordenadas, considera la distancia entre la nueva casa no verificada y los vecinos confiables.


Es fácil encontrar vecinos: 1. Tomamos una casa nueva y encontramos la ID de FIAS del padre. 2. Seleccionamos del directorio de referencia casas cuyos padres tienen la misma ID de FIAS

La inspección se lleva a cabo solo en el hogar, a no más de 150 metros de colegas confiables. Además, consideramos cada nueva casa aprobada cuando analizamos lo siguiente. Así es como funciona.

Supongamos que, en la guía de referencia, las casas No. 1, 2 y 3 están almacenadas a lo largo de la calle Kommunarov . En los nuevos datos llegaron las casas No. 5, 6 y 7 en la misma calle. A juzgar por las coordenadas, las nuevas casas están cerca. La utilidad ve que la casa número 5 está al lado de las casas número 1, 2 y 3 y la agrega al directorio de referencia. Entonces, las casas número 6 y 7 también se están probando.

Y luego se decide el destino de los datos que provienen de OSM:

  • casas que han pasado ambos controles: para vertederos y vecinos, agregamos al directorio de referencia;
  • Si el objeto no cae en el polígono, los nuevos datos no son adecuados. Lo mismo si la distancia entre la casa y los vecinos es demasiado grande;
  • casas que no tienen vecinos, estamos posponiendo. Se encuentran en una base de datos separada, algún día analizaremos.

Dividimos los objetos probados en dos partes. Irán a diferentes platos de nuestro manual de referencia.


En la primera tabla, todos los objetos con identificación FIAS para casas: regiones, asentamientos, calles. En el segundo - en casa y un enlace a los padres desde la primera tabla

Se necesitan dos tablas para asignar claves a las casas que faltan en FIAS. No tienen su propio código FIAS, así que así es como:

  • recopilamos objetos de dirección de la casa en una tabla, cada uno de ellos tiene su propio código FIAS;
  • en el segundo, solo en casa, mientras se refiere al padre en la primera tabla.

Como resultado de un edificio sin un código FIAS, identificamos el ID + número de casa del padre utilizando la clave FIAS .

La referencia está lista, queda por probar. Ejecutamos un servicio de prueba funcional durante la noche y probamos el rendimiento. Verificamos la velocidad en Moscú, solicitando todas las casas en un radio de tres kilómetros. Para estar seguro Por supuesto, superpusieron todo con autotest.

Lo principal después de la actualización es no empeorar.

Geocodificación inversa a través de los ojos del usuario


El método de entrada toma tres parámetros: coordenadas, número de resultados y radio de búsqueda. El radio predeterminado es de 100 metros, el máximo es un kilómetro. El valor exacto se establece en la configuración.

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 

El método devuelve los objetos encontrados: casas, calles y asentamientos. Los ordena en orden descendente de precisión.

  1. En casa
  2. Las calles
  3. Asentamientos
  4. Ciudades

Luego se ordena de nuevo, por distancia desde las coordenadas dadas. Si el método ha encontrado cuatro casas y una calle, las casas se colocarán primero en orden de distancia desde un punto dado. Detrás de ellos está la calle.

Después de todos estos castillos, el método finalmente devuelve los objetos que encontró.

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

En el interior: hay muchas cosas diferentes sobre los objetos encontrados: líneas con la dirección completa y abreviada, nombres actuales y obsoletos, código postal, código FIAS del objeto principal, etc.


Todos los datos que proporciona el método están en la documentación.

La cobertura por coordenadas para diferentes regiones es diferente, como esta con las casas:

  • Moscú - 96%,
  • San Petersburgo - 88%,
  • otras ciudades de más de un millón - 74%,
  • El resto de Rusia es del 47%.

Y aquí está, cubriendo las calles:

  • Moscú - 92%
  • San Petersburgo - 79%,
  • otras ciudades millonarias - 75%,
  • El resto de Rusia es del 67%.

No consideraron las ciudades: en la escala de Rusia, incluso el hecho de pertenecer al orgulloso título de la ciudad era inestable. Por ejemplo, la región de Yaroslavl, el distrito de Poshekhonsky, s / o Fedorkovsky es una ciudad, según el directorio oficial de FIAS. Pero, de hecho, y en la dirección: el distrito rural. Físicamente, el distrito rural se asemeja a la unión de varias aldeas en una gran mancha. Es difícil no solo determinar el centro, sino incluso encontrar el asentamiento en el mapa.

Ya estamos pensando qué agregar al método: permitir el filtrado por tipo de objeto, devolver la distancia a un punto dado, algo más. Monitoreamos la demanda y decidimos si invertir.

De lo contrario, todo ya está en la producción. Hasta 10,000 solicitudes por día, de forma gratuita, más, por suscripción de 5 000 ₽ por año. Si necesita direcciones por coordenadas para un proyecto comercial y Geocoder es demasiado costoso, pruebe la API de Dadati .

El artículo original se publica en el blog de HFLabs .

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


All Articles