谁在俄罗斯生活得好?我们如何使用OpenStreetMap和Overpass API搜索最绿色的城市

每张卡片都有一个图例:是她告诉读者卡片上指示的内容和方式。房屋对应于灰色的多边形,道路-线段和曲线,公园和广场都用浅绿色填充并用树形象形文字装饰。他们在某些地图上添加了有用的应用程序-这些道路的长度,公园,商店和垃圾桶的数量的列表。



当我们准备自动化本地市政服务时,我们提请注意制图的使用,我们发现它是解决各种任务的强大而有效的工具。在地图上,您可以显示有关物体位置,收割设备的移动路线,运输,工作计划以及有问题和“健康”区域的热图的最新信息。



通常,使用制图有助于加快对紧急问题的反应时间和决策速度,简化计划和预测过程,最重要的是,所有信息都以最直观的形式提供。



在与其中一位客户合作时,我们面临着一项有趣的任务-按类别计算地图上的对象数量。



寻找



结合以下数据确定中央联邦区中“最绿色的”城市:商店,垃圾桶和公园的数量。



给定



制图。我们选择OpenStreetMap(以下称为OSM作为跳板的原因很简单-开源。



决断



有几种解决此问题的方法。例如,我们可以使用PostgreSQL查询OSM数据库并检索所需的数据,也可以使用QGIS(一种用于创建,分析和发布地理空间信息的系统)。但是,我们找到了一种更优雅,更有效的方法-Overpass API



Overpass API是一个功能强大的工具,可应用户要求从OSM数据库提取数据。它针对各种规模的任务进行了优化:从检索数据库中的多个元素到根据XML或Overpass QL形式(Overpass XML的升级版本)根据请求选择的数亿个对象。在此处阅读有关Overpass API的更多信息
让我们从头开始:首先,您需要在服务器上部署OSM。Ubuntu用作我们计算机上的操作系统。



问:为什么要部署OSM?

答:要处理数据,我们需要Overpass API,该API的公共服务器每天对请求数量有限制。出于这个原因,我们将使用OSM二十一点和Overpass API部署服务器

有关安装OSM的详细说明,请参见此处
下一步是安装Overpass API-最新版本可以在这里找到



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


安装后,您将需要填充-创建数据库。我们不需要全世界的数据库,因此我们将使用Geofabrik服务,该服务使我们能够获取指定管理区域的数据。

BBBike是Geofabrik的一个值得替代的选择



我们以.osm.bz2格式下载并解压缩从欧洲>俄罗斯联邦>中央联邦区目录下载的数据库,如下所示:

PATH_TO_INIT_OSM3S.SH PATH_TO_FILE_BZ2 PATH_WERE_Unpack_OVERPASS_API DIRECTORY

注意:在这种情况下,所有操作都在立交目录中执行



因此,该平台几乎已准备就绪-现在我们可以提出第一个请求,并找出整个地区的公园数量。

PATH_TO_OSM3S_QUERY --db-dir = PATH_To_DB


我们的请求和响应如下所示:



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

  ]
}


我们已经接近了:剩下的就是按地区和城市划分公园。单独运行并不断运行的Dispatcher将帮助我们应对此任务



我们启动API,并在/etc/apache2/ports.conf目录中添加Listen PORT



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


检查配置。它应该看起来像这样。



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


接下来,我们打开新主机,然后将旧主机发送给其他主机。



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


现在是时候启用第一个处理我们请求的分派器了。为此,我们将使用命令。



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


一切按计划进行的第一个迹象是在数据库目录中创建了

osm3s_OVERPASS_API_VERSION_osm_base文件nohup.out文件显示状态消息Dispatcher- dispatcher刚刚启动



但是,工作还没有结束:您需要启动另一个Dispatcher。首先,将rules文件夹复制到数据库目录,然后将权限分配给所产生的osm3s_OVERPASS_API_VERSION_areas




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

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


现在,我们可以请求该区域并计算梁赞的公园数量。顺便说一下,这已经可以在浏览器的地址栏中使用了。



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


期待已久的答案!



