在一个国家/地区生成随机纬度/经度多边形?
Posted
技术标签:
【中文标题】在一个国家/地区生成随机纬度/经度多边形?【英文标题】:Generating a random lat/long -polygons in a country? 【发布时间】:2019-05-21 07:57:17 【问题描述】:我必须在另一个多边形内生成带有纬度/经度点的随机多边形
(实际上,在美国区域内生成多边形)
有谁知道任何可以在多边形内随机生成多边形的映射 API,例如国家边界?
或者也许如何通过代码创建(C#
)?
谢谢
【问题讨论】:
见gis.stackexchange.com/questions/207731/…或***.com/questions/9104908/… Random geographic coordinates (on land, avoid ocean)的可能重复 【参考方案1】:我的第一个问题是:“什么是随机多边形?”或者更准确地说“什么是随机多边形集?”随机点过程的定义非常明确。我怀疑多边形的情况(虽然真的很好奇 - 所以对于专家来说,请留下你的 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。
结果:
美国有 100000 个细胞,密度为 0.1 (10%)
美国有 100000 个细胞,密度为 0.02 (2%)
美国有 1000 个细胞,密度为 0.1 (10%)
同样,这只是无数种方法中的一种。但是,如果您想使用上述解决方案更好地控制多边形的形状,您可以通过操作底层点过程来实现这一点,即编写您自己的ST_GeneratePoints
,这样点就会更加聚集。或者您创建嵌套的 Voronoi 图,第二个的密度比第一个高得多。
这两种修改都会产生更紧凑但更复杂的“随机”多边形。
【讨论】:
以上是关于在一个国家/地区生成随机纬度/经度多边形?的主要内容,如果未能解决你的问题,请参考以下文章