当我们准备自动化本地市政服务时,我们提请注意制图的使用,我们发现它是解决各种任务的强大而有效的工具。在地图上,您可以显示有关物体位置,收割设备的移动路线,运输,工作计划以及有问题和“健康”区域的热图的最新信息。
通常,使用制图有助于加快对紧急问题的反应时间和决策速度,简化计划和预测过程,最重要的是,所有信息都以最直观的形式提供。
在与其中一位客户合作时,我们面临着一项有趣的任务-按类别计算地图上的对象数量。
寻找
结合以下数据确定中央联邦区中“最绿色的”城市:商店,垃圾桶和公园的数量。
给定
制图。我们选择OpenStreetMap(以下称为OSM)作为跳板的原因很简单-开源。
决断
有几种解决此问题的方法。例如,我们可以使用PostgreSQL查询OSM数据库并检索所需的数据,也可以使用QGIS(一种用于创建,分析和发布地理空间信息的系统)。但是,我们找到了一种更优雅,更有效的方法-Overpass API。
Overpass API是一个功能强大的工具,可应用户要求从OSM数据库提取数据。它针对各种规模的任务进行了优化:从检索数据库中的多个元素到根据XML或Overpass QL形式(Overpass XML的升级版本)根据请求选择的数亿个对象。在此处阅读有关Overpass API的更多信息。让我们从头开始:首先,您需要在服务器上部署OSM。Ubuntu用作我们计算机上的操作系统。
问:为什么要部署OSM?
答:要处理数据,我们需要Overpass API,该API的公共服务器每天对请求数量有限制。出于这个原因,我们将使用OSM
有关安装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。