"elements": [

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

  ]
}


因此,现在我们可以深入分析和改进问题:我们将找到中央联邦区25个大城市中的公园,商店和垃圾桶的数量,并使用ODANT平台的分析工具比较这些指标

ODANT俄罗斯制造的数字集成平台,旨在用于构建各种复杂性和分布性的信息系统。在此处阅读有关ODANT的更多信息
这就是我们用于搜索垃圾箱的参数的样子:在任务的框架内,我们不区分容器场址,独立式垃圾箱和固体废物收集点。




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


我们将ODANT的输出导出为平面表。





ns



人口



人口/骨灰盒



弗拉基米尔



1525



356937



234



克拉斯诺戈尔斯克



274



175554



641



卡卢加



376



332039



883



坦波夫



279



292140



1047



莫斯科



11473



12678079



1105



科洛姆纳



111



140129



1262



巴拉希卡



378



507366



1342



库尔斯克



336



452976



1348



雷宾斯克



129



184635



1431



密志



140



235504



1682



柳伯特西



119



205295



1725



泽列诺格勒



140



250453



1789年



沃罗涅日



544



1058261



1945年



特维尔



225



449507



1998年



雅罗斯拉夫尔



273



608353



2228



慕罗姆



43



106984



2488



波多尔斯克



114



308130



2703



希姆基



89



259550



2916



科斯特罗马



72



276929



3846



利佩茨克



124



509420



4108



梁赞



118



539290



4570



科罗廖夫



49



224348



4579



图拉



101



475161



4705



Elektrostal



32



156026



4876







在这个等级中,弗拉基米尔市占据了光荣的第一线:只有234人在那里一个地方聚集了垃圾。使用内置的ODANT工具,我们可以构建两个有趣的图表。











让我们继续下一个元素-长凳。



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


我们以表格的形式得到以下结果。





长椅



人口



人口/商店



弗拉基米尔



593



356937



602



坦波夫



413



292140



707



莫斯科



13970



12678079



908



克拉斯诺戈尔斯克



143



175554



1228



巴拉希卡



411



507366



1234



泽列诺格勒



185



250453



1354



特维尔



268



449507



1677



柳伯特西



115



205295



1785



卡卢加



176



332039



1887年



库尔斯克



214



452976



2117



慕罗姆



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





弗拉基米尔再次成为所有竞争者中最舒服的:不可能将602人放在一张长凳上,但是在梅季希(Mytishchi),地方的激烈竞争正在进行。但是,您总是可以提出一个时间表。



我们将结果可视化。











让我们继续进行最有趣的部分:计算公园的面积。我们可以使用几种方法来解决此问题,但是我们发现的最开源,最精彩的是Leaflet。在查询本身中,您需要用out geom替换出count,这将为我们提供区域的坐标。

Leaflet是一个开放源代码的JavaScript库,用于在网站上显示地图。支持大多数支持HTML5和CSS3的移动和桌面平台。Leaflet使不熟悉GIS的开发人员可以轻松显示由小图块组成的栅格地图,并可能在主图块上叠加其他图层。在此处阅读有关Leaflet的更多信息


让我们创建一个多边形。



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


现在该区域包含以m2为单位的区域面积。我们提取所选城市的数据并获得下表。





总公园面积(平方公里)



市区(km2)



公园所占空间的百分比



数量

公园



泽列诺格勒



4.13



37.199



0.111



26



卡卢加



12.60



168.8



0.075



140



莫斯科



121.75



2561.5



0.048



1469



柳伯特西



0.60



12.87



0.047



28



弗拉基米尔



4.62



137.14



0.034



104



希姆基



3.55



109.8



0.032



27



波多尔斯克



1.29



40.39



0.032



53



巴拉希卡



1.78



62.8



0.028



55



坦波夫



2.71



96.58



0.028



140



图拉



4.09



145.8



0.028



102



科斯特罗马



3.95



144.5



0.027



50



克拉斯诺戈尔斯克



0.69



25.65



0.027



21



梁赞



4.32



224.163



0.019



96



雅罗斯拉夫尔



3.68



205.8



