Quem vive bem na Rússia? Como pesquisamos a cidade mais verde usando o OpenStreetMap e a API Overpass

Cada ficha tem uma legenda: é ela quem diz ao leitor o que nela está indicado e como. As casas correspondem a polígonos cinzentos, estradas - segmentos e curvas, parques e praças são preenchidos com verde claro e decorados com um pictograma de árvore. E a alguns mapas eles adicionam um aplicativo útil - uma lista dessas mesmas estradas com sua extensão, o número de parques, lojas e latas de lixo.



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 blackjack OSM e API Overpass.

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.



All Articles