¿Quién vive bien en Rusia? Cómo buscamos la ciudad más verde usando OpenStreetMap y la API Overpass

Cada tarjeta tiene una leyenda: es ella quien le dice al lector qué se indica en ella y cómo. Las casas corresponden a polígonos grises, carreteras: segmentos y curvas, parques y plazas se llenan de verde claro y están decorados con un pictograma de árbol. Y a algunos mapas agregan una aplicación útil: una lista de estas mismas carreteras con su longitud, la cantidad de parques, tiendas y botes de basura.



Cuando nos preparábamos para automatizar el trabajo de los servicios municipales locales, llamamos la atención sobre el uso de la cartografía, que nos pareció una herramienta realmente poderosa y eficaz para resolver una amplia gama de tareas. En el mapa, puede mostrar información actualizada sobre la ubicación de los objetos, las rutas de movimiento del equipo de cosecha, el transporte, un plan de trabajo y un mapa de calor con áreas problemáticas y "saludables".



El uso de la cartografía en general ayuda a acelerar el tiempo de reacción y la toma de decisiones sobre asuntos urgentes, simplifica el proceso de planificación y previsión y, lo más importante, toda la información está disponible en la forma más visual.



Mientras trabajábamos con uno de los clientes, nos enfrentamos a una tarea interesante: calcular la cantidad de objetos en el mapa por categoría.



Encontrar



Determine la ciudad "más verde" del Distrito Federal Central mediante la combinación de los siguientes datos: el número de tiendas, basureros y parques.



Dado



Cartografía. Elegimos OpenStreetMap (en adelante, OSM ) como trampolín por una razón muy simple: Open Source.



Decisión



Hay varios enfoques para resolver este problema. Por ejemplo, podemos usar PostgreSQL para consultar la base de datos de OSM y recuperar los datos necesarios, o usar QGIS, un sistema para crear, analizar y publicar información geoespacial. Sin embargo, encontramos una forma más elegante y eficiente: Overpass API .



Overpass API es una poderosa herramienta para extraer datos de la base de datos de OSM a petición del usuario. Está optimizado para tareas de cualquier escala: desde recuperar varios elementos de una base de datos hasta cientos de millones de objetos que se seleccionan según una solicitud en forma de XML o Overpass QL, una versión mejorada de Overpass XML. Lea más sobre la API Overpass aquí .
Empecemos desde cero: en primer lugar, debe implementar OSM en el servidor. Ubuntu se utiliza como sistema operativo en nuestra máquina.



P: ¿Por qué implementar su OSM?

R: Para trabajar con datos, necesitamos la API Overpass, cuyo servidor público tiene un límite en la cantidad de solicitudes por día. Es por esta razón que implementaremos nuestro servidor con OSM blackjack y Overpass API.

Las instrucciones detalladas para instalar OSM están aquí .
El siguiente paso es instalar la API Overpass; su última versión se puede encontrar aquí .



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


Después de la instalación, deberá completar: crear una base de datos. No necesitamos una base de datos de todo el mundo, por lo que utilizaremos el servicio Geofabrik , que nos permite obtener datos para las regiones administrativas especificadas.

Una alternativa digna a Geofabrik es BBBike .



Descargamos y descomprimimos la base de datos descargada del directorio Europa> Federación de Rusia> Distrito Federal Central en formato .osm.bz2, de la siguiente manera:

PATH_TO_INIT_OSM3S.SH PATH_TO_FILE_BZ2 PATH_WERE_Unpack_OVERPASS_API DIRECTORY

Nota: en este caso, todas las acciones se realizan en el directorio de paso elevado .



Entonces, la plataforma está casi lista, ahora podemos hacer nuestra primera solicitud y averiguar la cantidad de parques en toda la región.

PATH_TO_OSM3S_QUERY --db-dir = RUTA_A_DB


Nuestra solicitud y respuesta se ve así:



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"
  }
}

  ]
}


Ya estamos cerca: solo queda dividir los parques por regiones y ciudades. Un Dispatcher que se ejecute por separado y en constante ejecución nos ayudará a hacer frente a esta tarea .



Lanzamos la API y agregamos Listen PORT en el directorio /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


Comprobando la configuración. Debe tener un aspecto como este.



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


