将复杂的shapefile划分为网格


11

我有一个具有多边形/多多边形特征的相当详细的shapefile(文件约为500mb)。它实际上是整个世界的shapefile,其特征代表海岸线。我需要使用网格划分此数据。明确地说,我不想对数据进行“排序”,而是将多边形实际切成小块。我知道之前曾有人问过这个问题,但是我发现的解决方案对我不起作用。

我试过了:

  • 使用QGIS并将我的shapefile内容与矢量网格相交-结果非常糟糕。大多数主要陆地都神奇地消失了,尽管有时似乎有较小的一块土地。我应该注意,这种方法对简单得多的数据(例如,较少的点)非常有效

  • 使用OGR的相交工具。我通过ogr2ogr甚至通过滚动自己的C ++工具都进行了尝试。两者都具有与QGIS相同的问题。对于简单的文件,它们也不会出现此问题,但是对于较复杂的文件,则不会通过。作为参考,我使用的是澳大利亚和新西兰的shapefile,大小不超过20mb,并且QGIS和OGR都无法对其进行“网格化”。

有人建议一次使用PostGIS,因为它具有交集功能-但PostGIS的ST_Intersect使用与OGR相同的GEOS后端。实际上,据我所知,它们都调用相同的函数,因此我认为PostGIS不会产生不同的结果。

我一直在寻找关于其他尝试方法的建议。我需要一个功能强大的应用程序或工具包,可以将高度详细的shapefile划分为图块。

编辑:添加一些更多的信息

针对Simbamangu:

  • shapefile基本上是来自OpenStreetMap的海岸线数据。这是“ processed_p”文件的合并版本(因此不会拆分为图块),我通过给他们的开发人员列表发送了电子邮件。请注意,他们将瓦片分割成100km x 100km重叠的块并不一定是我想要的-我不希望重叠,我想自由选择网格大小,或者我只想使用默认处理的_p。

  • 默认情况下,海岸线数据具有QGIS报告的几何误差。我使用一个小的工具将这些错误汇总在一起,使用发现的一些代码专门解决了这个问题(修复海岸线数据中的几何错误:https : //github.com/tudelft-gist/prepair)。使用此工具在文件上运行几乎可以修复QGIS发现的所有错误。我仅在清理文件后尝试进行相交。

  • 我使用QGIS所做的正是:打开数据以确保它在QGIS中看起来不错。尝试通过使用具有指定间距的Vector Grid创建一层瓷砖,然后将这两层相交,将其分成多个瓷砖-不行。尝试使用较小的数据集-选择大洋洲(Aus,NZ)中的要素以尝试使用较小的数据集-此形状文件的大小小于20mb。再次尝试将其分割,不起作用。

  • 我对OGR所做的事情:ogr2ogr直接使用带有spat_extent的'-spat'和'-clipsrc'选项。还写了一个可以在WKT上运行的小型C ++工具,因此我使用ogr2​​ogr将shapefile转换为WKT,然后将文本文件提供给我的应用程序。它遍历该文件并调用此处记录的Intersection()方法:http : //www.gdal.org/ogr/classOGRGeometry.html。我认为最终结果与直接使用ogr2​​ogr完全一样。

针对布伦特:

  1. 是的 一切都在WGS84纬度/经度中
  2. 我以为是相反的事实-对于给定的一组网格图块,与一个巨型多面体相交将花费更长的时间,而不是一堆可以在空间上更局部地定位于每个图块的零碎要素,但这是一个有趣的建议-我会尝试并报告。
  3. 在此过程中不会保留任何属性字段,我只对几何感兴趣。
  4. 我不确定,但是我想你是说我应该选择与给定网格图块重叠的多边形,然后执行相交。使用QGIS手动操作太麻烦了。我的工具已经通过边界框检查在一定程度上做到了这一点。速度有所提高,但是最终结果仍然很差,并且没有明显的不同。
  5. 这不是一个选择。现在,我正在尝试将数据划分为1度经度x 1度经度,并且我正在寻找一种适用于所有情况的通用/稳健方法。我尝试增加网格尺寸(即10x10)以查看是否可以获得更好的结果,并且看不到网格尺寸与输出质量之间的任何关联。

编辑#2:

我尝试了更多,总的来说,使用GEOS和QGIS(使用fTools,我不知道是否又使用GEOS)时,结果似乎都不可靠。我错误地指出网格的大小与结果无关—网格越大,结果越好(这是很好的认识,但仍然不是解决方案)。这是一个实际间隔开的网格的屏幕截图,该网格大部分可用,但在一个磁贴中部分失败:

在此处输入图片说明

几何图形很干净-QGIS使用“检查有效性”工具显示0错误。我不是要逐步解决这个问题。验证某些特征是否在视觉上不明显(且不会使用较小的图块)的情况下,无法通过如此大的数据集的交集不可行。


您从哪里获得世界或澳大利亚的shapefile?我怀疑该文件的几何可能存在一些问题(尝试在QGIS中使用“向量” |“几何工具” |“检查几何有效性”)。刚刚在一个较小的世界shapefile和5度瓦片上尝试了一个相交,它在QGIS中可以完美地工作。
Simbamangu

1
在来自澳大利亚地质科学局(Geoscience Australia)的100K澳大利亚海岸线(4MB)和4度瓦片上对此进行了尝试,也可以正常使用(QGIS 1.7.4,OSX 10.7)。您能否更详细地描述您的数据以及您做了什么?
Simbamangu 2012年

感谢您提供所有其他信息。我怀疑OSM数据有些奇怪;尝试使用我提到的数据集,看看是否可以获得更好的结果。我似乎记得过去曾经对OSM Lake数据感到有些奇怪,会尝试进行查找。
Simbamangu

您是否可以共享数据集,甚至是其一部分(如上述示例中所示)?
Simbamangu

Answers:


7

我刚刚创建了自己的工具来做到这一点。

我使用Clipper库(http://www.angusj.com/delphi/clipper.php)和OGR来划分数据集。要注意的一点是,与该库天真地执行相交需要很长时间,因此我改用四叉树方法...即,将其划分为四个网格单元,再将每个网格划分为四个,依此类推,直到获得所需的分辨率为止。lib的效果很好,但我附带了一张截图,显示了东半球的结果:

在此处输入图片说明

以上结果在1.33GHz处理器上花费了大约4.5个小时。

这里是一些工具,以防将来有人遇到类似问题。请注意,它们被概念证明混为一谈,您可能不应该直接使用它们(不过,可以将它们作为一个很好的起点):

https://github.com/preet/scratch/tree/master/gis/polytoolkit

https://github.com/preet/scratch/tree/master/gis/shapefiles/shptk


链接的代码不再可用:-(
Shaun McDonald

我将存储库移至github.com/preet/scratch/tree/master/gis/polytoolkit。根据您要完成的工作,您可能会发现github.com/preet/scratch/tree/master/gis/shapefiles/shptk更有用。
2014年

后面的一个更有用。我现在已经找到了一种使用PostGIS的方法,尽管有兴趣了解它是否更快。您有用于编译和安装的自述文件吗?
肖恩·麦当劳

您可以编辑答案以修复链接吗?谢谢
AFR

4

听起来确实有几何问题。无论使用哪种软件,都不太可能从肮脏的输入文件中获得干净的结果,除非您首先解决几何问题。解决几何问题后,如果仍然遇到问题,可以尝试以下方法:

1)确保网格数据集与世界多边形数据集具有相同的投影。如果不是,请以正确的投影重新创建它。

2)将所有功能转换为单个零件-更容易处理

3)删除仅保留id字段的所有无关字段,这将使您能够在执行交集后将属性重新加入-再次易于处理

