【发布时间】:2019-05-21 07:57:17
【问题描述】:
我必须在另一个多边形内生成带有纬度/经度点的随机多边形
(实际上,在美国区域内生成多边形)
有谁知道任何可以在多边形内随机生成多边形的映射 API,例如国家边界?
或者也许如何通过代码创建(C#)?
谢谢
【问题讨论】:
标签: c# geolocation gis
我必须在另一个多边形内生成带有纬度/经度点的随机多边形
(实际上,在美国区域内生成多边形)
有谁知道任何可以在多边形内随机生成多边形的映射 API,例如国家边界?
或者也许如何通过代码创建(C#)?
谢谢
【问题讨论】:
标签: c# geolocation gis
我的第一个问题是:“什么是随机多边形?”或者更准确地说“什么是随机多边形集?”随机点过程的定义非常明确。我怀疑多边形的情况(虽然真的很好奇 - 所以对于专家来说,请留下你的 cmets)。
您的解决方案取决于您如何回答这些问题。我将提供一个使用 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 不能很好地扩展。您将不得不增加 RAM 以获得更高的 cells 值
注意:我只是将 params 放在 CTE 中,因此您可以在本机 (postgre)SQL 中运行查询,而无需将其包装在 plpgsql(DO 或 CREATE FUNCTION)中。结果可能会慢一些。
注意:在查询前加上 CREATE TABLE random_polygons AS ... 前缀,您就可以在表格中得到结果,可以将其添加为例如图层中的图层。 QGIS。
结果:
同样,这只是无数种方法中的一种。但是,如果您想使用上述解决方案更好地控制多边形的形状,您可以通过操作底层点过程来实现这一点,即编写您自己的ST_GeneratePoints,这样点就会更加聚集。或者您创建嵌套的 Voronoi 图,第二个的密度比第一个高得多。
这两种修改都会产生更紧凑但更复杂的“随机”多边形。
【讨论】: