使用不同的输入创建形状多边形

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,
)