如何从 KML Multigeometry 或至少从多边形中绘制随机点?

How to draw random points from KML Multigeometry or at least Polygons?

我想在由 Multigeometry & Polygons 制作的 KML 国家/地区形状内绘制随机坐标。我尝试从不同的在线 API 获取随机状态点,例如 3geonames,但它们有时与 KML 边界不重合,尤其是对于未能通过我的系统地理学分析初始化的岛国。

在图形轮廓内寻找内部点的任务很简单。所以我不想重新发明轮子,我确信在 python 中应该有任何好的方法可以直接从 kml 中做到这一点?

我还没有发现对我来说很奇怪的准备好的解决方案。尽管如此,还是有一些方便的方法可以使用 geopandas 和 shapely 在 KML 中处理地理数据。

gpd.io.file.fiona.drvsupport.supported_drivers['KML'] = 'rw'

some_map = gpd.read_file(fr'some_map.kml', driver='KML')

def getRandomPoint(map: gpd.geodataframe.GeoDataFrame) -> Tuple[float, float]:
    
    def generateRandomPointOfBox() -> shapely.geometry.point.Point:
        return Point(uniform(minx, maxx), uniform(miny, maxy))
    
    minx, miny, maxx, maxy = map.bounds.values[0]
    point = generateRandomPointOfBox()
    while not map.contains(point).values:
        point = generateRandomPointOfBox()
    return (point.x, point.y)

结果,我们可以看到这是可行的:

points = gpd.GeoSeries([Point(getRandomPoint(some_map)) for _ in range(300)])
points.plot(ax=some_map.plot(), color="red", markersize=4)