从线段创建voronoi图


14

我正在寻找一种基于线段而不是点创建voronoi图的方法。请参见下面的示例(摘自本演示文稿)。

理想情况下,我希望可以使用Python编写脚本,但是使用ArcGIS或类似工具的解决方案也是可以接受的。

线段的voronoi图

到目前为止,我发现的唯一可以做到这一点的库是openvoronoi,它看起来很有希望。还有其他吗?



谢谢。不知道为什么我的搜索中没有出现这个问题。
Snorfalorpagus 2014年

Answers:


5

我们(一个大学团队)使用ArcGIS 10.0插件和ArcObjects为此设计了一个实现。该应用程序是完全免费的。该实现使用栅格方法,该方法以点,线或多边形为输入点,以创建普通的或乘以加权的Voronoi图(或上述方法的组合,即,您可以使用每种形状中的一种,创建从三个不同的要素类)。它仍在开发中,但应该相当稳定,特别是如果您只想做生产线。该插件需要Spatial Analyst许可证才能运行。该代码本身是开源的,因此可以随意使用它。

https://github.com/UNTGeography/VoronoiDiagramsGIS

它使用与@radouxju的答案中所述的“欧几里得分配”类似的方法,并使用“流向/基本”栅格从所得栅格创建矢量多边形。


:对于那些有兴趣的重要组成部分github.com/UNTGeography/VoronoiDiagramsGIS/blob/master/...
Sancarn

3

Voronoï最初是为积分而设计的。我可以针对您的问题设想以下两种方法(引用ArcGIS工具,但有可能使用shapely):

1)

a)沿线创建点(例如,将其压缩然后将顶点设置为线)

b)创建蒂森多边形

c)根据相交的线分解蒂森多边形

2)

a)使用空间分析器,计算对直线的欧几里得分配

b)将每个区域转换为多边形


3

对于一些客户,我和几个同事一直在努力创建2个可以做到这一点的地理处理工具。虽然地理处理工具尚未公开,但我们使用的python和C#是:

C#和python包装器实际上都依赖于C ++ Boost Voronoi API:http : //www.boost.org/doc/libs/1_54_0/libs/polygon/doc/voronoi_main.htm

请注意,API占用大量内存。如果您将地理处理用于64位,ArcGIS Pro或QGIS,则这不是问题。如果您使用的是32位的ArcGIS Desktop,这是一个限制。(40,000行或更多行的详细道路网络应该足以达到内存限制)


1
我实际上已经创建了一个依赖pyvoronoi库的ArcMap和ArcGIS Pro地理处理工具:github.com/fabanc/Boost-Voronoi-For-ArcGIS
Fabien Ancelin 17-10-10

2

ET Geowizards(Arc的插件)为此提供了一个接受折线的工具(请参见下面的屏幕截图)。不幸的是,您将需要许可产品来运行该工具,但我认为它可以解决问题。

在此处输入图片说明


0

另外还有一种使用PostgreSQL / PostGIS解决任务的方法。

如果行短而简单,请运行脚本:

WITH
tbla AS (SELECT (ST_Dump(geom)).geom geom FROM <line_name_table>),
tblb AS (SELECT (ST_DumpPoints(geom)).geom geom FROM tbla
        UNION
        SELECT ST_Centroid(geom) geom FROM tbla),
tblc AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tblb)
SELECT ST_Union(a.geom) geom FROM tblc a JOIN tbla b ON ST_Intersects(a.geom, b.geom) GROUP BY b.geom;

查看结果。

如果行很长,请运行脚本:

WITH
tbla AS (SELECT (ST_Dump(geom)).geom geom FROM <line_name_table>),
tblb AS (WITH btbl AS (SELECT (ST_Dump(geom)).geom geom FROM tbla),
intervals AS (SELECT generate_series (0, 9) as steps)
SELECT steps AS stp, ST_LineInterpolatePoint(geom, steps/(SELECT count(steps)::float-1 FROM intervals)) geom FROM btbl, intervals GROUP BY intervals.steps, geom),
tblc AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tblb)
SELECT ST_Union(a.geom) geom FROM tblc a JOIN tbla b ON ST_Intersects(a.geom, b.geom) GROUP BY b.geom;

查看结果。

如有必要,压缩线上的点数,在我的示例中为10点。

原始解决方案。

该脚本称为:ST_VoronoiDiagramsFromLines。


我还没有运行它,但是看起来它使用几何的顶点创建了voroni多边形,然后如果它们接触原始几何,则将它们合并(并集)。那是对的吗?如果是这样,只要您的原始几何图形具有很多顶点且没有任何长段就可以了。
Snorfalorpagus

测试者:PostgreSQL 11.1,PostGIS 2.5 USE_GEOS = 1 USE_PROJ = 1 USE_STATS = 1 ...
西里尔·米哈尔琴科
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.