4)而不是将整个网格数据集与整个世界多边形数据集相交,而是尝试遍历您的网格多边形,在您的世界数据集中选择相交的多边形,然后根据您的网格多边形执行剪辑。这将使您能够隔离所有问题,最后可以将结果合并在一起以实现最初的目标。

5)尝试使用较大的网格多边形。


+1真的很有趣-如果在数据中保留ID字段或多部分内容,它将对地理处理速度有多大影响?
Simbamangu

1
我从来没有尝试过量化差异。我只能从经验来看,过度的地理处理操作失败了,这些都是解决问题的方法。
布伦特·爱德华兹

我根本无法使(2)工作。选择功能部件并尝试使用QGIS合并它们基本上似乎锁定了我的系统-也许它仍在处理东西,但是以这种速率,这不切实际:我将系统留在了过夜,而QGIS仍试图在其中合并几个功能部件。数据集,并且仍在早上进行。
2012年

1
不应涉及任何合并。目标是爆炸多部分功能。例如,在失败的图块的屏幕快照中,目标是将包含分组的,空间上不相交的多边形(例如BC和阿拉斯加沿岸的岛要素)的所有记录分解为单独的单部分多边形记录。这可以在QGIS中使用“向量”>“几何工具”菜单下的“从多部分到单部分”工具来实现。
布伦特·爱德华兹

转换为单零件特征后,应重新验证几何图形,以确保一切都干净。
布伦特·爱德华兹

0

另一种方法可能是尝试矢量到栅格的转换以创建点数据集,然后将点数据集用作编写一些代码以创建图块的基础。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.