在一个国家/地区中生成随机的经/纬多边形?

时间:2019-05-21 07:57:18

标签: c# geolocation gis

我必须生成另一个多边形中具有经/纬度点的随机多边形 (实际上是在美国区域内生成多边形) 是否有人知道可以在多边形内随机生成多边形(例如国家/地区边界)的任何映射API? 还是如何通过代码(C#)创建? 谢谢

1 个答案:

答案 0 :(得分:0)

我的第一个问题是:“什么是随机多边形?”或更确切地说,“什么是随机多边形集?”随机点过程定义非常明确。我怀疑多边形是否会出现这种情况(尽管确实很好奇-因此对于专家,请留下您的评论)。

  • 您是否希望它们的顶点是随机的? 随机点? -在这种情况下,您会得到一些参差不齐的东西 重叠和自我相交?
  • 首先允许多边形相交吗?
  • 是否允许多边形具有孔?如果是,此属性本身是随机的吗?
  • 还有其他属性,例如面积,顶点数量,周长是否遵循概率分布?

您的解决方案取决于您如何回答这些问题。我将提供一种使用PostGIS相对简单的方法(因为这就是我所知道的)。 以下查询从随机点创建Voronoi多边形,进行随机选择,并在可能的情况下合并结果。可以使用两个参数cellsdensity来控制它,它们指定在多少个分区中划分空间以及这些分区中有多少份额构成结果。

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

值增加RAM

注意:我只将params放在CTE中,因此您可以在本机(postgre)SQL中运行查询,而无需将查询包装在plpgsql(DO或{{1} }。结果可能会有点慢。

注意:在查询前面加上CREATE FUNCTION,您会在表中得到结果,准备将其添加为图层,例如QGIS。


结果:

USA with 100000 cells and density of 0.1 (10%) 美国拥有10万个细胞,密度为0.1(10%)

USA with 100000 cells and density of 0.02 (2%) 美国拥有10万个细胞,密度为0.02(2%)

USA with 1000 cells and density of 0.1 (10%) 美国拥有1000个细胞,密度为0.1(10%)


同样,无数种方法中只有一种。但是,如果您希望使用上述解决方案对多边形的形状进行更多控制,则可以通过操纵基础点过程(即编写自己的CREATE TABLE random_polygons AS ...)来实现,以使点更加聚类。或者您创建嵌套的Voronoi图,第二个图的密度比第一个图的密度高得多。

这两种修改都会产生更紧凑但更复杂的“随机”多边形。