A continuación, encendemos el nuevo host y enviamos el antiguo a descansar.



sudo a2ensite .conf
sudo a2dissite 000-default.conf
sudo a2dissite __.conf
sudo service apache2 reload


Ahora es el momento de habilitar el primer Dispatcher que manejará nuestras solicitudes. Para hacer esto, usaremos el comando.



nohup __OVERPASS_API/bin/dispatcher --osm-base --db-dir=__DB --meta &


La primera señal de que todo salió según lo planeado es la creación del archivo

osm3s_OVERPASS_API_VERSION_osm_base en el directorio de la base de datos. El archivo nohup.out muestra un mensaje de estado Dispatcher - dispatcher acaba de comenzar .



Sin embargo, el trabajo no termina ahí: debe iniciar otro Dispatcher. Primero, copie la carpeta de reglas en el directorio con la base de datos y distribuya los derechos a las áreas de osm3s_OVERPASS_API_VERSION_areas resultantes .




nohup __OVERPASS_API/bin/dispatcher --areas --db-dir=__DB &

chmod 666 "../db/osm3s_OVERPASS_API__areas"
nohup __OVERPASS_API/bin/rules_loop.sh __DB &


Ahora podemos hacer una solicitud para la región y calcular el número de parques en Ryazan. Y por cierto, esto ya funciona en la barra de direcciones del navegador.



http://localhost:/api/interpreter?data=[output:json][timeout:25]; area[name=""]->.searchArea; ( nwr["leisure"="park"](area.searchArea); ); out count;


¡Respuesta tan esperada!



"elements": [

{
  "type": "count",
  "id": 0,
  "tags": {
    "nodes": "0",
    "ways": "57",
    "relations": "11",
    "areas": "0",
    "total": "68"
  }
}

  ]
}


Entonces, ahora podemos sumergirnos en temas de análisis y mejora: encontraremos la cantidad de parques, tiendas y botes de basura en 25 grandes ciudades del Distrito Federal Central y compararemos estos indicadores utilizando las herramientas analíticas de la plataforma ODANT .

ODANT es una plataforma de integración digital de fabricación rusa diseñada para construir sistemas de información de diversa complejidad y distribución. Lea más sobre ODANT aquí .
Así son nuestros parámetros de búsqueda de contenedores de basura: en el marco de la tarea, no distinguimos entre sitios de contenedores, contenedores de basura independientes y puntos de recolección de residuos sólidos.




nwr["amenity"="recycling"](area.searchArea);
nwr["amenity"="waste_disposal"](area.searchArea);
nwr["amenity"="waste_basket"](area.searchArea);


Exportamos la salida de ODANT como una tabla plana.



Ciudad



Urnas



Población



Población / Urnas



Vladimir



1525



356937



234



Krasnogorsk



274



175554



641



Kaluga



376



332039



883



Tambov



279



292140



1047



Moscú



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



Riazán



118



539290



4570



Korolev



49



224348



4579



Tula



101



475161



4705



Elektrostal



32



156026



4876







En esta clasificación, la ciudad de Vladimir ocupa la honorable primera línea: solo hay 234 personas para un lugar de acumulación de basura. Utilizando las herramientas ODANT integradas, creamos dos gráficos divertidos.











Pasemos al siguiente elemento: bancos.



nwr["amenity"="bench"](area.searchArea);


Obtenemos el siguiente resultado en forma de tabla.



Ciudad



Bancos



Población



Población / comercios



Vladimir



593



356937



602



Tambov



413



292140



707



Moscú



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





Y nuevamente Vladimir resultó ser el más cómodo de todos los contendientes: no será posible colocar a 602 personas en un banco, pero en Mytishchi se está librando una lucha mucho más feroz por los lugares. Sin embargo, siempre puedes establecer un horario.



Visualizamos nuestros resultados.











Pasemos a la parte más interesante: calcular la superficie de los parques. Podemos usar varios métodos para resolver este problema, pero el código más abierto y maravilloso que encontramos es la biblioteca de folletos . En la consulta en sí, debe reemplazar out count con out geom, lo que nos dará las coordenadas de las regiones como resultado.

