首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从python中的一组经纬度坐标构建多边形

从python中的一组经纬度坐标构建多边形
EN

Stack Overflow用户
提问于 2019-10-26 11:40:37
回答 1查看 4.2K关注 0票数 1

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

代码语言:javascript
运行
复制
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)

结果是:视图图,点是按经度排列的,函数考虑了这个顺序,但只要绘制的结果显然不是多边形,就不相关了。

EN

回答 1

Stack Overflow用户

发布于 2019-10-26 11:50:17

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

来自文献资料

代码语言:javascript
运行
复制
from scipy.spatial import ConvexHull, convex_hull_plot_2d
points = np.random.rand(30, 2)   # 30 random points in 2-D
hull = ConvexHull(points)

代码语言:javascript
运行
复制
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-')

来策划。

凹壳的概念没有很好的定义。一个可能的定义是阿尔法形状。这些都可以用alphashape包生成。事实上,这些文档包括使用地质公园的例子:

代码语言:javascript
运行
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58570428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档