我必须生成另一个多边形中具有经/纬度点的随机多边形
(实际上是在美国区域内生成多边形)
是否有人知道可以在多边形内随机生成多边形(例如国家/地区边界)的任何映射API?
还是如何通过代码(C#
)创建?
谢谢
答案 0 :(得分:0)
我的第一个问题是:“什么是随机多边形?”或更确切地说,“什么是随机多边形集?”随机点过程定义非常明确。我怀疑多边形是否会出现这种情况(尽管确实很好奇-因此对于专家,请留下您的评论)。
您的解决方案取决于您如何回答这些问题。我将提供一种使用PostGIS相对简单的方法(因为这就是我所知道的)。
以下查询从随机点创建Voronoi多边形,进行随机选择,并在可能的情况下合并结果。可以使用两个参数cells
和density
来控制它,它们指定在多少个分区中划分空间以及这些分区中有多少份额构成结果。
WITH params AS (
SELECT
(SELECT geom FROM natural_earth_countries WHERE admin = 'United States of America') AS geom,
100000 AS cells,
0.1 AS density
), voronois AS (
SELECT (ST_Dump(ST_VoronoiPolygons(ST_GeneratePoints(p.geom, p.cells), extend_to := p.geom))).geom AS geom
FROM params AS p
), voronois_select AS (
SELECT
ROW_NUMBER() OVER (ORDER BY Random()) % Round(1::NUMERIC/p.density) AS idx,
ST_Intersection(v.geom, p.geom) AS geom
FROM voronois AS v, params AS p
)
SELECT (ST_Dump(ST_Union(geom))).geom AS geom
FROM voronois_select
WHERE idx = 0
注意:ST_VoronoiPolygons
的扩展性不好。您必须为更大的cells
注意:我只将params
放在CTE中,因此您可以在本机(postgre)SQL中运行查询,而无需将查询包装在plpgsql(DO
或{{1} }。结果可能会有点慢。
注意:在查询前面加上CREATE FUNCTION
,您会在表中得到结果,准备将其添加为图层,例如QGIS。
结果:
同样,无数种方法中只有一种。但是,如果您希望使用上述解决方案对多边形的形状进行更多控制,则可以通过操纵基础点过程(即编写自己的CREATE TABLE random_polygons AS ...
)来实现,以使点更加聚类。或者您创建嵌套的Voronoi图,第二个图的密度比第一个图的密度高得多。
这两种修改都会产生更紧凑但更复杂的“随机”多边形。