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