检测分支多边形形状?


13

我有一个包含数百万个多边形的矢量层,可以连续覆盖。我需要根据它们的形状对其进行分类。我已经在使用景观生态学中的几个形状指标,例如紧密度(4piA / P ^ 2),平均宽度(2A / P),形状编号(P / sqrt(A)),我也看到了计算的圆度/紧凑度的答案多边形?

我的问题是所有这些指标都仅使用面积和周长的某种比率。即使是分形维数索引也仅使用面积和周长(2ln(0.25P)/ ln(A))。但是,如何区分两个具有相同面积和周长但形状完全不同的多边形?像这样的分支多边形A:

分支多边形与弯曲带

我试图以与弯曲的条带B相同的面积和周长进行绘制。我所有已知的索引对于它们都将是相同的。但是对我来说,区分简单的条带(包括弯曲的新月形)和复杂的分支形状非常重要。

我有意将多边形B显示为弯曲的条带,而不是直线的条带,因为我知道相关的外接圆索引可以检测到细长的笔直形状,但是我的多边形也可能具有相同的外接圆。即使我构造凸包并计算面积比Apolygon / Aconvex,在这里也可能非常相似。

那么,如何在矢量数据中自动清晰地区分分支多边形A和多边形B?(将它们转换为栅格将需要非常小的像元大小,巨大的数据集和内存不足,因此这是不可能的)。是否有其他形状索引包含其他参数?理想情况下,该方法不仅可以区分清楚分支的多边形,还可以区分C和D:

在此处输入图片说明

我唯一的想法是构造凸包,然后从其凸包中删除多边形,并计算它留下的(大)块的数量(逐个多边形而不是整个图层擦除多边形)。这可能表明边界的复杂性。

我欢迎数学解决方案/算法,以后将在Python中实现。


1
您不需要太多Python。试试看!形状!。凸包()。symmetricDifference(!shape!)在字段计算器中。首先尝试一个小的子集副本。有关正确的语法,请参见arcpy几何帮助。
FelixIP

这可能是一个很好的问题,但此刻,您正在通过不打结有关QGIS或ArcGIS Desktop的问题来询问多个问题,然后还附带使用Python。精确指定尝试过的内容后,潜在的回答者就可以更轻松地帮助您解决问题。我建议将其重点放在QGIS上,以避免搁浅您的第一个答案。
PolyGeo

1
我的Esri地理数据库中有数据,因为shapefile已经超过2 GB。如果QGIS或某个地方有可行的解决方案,我可以对此做些事情。但是我没有在特定软件中询问。我在问一个度量标准,一种如何数学上检测具有复杂边界(分支)的形状的方法。1个问题。带有公式的科学文章也可以,我会自己考虑如何实现。
nadya

1
我的第一个想法与您的想法相同,着眼于从其凸(或凹)壳中减去原始形状后剩下的多边形的数量和大小之间的差异(另请参见alpha形状)。
user2856

1
如果只有骨架足够快地进行计算,我会使用它来计算4A / PL,骨架的最远节点之间的面积,周长和长度,以实现紧凑性。同样适用于最大内切圆。
FelixIP

Answers:


11

您可以看一下以下方法:骨架化多边形,然后使用唯一的源多边形ID处理与原始多边形相关的线型特征。我猜想有一些猜想(例如,何时将折线视为真正的中心线:折线符合中心线状态的最小长度)。如果单个源多边形的中心线数量大于1,则将其分支。

分支多边形在清理到中心线时将具有多条线,而直多边形可能在中心只有一条大线(实际上与人类的解释相同)。

范例:

  • 绘制Y字母时,至少要使用2个连续笔画(= 2条折线),所以它是分支的,因为最小笔画数> 1。
  • 绘制L字母时,至少要使用1个连续笔画。它没有分支。

此逻辑的更多示例:

  • 当您绘制A时:2笔=分支
  • 当您踩B时:3笔=分支了
  • 当您绘制C时:1笔=未分支
  • 等等

我没有尝试任何东西,只是尝试了逻辑,但我认为它可以工作。

请参阅:在QGIS / Pythonhttp://postgis.net/docs/ST_StraightSkeleton.html中骨架化矢量

要么

例

资料来源:在PostGIS / Python中提取复杂多边形的中心线

编辑:对于情况C和D,您需要已经过滤过的B形状(非分支)。

  • 确保唯一的ID链接了中心线和源多边形。
  • 将多边形转换为折线
  • 用正则点使中心线多义线和边界线多义线致密(不要过多以避免以后出现内存问题,但足以“捕获”不规则的位。
  • 在中心线的点和边界线的点之间创建距离矩阵
  • 仅在ID_centerline = ID_borderline的矩阵行中保留
  • 创建统计信息以具有标准偏差值
  • 设置一个界限值,以针对高SD值指示其为非常规轮廓,并为每个唯一ID创建所需的指标
  • 通过在唯一ID的基础上加入字段,使指示器返回原始多边形。

谢谢您的创意,我将尝试创建中心线
nadya

只是,区分我的多边形C和D的问题仍然存在
nadya

您可能需要针对不同情况使用不同的方法并分担工作。一旦有了非分支多边形(B),就可以优化B来尝试找到C和D。问题是我看不到用来区分C和D的逻辑。您可能必须用标准。
gisnside

1
C和D之间的差异似乎在于,在C中,多边形的边距中心线大约均匀距离,而在D中,边距中心线不均匀距离。
csk

1
@csk我明白了。我猜将其翻译成代码将是计算中心线和边界线之间的距离的统计数据。通过用更多点压实边界多段线,然后将该边界转换为点+与中心线上的等效作业保持一定距离,即可得出有关此行为的统计信息。如果标准偏差高,则形状可能会不规则。很难看到如何在多边形上做这件事……在那里很好的挑战
gisnside
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.