使用不同的输入创建形状多边形
creating shapely polygon with different inputs
我有不同类型的输入来从数据库中形成多边形。我是 python 的新手,学习了用于创建形状的 shapely 包,但在阅读文档后,所有输入都是直截了当的。我的输入如下所示,我尝试转换输入并创建多边形,但想知道天气是执行相同操作的最佳方式,还想知道我们如何使用一些输入创建形状。
input 1: x = [{'lat':90.87898, 'lon': -67.7897878}, {'lat':93.87898, 'lon': -77.7897878}, {'lat':33.87898, 'lon': -47.7897878}]
poly = Polygon([(x[0]['lat'], x[0]['lon']), (x[1]['lat'], x[1]['lon']), (x[2]['lat'], x[2]['lon'])])
有什么最好的方法吗?
input 2: y = '(90.87898,-67.7897878](93.87898, -77.7897878]'
如何使用此输入将其转换为多边形?让我知道上面的输入是错误的,但这是我从 DB 得到的。
您可能需要检查您的数据,纬度大于 90 度是错误的。
Shapely 和 GeoPandas 有一种有效的方法可以做到这一点。首先,使用 Shapely 通过 Python 列表理解构造多边形对象,然后使用 GeoPandas 将其放入 GeoDataFrame。
Shapely 示例 here (below Figure 4) 有助于理解构造多边形的输入格式。人们早期错过的是格式是 'x, y' 所以是 'lon, lat'.
你说你是Python的新手;列表推导很棒,here 是关于列表推导的众多文章之一;示例 4 与此相关。
在 GeoDataFrame 中您可能需要它,也可能不需要它,但它是一种很好的格式,可以在表格和 plotted/map 视图中查看您的数据。在下面的解决方案中,我假设您的坐标是 EPSG 4326。
解决方案
from shapely import geometry
import geopandas as gpd
x = [
{"lat": 90.87898, "lon": -67.7897878},
{"lat": 93.87898, "lon": -77.7897878},
{"lat": 33.87898, "lon": -47.7897878},
]
poly = geometry.Polygon([[p["lon"], p["lat"]] for p in x])
poly = gpd.GeoDataFrame([poly], columns={"geometry"}, crs="EPSG:4326")
display(poly)
在地图上查看
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
poly.plot(ax=ax)
您可以使用 Contextily 之类的东西来添加底图,以进一步帮助在 python 中进行可视化。它会抛出一个错误,因为你给出的纬度 > 90 度,当然上面没有底图,但它仍然会绘制。
import matplotlib.pyplot as plt
import contextily as ctx
fig, ax = plt.subplots()
poly.plot(ax=ax)
ctx.add_basemap(
ax,
crs="epsg:4326",
source=ctx.providers.Esri.WorldShadedRelief,
)
我有不同类型的输入来从数据库中形成多边形。我是 python 的新手,学习了用于创建形状的 shapely 包,但在阅读文档后,所有输入都是直截了当的。我的输入如下所示,我尝试转换输入并创建多边形,但想知道天气是执行相同操作的最佳方式,还想知道我们如何使用一些输入创建形状。
input 1: x = [{'lat':90.87898, 'lon': -67.7897878}, {'lat':93.87898, 'lon': -77.7897878}, {'lat':33.87898, 'lon': -47.7897878}]
poly = Polygon([(x[0]['lat'], x[0]['lon']), (x[1]['lat'], x[1]['lon']), (x[2]['lat'], x[2]['lon'])])
有什么最好的方法吗?
input 2: y = '(90.87898,-67.7897878](93.87898, -77.7897878]'
如何使用此输入将其转换为多边形?让我知道上面的输入是错误的,但这是我从 DB 得到的。
您可能需要检查您的数据,纬度大于 90 度是错误的。
Shapely 和 GeoPandas 有一种有效的方法可以做到这一点。首先,使用 Shapely 通过 Python 列表理解构造多边形对象,然后使用 GeoPandas 将其放入 GeoDataFrame。
Shapely 示例 here (below Figure 4) 有助于理解构造多边形的输入格式。人们早期错过的是格式是 'x, y' 所以是 'lon, lat'.
你说你是Python的新手;列表推导很棒,here 是关于列表推导的众多文章之一;示例 4 与此相关。
在 GeoDataFrame 中您可能需要它,也可能不需要它,但它是一种很好的格式,可以在表格和 plotted/map 视图中查看您的数据。在下面的解决方案中,我假设您的坐标是 EPSG 4326。
解决方案
from shapely import geometry
import geopandas as gpd
x = [
{"lat": 90.87898, "lon": -67.7897878},
{"lat": 93.87898, "lon": -77.7897878},
{"lat": 33.87898, "lon": -47.7897878},
]
poly = geometry.Polygon([[p["lon"], p["lat"]] for p in x])
poly = gpd.GeoDataFrame([poly], columns={"geometry"}, crs="EPSG:4326")
display(poly)
在地图上查看
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
poly.plot(ax=ax)
您可以使用 Contextily 之类的东西来添加底图,以进一步帮助在 python 中进行可视化。它会抛出一个错误,因为你给出的纬度 > 90 度,当然上面没有底图,但它仍然会绘制。
import matplotlib.pyplot as plt
import contextily as ctx
fig, ax = plt.subplots()
poly.plot(ax=ax)
ctx.add_basemap(
ax,
crs="epsg:4326",
source=ctx.providers.Esri.WorldShadedRelief,
)