模糊最小粗共分割算法


9

给定形状的两个不同分区(出于论证的考虑,一个国家的两个不同行政区划),我如何才能找到一个新的分区,使这两个分区都适合,从而允许(并优化)某些错误?

例如,忽略该错误,我想要一个执行此操作的算法:

非模糊版本

也许有助于用设定的术语表达这一点。使用以下编号:

我可以将上面的分区表示为:

A = {{1},{2},{3,4,7,8},{5},{6},{9,10,13,14},{11},{12},{15} ,{16}}

B = {{1,2,5,6},{3},{4},{7},{8},{9},{10},{13},{14},{11,15} ,{12,16}}

点B = {{1,2,5,6},{3,4,7,8},{9,10,13,14},{11,15},{12,16}}

并且产生A点B的算法似乎很简单(类似,如果两个元素在A(B)中的分区中合并在一起,则将它们在B(A)中的分区合并-重复直到A和B相等。

但是,现在想象一下,这两个分区之间的某些行略有不同,因此不可能找到完美的答案,而是我希望最佳答案受制于最小化某些错误准则。

举一个新的例子:

在左列,我们有两个没有公共线的分区(除了外部边框本身)。上述唯一可能的解决方案是琐碎的解决方案,即右栏。但是,如果我们允许“模糊”解决方案,那么中间一栏可能是允许的,比如说竞争总面积的5%(即分配给每个粗化分区中的不同子区域)。因此,我们可以将中间列描述为表示“误差小于5%的最小粗略公共分区”。

那么,实际答案是顶部行,中间列还是中间行,中间列中的分区,或者介于两者之间的分区,就不那么重要了。


我不明白你的操作。看来您正在寻找两个分区的通用粗化。但是,如果没有其他标准,通常会有很多解决方案。例如,既然粗化(而不是细化)是您的目标,那么为什么要停在原地呢?为什么不只画公共边界正方形呢?
ub

1
谢谢,我贴错了标签。我认为我的意思是最好的通用分区,或者说是“最小的”。
EconAndrew

在这种情况下,结果看起来将与您绘制的结果完全不同。这将是4 x 4的棋盘正方形。从这个示例中,我无法推断出您要遵循的规则。也许您正在尝试使所有输入功能的所有优势都保持一致?您要解决的实际问题是什么?你能提供一个具体的例子来帮助我们理解你的问题应该是?
ub

我已经详细说明了-也许会有所帮助。的确,在模糊情况下我无法精确地说明我的问题,但我认为在确切情况下我确切地知道了我的意思(即使我没有很好地表达问题)。
EconAndrew

感谢您的努力(+1)。在您的集合论的符号而言,一个区域的分区形成偏序集:分区一个是一个细化一个,在每个组一个是在的一个子集。您的合并操作似乎是AB的最好的普通粗化。解决您的模糊版本的一种方法是利用GIS的功能来消除悬垂和碎片,以纠正两层之间的细微差异,然后执行非模糊操作。
whuber

Answers:


2

您可以通过评估多边形边界与其边界之间的对称差异之差或符号表示为:

Difference(a, SymDifference(a, b))

取几何ab,在接下来的两行和图像上表示为MultiLinestrings:

MULTILINESTRING((0 300,50 300,50 250,0 250,0 300),(50 300,100 300,100 250,50 250,50 300),(0 250,50 250,50 200,0 200,0 250),(50 250,100 250,100 200,50 200,50 250),(100 300,200 300,200 200,100 200,100 300),(0 200,100 200,100 100,0 100,0 200),(100 200,150 200,150 150,100 150,100 200),(150 200,200 200,200 150,150 150,150 200),(100 150,150 150,150 100,100 100,100 150),(150 150,200 150,200 100,150 100,150 150))
MULTILINESTRING((0 300,100 300,100 200,0 200,0 300),(100 300,150 300,150 250,100 250,100 300),(150 300,200 300,200 250,150 250,150 300),(100 250,150 250,150 200,100 200,100 250),(150 250,200 250,200 200,150 200,150 250),(0 200,50 200,50 150,0 150,0 200),(50 200,100 200,100 150,50 150,50 200),(0 150,50 150,50 100,0 100,0 150),(50 150,100 150,100 100,50 100,50 150),(100 200,150 200,150 100,100 100,100 200),(150 200,200 200,200 100,150 100,150 200))

一个 b

ab的部分不相交的对称差为:

MULTILINESTRING((50 300,50 250),(50 250,0 250),(100 250,50 250),(50 250,50 200),(150 150,100 150),(200 150,150 150),(150 300,150 250),(150 250,100 250),(200 250,150 250),(150 250,150 200),(50 200,50 150),(50 150,0 150),(100 150,50 150),(50 150,50 100))

Symdiff

最后,评估ab与对称差之间的差:

MULTILINESTRING((0 300,50 300),(0 250,0 300),(50 300,100 300),(100 300,100 250),(50 200,0 200),(0 200,0 250),(100 250,100 200),(100 200,50 200),(100 300,150 300),(150 300,200 300,200 250),(200 250,200 200),(200 200,150 200),(150 200,100 200),(100 200,100 150),(100 150,100 100),(100 100,50 100),(50 100,0 100,0 150),(0 150,0 200),(150 200,150 150),(200 200,200 150),(150 150,150 100),(150 100,100 100),(200 150,200 100,150 100))

diff_symdiff

您可以在GEOS(Shapely,PostGIS等),JTS等中实现此逻辑。请注意,如果输入几何是多边形,则需要提取其边界,并且可以将结果多边形化。例如,与PostGIS一起显示,取两个MultiPolygons,然后得到一个MultiPolygon结果:

SELECT
  ST_AsText(ST_CollectionHomogenize(ST_Polygonize(
    ST_Difference(ST_Boundary(A), ST_SymDifference(ST_Boundary(A), ST_Boundary(B)))
  ))) AS result
FROM (
  SELECT 'MULTIPOLYGON(((0 300,50 300,50 250,0 250,0 300)),((50 300,100 300,100 250,50 250,50 300)),((0 250,50 250,50 200,0 200,0 250)),((50 250,100 250,100 200,50 200,50 250)),((100 300,200 300,200 200,100 200,100 300)),((0 200,100 200,100 100,0 100,0 200)),((100 200,150 200,150 150,100 150,100 200)),((150 200,200 200,200 150,150 150,150 200)),((100 150,150 150,150 100,100 100,100 150)),((150 150,200 150,200 100,150 100,150 150)))'::geometry AS a,
    'MULTIPOLYGON(((0 300,100 300,100 200,0 200,0 300)),((100 300,150 300,150 250,100 250,100 300)),((150 300,200 300,200 250,150 250,150 300)),((100 250,150 250,150 200,100 200,100 250)),((150 250,200 250,200 200,150 200,150 250)),((0 200,50 200,50 150,0 150,0 200)),((50 200,100 200,100 150,50 150,50 200)),((0 150,50 150,50 100,0 100,0 150)),((50 150,100 150,100 100,50 100,50 150)),((100 200,150 200,150 100,100 100,100 200)),((150 200,200 200,200 100,150 100,150 200)))'::geometry AS b
) AS f;
                               result
--------------------------------------------------------------------------------
MULTIPOLYGON(((0 300,50 300,100 300,100 250,100 200,50 200,0 200,0 250,0 300)),((100 250,100 300,150 300,200 300,200 250,200 200,150 200,100 200,100 250)),((0 200,50 200,100 200,100 150,100 100,50 100,0 100,0 150,0 200)),((150 200,200 200,200 150,200 100,150 100,150 150,150 200)),((100 200,150 200,150 150,150 100,100 100,100 150,100 200)))

请注意,我尚未广泛测试此方法,因此请以这些为起点。


您能否明确说明该算法如何处理所问问题的模糊版本,或者如何适应该版本?
ub

0

无错误算法。

第一组: 在此处输入图片说明 第二组: 在此处输入图片说明

合并2组并按区域降序排列。选择表中的行(顶部=>向下),直到总面积=总面积(在这种情况下为16):

在此处输入图片说明

选定的行可以回答:

在此处输入图片说明

该标准将是累计面积与实际总数之间的差。


看起来只有在非常特殊的情况下它才能正常工作。您如何保证最终得到公共区域的不重叠,详尽的分区?
ub

正确。附加步骤a)就arcgis Union工具而言的工会数据集b)从合并表中获取第一个最大值,并检查内部的其他分数c)移除分数阈值较大(例如90%)的其他分数。这怎么样?
FelixIP

我不知道,因为我还没有弄清楚问题到底在问什么。
whuber

使用最大可能的块补足面积。这是我对问题的理解
FelixIP

解决方案是使用单个块(将它们全部合并)!
ub
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.