0.018



176



科罗廖夫



0.97



55.47



0.017



三十



库尔斯克



3.31



208.2



0.016



862



科洛姆纳



1.03



65.1



0.016



21



密志



0.53



34.59



0.015



三十



沃罗涅日



8.25



596.51



0.014



414



利佩茨克



4.44



330.15



0.013



78



特维尔



1.38



152.22



0.009



129



慕罗姆



0.33



43.78



0.008



十一



雷宾斯克



0.65



101.42



0.006



62



Elektrostal



0.25



51.45



0.005



52





根据OSM的说法,Zelenograd充分证明了它的名称-城市的11%的区域被绿色区域占据。让我们得到居民数量与公园数量的比率。





停车场总面积(平方米)



每位居民的m2公园数量



每1个公园的居民人数



卡卢加



12,600,000



37.95



2372



泽列诺格勒



4,130,000



16.49



9633



科斯特罗马



3,950,000



14.26



5539



希姆基



3,550,000



13.68



9613



弗拉基米尔



4,620,000



12.94



3432



沃罗涅日



825万



9.72



2050年



莫斯科



121,750,000



9.60



8630



坦波夫



2,710,000



9.28



2087



利佩茨克



4,440,000



8.72



6531



图拉



4,090,000



8.61



4658



梁赞



4,320,000



8.01



5618



科洛姆纳



1,030,000



7.35



6673



库尔斯克



3,310,000



7.31



525



雅罗斯拉夫尔



368万



6.05



3457



科罗廖夫



970,000



4.32



7478



波多尔斯克



1,290,000



4.19



5814



克拉斯诺戈尔斯克



690,000



3.93



8360



雷宾斯克



650,000



3.52



2978



巴拉希卡



1,780,000



3.51



9225



慕罗姆



330,000



3.08



9726



特维尔



138万



3.07



3485



柳伯特西



600,000



2.92



7332



密志



530,000



2.25



7850



Elektrostal



250,000



1.60



3001





让我们以图形的形式呈现数据。











而在最后-城市的等级,由所占位置计算得出。





评分



一个地方



弗拉基米尔



12



1个



卡卢加



十五



2



莫斯科



十八



3



泽列诺格勒



21



4



坦波夫



23





克拉斯诺戈尔斯克



35



6



巴拉希卡



39



7



柳伯特西



45



8



希姆基



46





库尔斯克



47





科洛姆纳



48



十一



科斯特罗马



50



12



沃罗涅日



52



十三



波多尔斯克



55



十四



图拉



55



十五



梁赞



61



十六



特维尔



63



17



雅罗斯拉夫尔



63



十八



慕罗姆



69



19



雷宾斯克



69



20



利佩茨克



70



21



科罗廖夫



75



22



密志



75



23



Elektrostal



94



24





结语和结论



根据由OpenStreetMap,Overpass API和ODANT组成的评审团的决定,

弗拉基米尔(Vladimir)获得了光荣的第一名,并获得了“中央联邦区最绿色的”称号。



值得注意以下事实:我们的研究仅基于OSM中反映的数据。自然,在Mytishchi,有几百个长凳,而在Tula,有更多的废物堆积场所。我们的结果可以从另一侧查看,例如,评估将城市基础设施对象添加到OSM数据库的动态。但是,平均而言,人们在OSM中输入数据的速度“相当慢”,因此我们可以假设数据相对可靠,值得考虑。



我们设法解决了这个问题,并找到了一种有效的方法来处理OSM地图上的对象:事实证明,这是Overpass API和Leaflet的结合。借助这套工具,我们可以查询OSM数据库并接收有关对象数量的数据,计算面积。对于数据表示和分析,我们将基于ODANT的基于Web的解决方案组合在一起,以满足我们的所有需求。



该解决方案可以帮助许多行业,商业和经济。如果您有任何想法或反馈,不妨讨论一下。我们在任务上花费了28个小时的清洁时间,您也许可以更快地完成任务。



信息标准首席前端开发人员-Daniel Epifanov。

Infostandard编辑-Nikita Morozov。



All Articles