两天前,我问了一个有关ESRI shapefile中多边形顶点的内部存储顺序的问题。回答了这个问题(是否将多边形按顺时针或逆时针方向存储在shapefile中?)并且在旧帖子中也得到了回答(多边形创建(是否顺时针旋转))。 ,我不知道它是否有唯一的答案。
顺时针顺序仅适用于ESRI shapefile还是通用GIS格式?
那么GIS软件的内部表示又如何呢?
例如,如果我使用QGIS并读取了一个包含多边形的* .shp,我认为外部边界的内部表示形式是与原始shapefile中一样的顺时针方向,但是对于所有受支持的文件格式呢?通过QGIS?
对于ArcGIS?
如果存在一种文件格式,该文件格式具有以逆时针方向存储的多边形,如果这些文件加载到QGIS,ArcGIS等中,则内部会改变方向,因此如果我使用PyQGIS读取数据,例如,多边形是按顺时针方向排列的?由于需要使用多边形的方位角检查多边形的连续边之间的角度,因此需要知道顺序是否为顺时针。一种解决方案是计算每个多边形的面积,如果我没记错的话,如果它是正数,则顺序是顺时针;如果是负数,则该顺序是逆时针。不会太慢我的插件。
但是在QGIS的特殊情况下,有人知道它是顺时针还是逆时针存储多边形,而不管原始源中的顺序如何?
到目前为止,我正在使用ESRI shapefile,并且layer.getFeatures()。geometry()。asPolygon()中的坐标按顺时针方向存储为外部边界,按逆时针方向存储为孔,即。 e。与原始* .shp中一样。
#1 楼
在OGC规范中,该规范可在[此处]下载,(http://www.opengeospatial.org/standards/sfs)指出:“多边形旋转未由此标准;实际的多边形旋转可以沿顺时针或逆时针方向进行。“
在Oracle文档中,明确指出外圈边界是逆时针方向,而内圈则是内圈边界,顺时针方向。同样,在SQL Server Spatial中,地理数据类型的外部环遵循逆时针规则,内部环遵循顺时针规则-有关更多详细信息,请参见此MicroSoft博客。 Postgis似乎允许对几何形状使用任何一种方法,并且具有迫使多边形的几何形状遵循右手法或左手法则的功能,请参见ST_ForceRHR和ForceLHR。 JTS / Geos似乎遵循了正确的规则,即外圈的顺时针方向,因此,实际上还不太清楚。强制定向,否则将无法分辨出一个小多边形就是那个多边形还是整个世界多边形的内环。在平面上使用geometry数据类型时,不会出现这种混淆,因为外圈和内圈依次排列,并且如果只有一个圈,它将被封闭(无论方向如何),与地球仪不同
来自@mxfh的评论:OGC的OpenGIS简单功能访问(ISO 19125-1)指定自1.2.1版开始的外圈的逆时针方向。来自opengeospatial.org/standards/sfa的文档[OGC 06-103r4] 6.1.11.1/第26页。 2006年最新在版本1.1.0和1.2.0之间引入了更改。您引用的脚注自2005年以来没有更新过
评论
约翰很好回答。我不确定使用节点排序来标识内部环与外部环是否是矢量数据格式可以实现此目标的唯一方法。尽管需要某种机制,但我会同意你的看法。以GeoJSON为例,第一个节点列表被指定为外部,而所有后续列表都是内部孔。这可以(如果不是更多的话)有效地工作。
– WhiteboxDev
2014-10-21 15:38
是的,对于几何图形,WKT也是如此。对于地理位置而言,显然更重要。
–约翰·鲍威尔(John Powell)
2014年10月21日15:40
这是真的;)
– WhiteboxDev
14-10-21在15:42
@WhiteboxDev嵌套环交替缠绕的原因是,用鞋带法计算面积会根据环的方向计算带符号的面积。通常,一阶嵌套环被视为孔,并具有外环的交替方向。它们的贡献面积值为负。其中外圈为正;偶数有序的嵌套环也是如此。因此,所有环形特征的总面积是所有有符号面积的总和。
–mxfh
15年7月28日在9:37
@mxfh:严格来说,“嵌套环的缠绕顺序”对于OCG(和许多其他)多边形……无济于事。在另一个“孔”中表示嵌套多边形的方法是使用MultiPolygon ...,在这种情况下,每个组成的Polygon都遵循原始的缠绕规则。好吧,好吧:这无异于交替缠绕“嵌套的LinearRings” ...但只是指出,允许这样做的不是Polygon本身,而是MultiPolygon的定义。
– Dan H
2015年8月5日在23:21
#2 楼
需要环形(边界)方向,以防止覆盖有限表面的地理坐标系出现歧义,因为边界将沿其方向定义两个区域,即边界的左一和右一。确定这两个区域中哪一个较大是可能的,但仍然存在歧义。 />简单功能访问(ISO 19125-1)
还用于WKT / GML / KML和各种SQL实现中:
外环:逆时针
内环(孔):顺时针方向。
多边形是由1个外部边界和0个或更多内部边界。每个内部边界在“多边形”中定义一个孔。 [...]
外部边界LinearRing定义表面的“顶部”,即表面的侧面,外部边界似乎从该侧面沿逆时针方向横越边界。内部的LinearRing环将具有相反的方向,并且从“顶部”观察时将显示为顺时针方向。...简单功能访问规范重要(相对于shapefile)
对于带孔的多边形,其第一个子元素是其外环,其第二个子元素是其第一内环,其第三个子元素是其第二内环, 等等。 Oracle Spatial
更深的嵌套,也就是一个岛上的一个湖上的小岛,必须表示为MultiPolygons(见图2.10(4)),因为只能有一个外部边界,并且嵌套的深度比内部环要深。
ESRI Shapefiles / SHP:顺时针
内圈:逆时针
多边形由一个或多个环组成。环是四个或更多个点的连接序列,形成一个封闭的,非自相交的环。多边形可以包含多个外环。圆环的顶点顺序或方向指示圆环的哪一侧是多边形的内部。以顶点顺序沿着环行的观察者右侧的邻域是多边形内部的邻域。定义多边形中孔的环的顶点沿逆时针方向。因此,单个环形多边形的顶点始终按顺时针顺序排列。 [...]
点数组中环的顺序并不重要。 ESRI白皮书
由于使用此多边形定义,因此可以在一个岛上的一个湖上岛上配置多个外部边界。从拓扑上讲,湖中的岛屿将是另一个顺时针外环。实际上,这可以使ESRI Shapefile多边形成为简单要素多多边形
如果您未正确排列点,则只会有重叠的多边形。 pyshp
GeoJSON(RFC7946):
注意:原始GeoJSON 2008规范没有强制执行的缠绕顺序
缠绕顺序:外圈是逆时针方向(右手法则)
内圈是顺时针方向的
圈的顺序很重要: >
对于具有多个环的多边形,第一个必须是外部环,其他任何一个都必须是内部环或孔。 GeoJSON规范
TopoJSON:默认情况下强制顺时针旋转外圈
游览:
关于嵌套环的缠绕顺序为何交替的数学推理是,用鞋带公式计算面积(可视化解释)会根据环的方向计算带符号的面积。通常,嵌套环(内部边界)被视为孔,并具有外环的备用方向。它们贡献的签名区域值为负。其中外圈为正。所有环要素的总面积是所有有符号面积的总和。
由ESRI实现,请参见此知识库文章:ArcGIS使用哪种算法确定多边形的面积?
建议的助记符
字母形式的开放端解释为箭头:
形状文件:S→<→↻
简单功能:e→ᘓ(向cc方向向外缠绕)→↺
GeoJSON:G(G的箭头是箭头)→↺
#3 楼
我不知道任何人都能为您的问题提供明确的答案,因为每种矢量文件格式都是不同的,并且每种GIS在内部处理这些数据方面也将有所不同。但我可以肯定地说,顺时针排序不仅适用于ESRI Shapefile。还有其他格式对外圈使用类似的顺时针排序,对内孔多边形使用类似的逆时针排序。例如,JTS矢量多边形结构使用类似的格式。实际上,在此指出,从历史上看,这与ESRI方法相似。我也可以肯定地说,不是,并非所有格式都具有此要求。例如,GeoJSON格式规范对多边形的顶点顺序没有要求。 KML规范实际上规定:for多边形必须按逆时针
顺序指定。多边形遵循“右手规则”,该规则指出,如果您
将右手的手指放在指定
坐标的方向上,则拇指指向大体方向
多边形的几何法线。这是一个狂野的世界!
评论
请注意,KML的“右手法则”通常称为“左手法则”(当您张开双臂行走边界时,左手将进入图形内)。 Esri有多种方法,因为shapefile是唯一使用右手规则的格式(企业级地理数据库在内部使用左手规则,但是“ C” API允许您以任意顺序请求)。 GML仅要求内圈的顺序与外圈的顺序相反,并且第一个圈是外圈。
–文斯
2014年10月21日在16:41
@Vince我不知道。那不是疯子吗?谢谢你让我知道。我认为我最喜欢GML的方法。只要顺序相反,顺序无关紧要。这很有意义。
– WhiteboxDev
2014年10月21日在16:52
评论
这取决于数据的存储方式。 Oracle是反顺时针gis.stackexchange.com/questions/20817/…@Mapperz,您的链接指向docs.oracle.com/cd/B10501_01/appdev.920/a96630/…,其中明确指出了多边形的方向正确。 (外部环边界必须逆时针方向,而内部环边界必须顺时针方向。)这意味着Oracle是逆时针方向。