Quando nos preparávamos para automatizar o trabalho dos serviços municipais locais, chamamos a atenção para o uso da cartografia, que consideramos uma ferramenta realmente poderosa e eficaz para resolver um amplo conjunto de tarefas. No mapa, é possível visualizar informações atualizadas sobre a localização dos objetos, rotas de movimentação dos equipamentos de colheita, transporte, um plano de trabalho e um mapa térmico com áreas problemáticas e “saudáveis”.
O uso da cartografia em geral ajuda a agilizar o tempo de reação e tomada de decisão em questões urgentes, simplifica o processo de planejamento e previsão e, o mais importante, todas as informações estão disponíveis na forma mais visual.
Ao trabalhar com um dos clientes, enfrentamos uma tarefa interessante - calcular o número de objetos no mapa por categoria.
Encontrar
Determine a cidade “mais verde” do Distrito Federal Central pela combinação dos seguintes dados: número de lojas, lixeiras e parques.
Dado
Cartografia. Escolhemos o OpenStreetMap (doravante - OSM ) como um trampolim por uma razão muito simples - Open Source.
Decisão
Existem várias abordagens para resolver esse problema. Por exemplo, podemos usar PostgreSQL para consultar o banco de dados OSM e recuperar os dados necessários ou usar QGIS, um sistema para criar, analisar e publicar informações geoespaciais. No entanto, encontramos uma forma mais elegante e eficiente - Overpass API .
Overpass API é uma ferramenta poderosa para extrair dados do banco de dados OSM a pedido do usuário. É otimizado para tarefas de qualquer escala: desde a recuperação de vários elementos de um banco de dados até centenas de milhões de objetos que são selecionados de acordo com a solicitação na forma de XML ou Overpass QL - uma versão atualizada do Overpass XML. Leia mais sobre a API Overpass aqui .Vamos começar do zero: primeiro de tudo, você precisa implantar o OSM no servidor. Ubuntu é usado como sistema operacional em nossa máquina.
P: Por que implantar seu OSM?
R: Para trabalhar com dados, precisamos da API Overpass, cujo servidor público tem um limite para o número de solicitações por dia. É por esta razão que implementaremos nosso servidor com
As instruções detalhadas para instalar o OSM estão aqui .A próxima etapa é instalar a API Overpass - sua versão mais recente pode ser encontrada aqui .
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
Após a instalação, você precisará preencher - criar um banco de dados. Não necessitamos de uma base de dados de todo o mundo, por isso utilizaremos o serviço Geofabrik , que nos permite obter dados para as regiões administrativas especificadas.
Uma alternativa válida para a Geofabrik é a BBBike .
Baixamos e descompactamos o banco de dados baixado do diretório Europa> Federação Russa> Distrito Federal Central no formato .osm.bz2, da seguinte maneira:
PATH_To_INIT_OSM3S.SH PATH_TO_FILE_BZ2 PATH_WERE_Unpack_OVERPASS_API DIRECTORY
Nota: neste caso, todas as ações são realizadas no diretório overpass .
Então, a plataforma está quase pronta - agora podemos fazer nosso primeiro pedido e saber a quantidade de parques em toda a região.
PATH_TO_OSM3S_QUERY --db-dir = PATH_To_DB
Nossa solicitação e resposta tem a seguinte aparência:
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"
}
}
]
}
Já estamos perto: falta dividir os parques por regiões e cidades. Um Dispatcher em execução separada e constante nos ajudará a lidar com essa tarefa .
Lançamos a API e adicionamos Listen PORT no diretório /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
Verificando a configuração. Deve ser assim.
<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>
Em seguida, ligamos o novo host e enviamos o antigo para descansar.
sudo a2ensite .conf
sudo a2dissite 000-default.conf
sudo a2dissite __.conf
sudo service apache2 reload
Agora é a hora de habilitar o primeiro Dispatcher que tratará de nossas solicitações. Para fazer isso, usaremos o comando.
nohup __OVERPASS_API/bin/dispatcher --osm-base --db-dir=__DB --meta &
O primeiro sinal de que tudo correu conforme o planejado é a criação do arquivo
osm3s_OVERPASS_API_VERSION_osm_base no diretório do banco de dados. O arquivo nohup.out exibe uma mensagem de status Dispatcher - dispatcher acabou de iniciar .
No entanto, o trabalho não termina aí: você precisa iniciar outro Dispatcher. Primeiro, copie a pasta de regras para o diretório com o banco de dados e distribua os direitos para os 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 &
Agora podemos fazer um pedido para a região e calcular o número de parques em Ryazan. E por falar nisso, isso já funciona na barra de endereços do navegador.
http://localhost:/api/interpreter?data=[output:json][timeout:25]; area[name=""]->.searchArea; ( nwr["leisure"="park"](area.searchArea); ); out count;
Resposta esperada!
"elements": [
{
"type": "count",
"id": 0,
"tags": {
"nodes": "0",
"ways": "57",
"relations": "11",
"areas": "0",
"total": "68"
}
}
]
}
Então, agora podemos mergulhar nas questões de análise e melhoria: vamos encontrar o número de parques, lojas e latas de lixo em 25 grandes cidades do Distrito Federal Central e comparar esses indicadores usando as ferramentas analíticas da plataforma ODANT .
ODANT é uma plataforma de integração digital de fabricação russa projetada para a construção de sistemas de informação de complexidade e distribuição variadas. Leia mais sobre ODANT aqui .É assim que nossos parâmetros para busca de lixeiras se parecem: dentro da estrutura da tarefa, não distinguimos entre locais de contêineres, lixeiras autônomas e pontos de coleta de lixo sólido.
nwr["amenity"="recycling"](area.searchArea);
nwr["amenity"="waste_disposal"](area.searchArea);
nwr["amenity"="waste_basket"](area.searchArea);
Exportamos a saída do ODANT como uma mesa plana.
Cidade |
Urnas |
População |
População / Urnas |
Vladimir |
1525 |
356937 |
234 |
Krasnogorsk |
274 |
175554 |
641 |
Kaluga |
376 |
332039 |
883 |
Tambov |
279 |
292140 |
1047 |
Moscou |
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 |
Ryazan |
118 |
539290 |
4570 |
Korolev |
49 |
224348 |
4579 |
Tula |
101 |
475161 |
4705 |
Elektrostal |
32 |
156026 |
4876 |
Nessa classificação, o município de Vladimir ocupa a honrosa primeira linha: são apenas 234 pessoas para um local de acúmulo de lixo. Usando as ferramentas ODANT integradas, construímos dois gráficos divertidos.


