OpenStreetMap最后一部分:填充地址层次结构

第一部分中,我们从大型数据集中切出了一个有条件的城市,只保留了其中有地址的数据。这些地址被解释为属于该城市。那些。确切知道他们在哪个国家,哪个地区等等。但是,如果我们需要的地址不是一个地区,而是整个地区甚至几个国家,该怎么办?你怎么知道他来自哪里?

尽管在OpenStreetMap中可以在每个房屋的哪个国家,地区以及更远的层次上指明它,但是在俄罗斯使用的是一种缩写方法-即 只有街道和门牌号码。所有关于地址构造的猴子工作都将由计算机为我们完成。当然,如果所有必要的数据都在他手中,他将更快,更正确地进行此操作。

训练

我将在Saransk或更确切地说在其市区中进行试验-通过用矩形将其切出,并覆盖以下内容:下边框(45 54),上边框(45.5 54.3)。我将转储中的剪切保存为pbf格式,因为可以使用以下工具:

osmconvert -b=45,54,45.5,54.3 RU-local.o5m -o=SaranskGO.pbf

现在,整个想法是将标签添加到所有建筑物中,并为其添加地址。这将通过将房屋的几何形状输入到沉降轮廓中来计算。为此,我们需要用于渗透OsmAreaTag插件(作者对此插件进行更详细的描述)。作者在此处发布了插件编译版本渗透本身可以从github上获取这是一个Java应用程序,因此很清楚,如果没有它,它将无法正常工作。

安装插件

为了使渗透能看到osmareatag插件它必须位于当前目录plugins文件夹中,这有点不方便因此,可以将其放置在用户的主目录中,对于Windows,它将c:\Users\<>\.openstreetmap\osmosis\plugins位于c:\Users\<>\AppData\Roaming\openstreetmap\osmosis\plugins在那里解压缩插件档案的内容,osmareatag-1.3.zip文件夹应位于plugins文件夹中

制定规则

在这里,我将告诉您一些有关如何使用此插件的理论。这是基本配置文件的示例:

<?xml version="1.0" encoding="UTF-8"?>
<tag-processing>  
  <area id="national-boundary" cache-file="national-boundary.idx">
    <match type="relation">
      <tag k="boundary" v="administrative"/>
      <tag k="admin_level" v="2"/>
    </match>
  </area>

  <transform>
    <name>Country</name>
    <match>
      <tag k="building" v=".*"/>
      <tag k="addr:housenumber" v=".*"/>
      <inside area="national-boundary"/>
    </match>
    <output>
      <add-tag k="addr:country" v="${ISO3166-1}" context-area="national-boundary"/>
    </output>
  </transform>
</tag-processing>

— . area id, , . match , OSM, . , .. . cache-file OSM . - , - , . , .

— , transform. match , : inside , area .

, output , , , , , national-boundary ISO3166-1. , .

, , , . . , , .

:

<?xml version="1.0" encoding="UTF-8"?>
<tag-processing>
  <area id="place">
    <match>
      <tag k="place" v="city|town|village|hamlet|isolated_dwelling|allotments"/>
    </match>
  </area>

  <transform>
    <name>Place</name>
    <match>
      <tag k="building" v=".*"/>
      <tag k="addr:housenumber" v=".*"/>
      <inside area="place"/>
    </match>
    <output>
      <add-tag k="addr:city-auto" v="${name}" context-area="place"/>
    </output>
  </transform>
</tag-processing>

addr:city-auto, , OSM. osm-xml, . :

call osmosis-0.48.3\bin\osmosis.bat --read-pbf SaranskGO.pbf --lp --tag-area-content file=tag-building-addr-place.xml --write-xml SaranskGO.place.osm

tag-building-addr-place.xml - , .

.. - , . , . . .

  <way id="103738775" version="2" timestamp="2019-09-20T18:28:15Z" uid="10124028" user="MarinaAR" changeset="74731679">
    <nd ref="1197639591"/>
    <nd ref="1197639690"/>
    <nd ref="1197639206"/>
    <nd ref="1197639237"/>
    <nd ref="1197639591"/>
    <tag k="building" v="yes"/>
    <tag k="addr:city" v=""/>
    <tag k="addr:street" v=" "/>
    <tag k="addr:housenumber" v="5"/>
    <tag k="addr:city-auto" v=""/>
  </way>

, . , , , CSV, QGIS. OSM, OSM , .. - . CSV.

图1 addr:city与addr:city-auto不同
.1 addr:city addr:city-auto

可以看出,整个村庄的名称不正确。这只是定居点名义的垃圾。这是萨兰斯克市和同名城市的混乱,其中包括多个定居点。反之亦然,在村庄名称的地方输入农村住区的名称。在城市本身的领土上,您可以看到几十个打错名字的地方。就像我之前说过的:将这项业务留给机器,您可能会犯错,一个人会犯错。

现在,仅分配了结算的名称。对于绑定到国家的定居点和地区可以类推。




All Articles