匀称地使用:在多边形和多多边形之间转换


12

[编辑:解决方案只是使用OGR读取shapefile。参见geographika的示例。]

在ESRI shapefile中,“多边形”和“多多边形”之间没有区别。此外,内部孔和外部环之间没有明确的区别(除了给定多边形的“手感”)。

因此,在读取shapefile之后,我获得了描述环的坐标序列的列表,但是如果不进行更深入的处理,我将无法区分这些环中的哪些是外环,内孔或其他多边形。

似乎对于shapely的Polygon和MultiPolygon构造函数,必须明确区分外圈和内圈,所以我应该如何从不清晰的圈列表移动到有序的一组分离的多边形,并明确指定内圈和外圈?

总结一下:如果我有一个多边形环的列表,但是我不知道哪些环是内部的孔或单独的多边形,那么如何最好地将它们分类为具有指定内部孔的单独的多边形?

我正在寻找一种可以在python中实现的简单算法解决方案,该解决方案可用于在1分钟或更短的时间内处理数百个多边形,而我这样做是为了执行大量的交集。


这个问题缺少关于您用来读取Shapefile的关键信息。
inc42

@ inc42我正在使用python直接读取文件。
BenjaminGolder

啊,那么Shapely有点误导了。您的实际问题是找出如何确定Shapefile格式的戒指的“种类”。:)
inc42

Answers:


10

为了进一步回答关于如何获取单个多边形的答案,您可以在所有多边形上运行相交以创建孔。如果您不走运,但数据集包含重叠的多边形。

再次说明现有的shapefile阅读器有什么问题?

使用现有shapefile阅读器从shapefile中导出要素ID和M值,然后将它们重新连接到多边形,会不会更容易?

对于多面体,可以使用将多边形ID分配给“面体ID”的相同技术,然后将此属性添加回要素中。

编辑:虽然您说您不想使用OGR,以防万一您改变主意。

import ogr
# Get the driver
driver = ogr.GetDriverByName('ESRI Shapefile')
# Open a shapefile
shapefileName = "D:/temp/myshapefile.shp"
dataset = driver.Open(shapefileName, 0)

layer = dataset.GetLayer()
for index in xrange(layer.GetFeatureCount()):
    feature = layer.GetFeature(index)
    geometry = feature.GetGeometryRef()
    #geometry for polygon as WKT, inner rings, outer rings etc. 
    print geometry

几何图形应如下输出:

POLYGON ((79285 57742,78741 54273...),(76087 55694,78511 55088,..))

第一个括号包含外圈的坐标,随后的括号包含内圈的坐标。如果您有Z值,则点的格式应为79285 57742 10(最后一个坐标为高度)。

否则,您可以使用Shapely Contains和内部函数相互评估每个多边形并预先应用空间索引-http: //pypi.python.org/pypi/Rtree/以加快处理速度。


谢谢,这不是我想要的,但是我看到了一些我可以对我的问题做的澄清。要回答您的问题:1,因为我首先将它们分类为大量的交叉路口。2,没什么,我只需要一个轻量级的并且可以从python轻松使用的东西,而且我还没有学过ogr。3,不,在这种情况下不会更容易。
BenjaminGolder

1
哇!谢谢geographika!我现在有90%的人相信ogr是解决方案。我在ogr遇到了一些安装问题,但是看起来值得一试。那么,ogr在其wkt输出中组织铃声吗?3d shapefile很好吗(我经常使用3d)?
BenjaminGolder

看来我的问题的答案是肯定的。并感谢您向我介绍rtree。OGR似乎可以完全解决我的问题-只要这次我可以正确配置安装即可。
BenjaminGolder

重新安装OGR-请记住,您将需要Windows二进制文件和匹配的Python绑定。
geographika,

9

首先,使用ogr打开shapefile:

from osgeo import ogr
source = ogr.Open("mpolys.shp")
layers =  source.GetLayerByName("mpoly")
len(layers)
1

将shapefile几何形状转换为形状几何形状

from shapely.wkb import loads
element=layers[0] #(because lenght of layer =1, else you need "for element in layers: ...")
geom = loads(element.GetGeometryRef().ExportToWkb())
geom.geom_type
'MultiPolygon'
print geom
MULTIPOLYGON ((..... # the geometry in shapely wkt format

对于多边形中的多边形:

poly=[]
for pol in geom:
    poly.append(pol)
poly[0]
<shapely.geometry.polygon.Polygon object at 0x00B82CB0>
poly[0].geom_type
'Polygon'
print(poly[1])
POLYGON ((.... # the geometry in shapely wkt format

现在,您可以使用shapely(shapely)的所有功能


1

我不太了解多边形在形状文件中的实际存储方式,但是-仅当重复起始坐标时,多边形环才不应该是闭环吗?因此,如果将每个后续坐标与起始坐标进行比较,则会找到多边形闭合的第一个点。如果那是多边形的最后一个坐标,则它是一个简单的多边形,如果不是,则它是一个多多边形,需要处理其他循环。

那可能是您想要避免的“更密集的处理”,但实际上,这只是遍历坐标的一次迭代,当您无论如何都要阅读它们时,它们都是免费的。


我很抱歉-我的问题有点误导,我已对其进行了编辑。我有多边形环,并且我知道有多个多边形环的列表,但是除了点的顺时针或逆时针顺序外,我也不知道它们是内部还是外部。如果它们是内圈,除了测量位置外,我无法确定它们属于哪个外圈。
BenjaminGolder

我知道了。我也很高兴看到你找到了自己的方式。;)
转租

-2

@ inc42所示,在ESRI Shapefile的第8页上技术说明:ESRI白皮书-1998年7月(PDF中34页的第12页)讨论了多边形记录的内容,可能是您要遵循的内容:

多边形可以包含多个外环。圆环的顶点顺序或方向指示圆环的哪一侧是多边形的内部。


第10页的内容为“一个多边形可能包含多个外环。一个环的顶点顺序或方向指示了环的哪一侧是该多边形的内部。”
inc42

@ inc42进行了相应更新,尽管我认为页数应为8(或34中的12)。
PolyGeo
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.