我在shapefile中有数千个形状不规则的多边形。我希望能够将每个多边形划分为三个区域,并指定这些区域的大小(它们与先前的总面积之和)。子多边形的形状无关紧要,因为这是出于可视化目的。

我该怎么做呢?我可以使用一种标准的算法吗?


我考虑的一种方法是获取构成多边形的所有点。然后,我将使用一条直线将两个随机连接在一起,分割多边形,然后检查该区域是否在令人满意的公差范围内。如果太小,我会朝一个方向改变点。如果太大,我将改为相反的方向。

#1 楼

这个问题有许多有效的解决方案。其中之一的工作方式与您的描述有点类似,但是您不必以“随机”位置切片多边形的方式,而是以一种旨在使计算量最小化的方式有目的地做到这一点。这是基本算法。它的输入包括任何平面扫描方向,非零区域的多边形P,零与多边形区域之间的目标区域a和非负阈值t(以面积为单位)。其目的是将垂直于扫掠方向的一条线的P分为两部分,一个部分位于该线的右侧,另一部分则位于该线的左侧,以使右侧区域与目标区域a之间的差为零。大于t。

L是垂直于扫描方向的任何定向线。将f(L)定义为在L右边找到的P的面积减去a。在这些术语中,任务是找到f的零。因为f不太可能是可微的,而是连续的,所以请使用二等分方法,割线方法或(我最喜欢的)布伦特方法。所有这些都很简单,可以保证融合。使用t作为参数的收敛容限。

就这样。让我们考虑一下如何对此进行编码。根本发现是常规的-您可以为其使用通用代码-因此GIS的工作归结为编码f。这样做需要

1.  Splitting the polygon by a line.
2.  Computing the area of the piece(s) to the right of the line.


这两种操作都在几乎所有基于矢量的GIS中实现。如果不是,则可以用一个很大的矩形代替该线,该矩形代表该线右边的半平面。步骤1变为

1'. Clip the polygon to the rectangle.


这是一个非常基本的操作。

要开始查找根,您需要找到一个间隔f的零被保证说谎。这很容易:将多边形的包络线(“边界框”)投影到线扫的方向。投影就是您想要的间隔。

这个问题由来已久。我很早以前就为ArcView 3.x实现了该算法,并在旧的ESRI用户论坛中对其进行了多次描述。 Google


Huber分割多边形网站:forums.esri.com


,用于讨论,链接到代码,增强功能和变化形式(例如分割多边形)分成尽可能紧凑的所需大小的部分)和用于栅格数据的算法。

以下是美国大陆各州的样子(以相等的面积投影),每个州的底部三分之一用阴影表示。显然扫描方向是垂直的。



#2 楼

有一个现成的工具,称为ET Spatial的“ GeoTools”。哪里有一个名为“ ET其他”的工具。在此工具中,有两种分割多边形的方法。按百分比和面积(几个单位,例如平方米,公顷等)。如图所示,此工具从四个侧面(即NESW)中的任意一个分割多边形。我使用了“从上到下”的方法,即从北到南的方法。



#3 楼

ArcGIS Pro 2.3中有一个名为“细分多边形”的新工具。

它允许在给定数量的零件或所需零件区域的情况下对多边形进行分割/细分。