Vamos passar para o próximo elemento - bancos.
nwr["amenity"="bench"](area.searchArea);
Obtemos o seguinte resultado na forma de uma tabela.
Cidade |
Bancadas |
População |
População / lojas |
Vladimir |
593 |
356937 |
602 |
Tambov |
413 |
292140 |
707 |
Moscou |
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 |
E novamente Vladimir se revelou o mais confortável de todos os competidores: não será possível colocar 602 pessoas em um banco, mas em Mytishchi uma luta muito feroz está acontecendo por lugares. No entanto, você sempre pode criar um cronograma.
Visualizamos nossos resultados.


Vamos passar para a parte mais interessante: calcular a área dos parques. Podemos usar vários métodos para resolver este problema, mas o mais aberto e maravilhoso que encontramos é a biblioteca de Folhetos . Na consulta em si, você precisa substituir out count por out geom, o que nos dará as coordenadas das regiões como resultado.
Leaflet é uma biblioteca JavaScript de código aberto para exibição de mapas em sites. Suporta a maioria das plataformas móveis e de desktop que suportam HTML5 e CSS3. O folheto permite que um desenvolvedor não familiarizado com GIS exiba facilmente mapas raster compostos de pequenos blocos, possivelmente com camadas adicionais sobrepostas ao principal. Leia mais sobre o folheto aqui .
Vamos criar um polígono.
const polygon = L.polygon().addTo(map);
const area = L.GeometryUtil.geodesicArea(polygon.getLatLngs());
Agora a área contém a área da região em m2. Extraímos os dados das cidades que selecionamos e obtemos a seguinte tabela.
Cidade |
Área total do parque (km2) |
Área da cidade (km2) |
Porcentagem de espaço ocupado por parques |
Qty parques |
Zelenograd |
4,13 |
37,199 |
0,111 |
26 |
Kaluga |
12,60 |
168,8 |
0,075 |
140 |
Moscou |
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 |
Ryazan |
4,32 |
224,163 |
0,019 |
96 |
Yaroslavl |
3,68 |
205,8 |
0,018 |
176 |
Korolev |
0,97 |
55,47 |
0,017 |
trinta |
Kursk |
3,31 |
208,2 |
0,016 |
862 |
Kolomna |
1.03 |
65,1 |
0,016 |
21 |
Mytishchi |
0,53 |
34,59 |
0,015 |
trinta |
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 |
onze |
Rybinsk |
0,65 |
101,42 |
0,006 |
62 |
Elektrostal |
0,25 |
51,45 |
0,005 |
52 |
Zelenograd, segundo a OSM, justifica plenamente o seu nome - 11% da área da cidade é ocupada por áreas verdes. Vamos obter a relação entre o número de residentes e o número de parques.
Cidade |
Área total dos parques (m2) |
Número de parques m2 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 |
Moscou |
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 |
Ryazan |
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 |
Vamos apresentar os dados na forma de gráficos.


