0

数据示例:

<?xml version='1.0' encoding='UTF-8'?><osm version="0.6" generator="osmconvert 0.7P" timestamp="2013-07-20T19:00:02Z">
.
   <way id="128725988" version="1" timestamp="2011-09-03T08:06:56Z" changeset="9198624" uid="42429" user="42429">
      <nd ref="1421727256"/>
      <nd ref="1421727264"/>
      <nd ref="1421727238"/>
      <nd ref="1421727237"/>
      <nd ref="1421727256"/>
      <tag k="addr:housenumber" v="43"/>
      <tag k="addr:street" v="Wilhelm-Ahrens-Straße"/>
      <tag k="building" v="yes"/>
   </way>
.
.
   <node id="1964468590" lat="53.068416" lon="8.779039" version="1" timestamp="2012-10-14T12:29:02Z" changeset="13491909" uid="715371" user="cracklinrain"/>
   <node id="1964468593" lat="53.0684177" lon="8.7798644" version="1" timestamp="2012-10-14T12:29:02Z" changeset="13491909" uid="715371" user="cracklinrain">
      <tag k="natural" v="tree"/>
   </node>
.
.
.
   <way id="128725989" version="1" timestamp="2011-09-03T08:06:57Z" changeset="9198624" uid="42429" user="42429">
      <nd ref="1421728028"/>
      <nd ref="1421728023"/>
      <nd ref="1421728016"/>
      <nd ref="1421728024"/>
      <nd ref="1421728028"/>
      <tag k="addr:housenumber" v="44"/>
      <tag k="addr:street" v="Alma-Rogge-Straße"/>
      <tag k="building" v="yes"/>
   </way>
.
.

这是一个内部包含 30GB 数据量的 Xml 文件的示例。

我想要做的是只获取<tag>包含特定所需属性的元素,例如addr:housenumber.

需要保持连接的一件事是id来自父元素。

我的主要问题是如何处理 30 GB 的文档。如果它是大约几百 MB,我自己解决它是没有问题的。

我已经尝试过的:

  1. XmlReader

    非常适合获取特定属性,但与父 ID 的连接丢失。

  2. 诸如 xDocument、XmlDocument 之类的东西……

    问题是数据量。(30 GB)
    将 ~ 1GB 加载到内存后,得到一个OutOfMemoryException.
    我知道将 30GB 的容量加载到内存中会很疯狂。

我已经有了一个单独的工作解决方案,通过对 pbf 文件使用 OpenSource 库(但我想处理干净的数据)并通过迭代每个节点并使用 LinqToSql 将其添加到数据库来提取所需的数据。

最后结果:

我想将每条街道、门牌号、邮政编码和城市导入与之连接的 SQL Server 数据库StreetTableCityTable我的第一个解决方案运行良好,但在处理了 10 000 个项目后,它变得非常慢。)

我希望我想做的事情是可以理解的。

4

2 回答 2

0

我没有使用 C# 的经验,但由于 XML 文件非常大,并且只需读取/访问一次就足够了,一个简单的 XMLSAX解析器似乎就足够了。C#XmlReader似乎类似于 SAX 解析器。因此,您所要做的就是每当读取<node>or<way>元素并触发相应的事件时,您只需存储该id属性。并且每当<tag>读取事件并触发相应事件时,您将其所有属性分配给先前的read id

于 2013-07-26T16:37:50.640 回答
0

我不确定,但这些链接可能会有所帮助:

https://wiki.openstreetmap.org/wiki/Osmconvert#Dispose_of_Ways_and_Relations_and_Convert_them_to_Nodes

https://wiki.openstreetmap.org/wiki/Osmconvert#Writing_CSV_Files

也有用:osmfilter、Osmosis

osmconvert 和 osmfilter 的某些选项需要严格排序的输入文件:首先是所有节点,然后是所有路径,然后是所有关系。在到达组内,数据应按 id 排序。

如果您使用 .o5m(或者可能是 .pbf)文件格式,转换和过滤会更快。

于 2013-07-24T08:41:21.077 回答