Leaflet es una biblioteca de JavaScript de código abierto para mostrar mapas en sitios web. Admite la mayoría de las plataformas móviles y de escritorio que admiten HTML5 y CSS3. Leaflet permite a un desarrollador no familiarizado con GIS mostrar fácilmente mapas ráster formados por pequeños mosaicos, posiblemente con capas adicionales superpuestas sobre la principal. Lea más sobre el folleto aquí .


Creemos un polígono.



const polygon = L.polygon().addTo(map);
const area = L.GeometryUtil.geodesicArea(polygon.getLatLngs());


Ahora el área contiene el área de la región en m2. Extraemos los datos de las ciudades que seleccionamos y obtenemos la siguiente tabla.



Ciudad



Área total del parque (km2)



Área de la ciudad (km2)



Porcentaje de espacio ocupado por parques



Cant.

parques



Zelenograd



4.13



37.199



0,111



26



Kaluga



12.60



168,8



0,075



140



Moscú



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



Riazán



4.32



224.163



0,019



96



Yaroslavl



3,68



205,8



0,018



176



Korolev



0,97



55,47



0,017



treinta



Kursk



3.31



208,2



0,016



862



Kolomna



1.03



65,1



0,016



21



Mytishchi



0,53



34,59



0,015



treinta



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



once



Rybinsk



0,65



101,42



0,006



62



Elektrostal



0,25



51,45



0,005



52





Según OSM, Zelenograd justifica plenamente su nombre: el 11% del área de la ciudad está ocupada por áreas verdes. Obtengamos la relación entre el número de residentes y el número de parques.



Ciudad



Superficie total de parques (m2)



Cantidad de m2 de parques por residente



Número de habitantes por 1 parque



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



Moscú



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



Riazán



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





Presentemos los datos en forma de gráficos.











Y en la final, la calificación de las ciudades, calculada por los lugares ocupados.



Ciudad



Clasificación



Un lugar



Vladimir



12



1



Kaluga



quince



2



Moscú



Dieciocho



3



Zelenograd



21



4



Tambov



23



cinco



Krasnogorsk



35



6



Balashikha



39



7



Lyubertsy



45



8



Khimki



46



nueve



Kursk



47



diez



Kolomna



48



once



Kostroma



50



12



Voronezh



52



trece



Podolsk



55



catorce



Tula



55



quince



Riazán



61



dieciséis



Tver



63



17



Yaroslavl



63



Dieciocho



Murom



69



19



Rybinsk



69



20



Lipetsk



70



21



Korolev



75



22



Mytishchi



75



23



Elektrostal



94



24





Epílogo y conclusiones



Por decisión del panel de jueces compuesto por OpenStreetMap, Overpass API y ODANT,

Vladimir toma el honorable primer lugar y recibe el título de “El más verde del Distrito Federal Central”.



Cabe destacar el siguiente hecho: nuestra investigación se basó exclusivamente en datos reflejados en OSM. Naturalmente, en Mytishchi hay un par de cientos de bancos más, y en Tula hay muchos más lugares para la acumulación de desechos. Nuestros resultados se pueden ver desde el otro lado, por ejemplo, para evaluar la dinámica de agregar objetos de infraestructura urbana a la base de datos de OSM. Sin embargo, en promedio, las personas son "igualmente lentas" para ingresar datos en OSM, por lo que podemos suponer que los datos son relativamente confiables y vale la pena considerarlos.



Logramos resolver el problema y encontrar una forma efectiva de trabajar con objetos en mapas OSM: resultó ser una combinación de Overpass API y Leaflet. Con la ayuda de este conjunto de herramientas, podemos realizar consultas a la base de datos de OSM y recibir datos sobre la cantidad de objetos, calcular las áreas de áreas. Para la presentación y el análisis de datos, creamos una solución basada en web basada en ODANT que cubrió todas nuestras necesidades.



Hay una gran cantidad de industrias, negocios y economía a las que esta solución podría ayudar. Si tiene alguna idea o comentario, sería muy bueno discutirlo. Pasamos 28 horas limpias en la tarea, es posible que pueda hacerlo más rápido.



Desarrollador líder de frontend, Infostandard - Daniel Epifanov.

Editor, Infostandard - Nikita Morozov.



All Articles