E no final - a classificação das cidades, calculada pelos lugares ocupados.
Cidade |
Avaliação |
Um lugar |
Vladimir |
12 |
1 |
Kaluga |
quinze |
2 |
Moscou |
dezoito |
3 |
Zelenograd |
21 |
4 |
Tambov |
23 |
cinco |
Krasnogorsk |
35 |
6 |
Balashikha |
39 |
7 |
Lyubertsy |
45 |
8 |
Khimki |
46 |
nove |
Kursk |
47 |
dez |
Kolomna |
48 |
onze |
Kostroma |
50 |
12 |
Voronezh |
52 |
treze |
Podolsk |
55 |
quatorze |
Tula |
55 |
quinze |
Ryazan |
61 |
dezesseis |
Tver |
63 |
17 |
Yaroslavl |
63 |
dezoito |
Murom |
69 |
19 |
Rybinsk |
69 |
20 |
Lipetsk |
70 |
21 |
Korolev |
75 |
22 |
Mytishchi |
75 |
23 |
Elektrostal |
94 |
24 |
Epílogo e conclusões
Pela decisão do painel de juízes composto por OpenStreetMap, Overpass API e ODANT,
Vladimir leva o honroso primeiro lugar e recebe o título de “O Mais Verde do Distrito Federal Central”.
Vale ressaltar o seguinte fato: nossa pesquisa baseou-se exclusivamente nos dados refletidos no OSM. Naturalmente, em Mytishchi há mais algumas centenas de bancos e em Tula há muito mais locais para acumulação de lixo. Nossos resultados podem ser vistos do outro lado, por exemplo, para avaliar a dinâmica de adição de objetos de infraestrutura urbana ao banco de dados OSM. No entanto, em média, as pessoas são “igualmente lentas” para inserir dados no OSM, então podemos supor que os dados são relativamente confiáveis e vale a pena considerá-los.
Conseguimos resolver o problema e encontrar uma forma eficaz de trabalhar com objetos em mapas OSM: acabou por ser uma combinação de API Overpass e Folheto. Usando este conjunto de ferramentas, podemos fazer consultas ao banco de dados OSM e receber dados sobre o número de objetos, calcular as áreas das áreas. Para apresentação e análise de dados, montamos uma solução baseada na web baseada em ODANT que atendeu a todas as nossas necessidades.
Há um grande número de indústrias, negócios e economia que poderiam ser ajudados por esta solução. Se você tiver alguma ideia ou feedback, seria muito bom discutir. Gastamos 28 horas limpas na tarefa, talvez você consiga fazê-la mais rápido.
Desenvolvedor Líder Frontend, Infostandard - Daniel Epifanov.
Editor, Infostandard - Nikita Morozov.