【问题标题】:Build a polygon from a set of longitude/latitude coordinates in python从python中的一组经度/纬度坐标构建一个多边形
【发布时间】:2020-02-22 12:13:11
【问题描述】:

我正在尝试从 python 中的一组 long/lat 元组构建一个多边形。通过多边形,我的意思是我需要定义一个包含点的区域,就像一个凹壳。我使用的python代码:

from shapely.geometry import Polygon
import geopandas as gpd
import geoplot

crs = {'init': 'epsg:4326'}
z=[(-88.09614, 42.21828), (-88.09605, 42.21903), (-88.09558, 42.21758), (-88.09466, 42.21857), (-88.09448, 42.2176), (-88.09425999999999, 42.2191), (-88.09406, 42.2186), (-88.09352, 42.21763), (-88.09329, 42.21859), (-88.09317, 42.21907), (-88.09226, 42.218779999999995), (-88.09185, 42.217659999999995), (-88.09176, 42.218779999999995), (-88.09138, 42.217659999999995), (-88.09127, 42.218779999999995), (-88.09094, 42.217620000000004), (-88.0907, 42.2188), (-88.09052, 42.21753), (-88.09005, 42.218709999999994), (-88.08998000000001, 42.2174), (-88.08957, 42.218309999999995), (-88.08889, 42.217290000000006), (-88.08830999999999, 42.21763)]
poly = Polygon(z)
pg=gpd.GeoDataFrame(index=[0], crs=crs, geometry=[poly])
geoplot.polyplot(pg)

结果:view plot 这些点按经度排序,函数会考虑这种排序,但只要绘制的结果显然不是多边形,它就无关紧要。

【问题讨论】:

    标签: python geospatial data-science polygon latitude-longitude


    【解决方案1】:

    多边形可以是但不一定是凸包。在您的情况下,您有一个自相交的多边形,但仍然是一个多边形。如果您的目标是计算凸包,您可以使用scipy.spatial.ConvexHull,它使用 qhull 来计算凸包

    来自the documentation

    from scipy.spatial import ConvexHull, convex_hull_plot_2d
    points = np.random.rand(30, 2)   # 30 random points in 2-D
    hull = ConvexHull(points)
    

    import matplotlib.pyplot as plt
    plt.plot(points[:,0], points[:,1], 'o')
    for simplex in hull.simplices:
        plt.plot(points[simplex, 0], points[simplex, 1], 'k-')
    

    绘制。

    凹形船体的概念不太明确。一种可能的定义是alpha shapes。这些可以使用alphashape package 生成。事实上,文档包括使用 geopandas 的示例:

    import os
    import geopandas
    data = os.path.join(os.getcwd(), 'data', 'Public_Airports_March2018.shp')
    gdf = geopandas.read_file(data)
    
    import cartopy.crs as ccrs
    gdf_proj = gdf.to_crs(ccrs.AlbersEqualArea().proj4_init)
    gdf_proj.plot()
    
    import alphashape
    alpha_shape = alphashape.alphashape(gdf_proj)
    alpha_shape.plot()
    
    import matplotlib.pyplot as plt
    ax = plt.axes(projection=ccrs.PlateCarree())
    ax.scatter([p.x for p in gdf_proj['geometry']],
               [p.y for p in gdf_proj['geometry']],
               transform=ccrs.AlbersEqualArea())
    ax.add_geometries(
        alpha_shape['geometry'],
        crs=ccrs.AlbersEqualArea(), alpha=.2)
    plt.show()
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多