geopandas reproject 改变向量的范围

geopandas reproject change the extent of the vector

Geopandas 重新投影更改矢量的范围。下面是一个例子,你可以从here

下载矢量文件
# First please download the shp file

import matplotlib.pyplot as plt
import geopandas
from shapely.geometry import Polygon

# Read the file using geopandas
domain = geopandas.read_file("data.shp")

#Create a polygone
polygon = Polygon([(-100,62),(-170,62),(-170,64),(-100,64)])
poly_gdf = geopandas.GeoDataFrame([1], geometry=[polygon], crs=domain.crs)

fig, ax1 = plt.subplots(1, 1, figsize=(12, 8))
domain.plot(ax=ax1)
poly_gdf.boundary.plot(ax = ax1,color="red")

现在让我们重新投影并再次绘制它们:

# Reproject both polygons to Albers Equal Area projection
domain_reproj = domain.to_crs('+proj=aea +lat_1=50 +lat_2=70 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs')
poly_gdf_reproj = poly_gdf.to_crs('+proj=aea +lat_1=50 +lat_2=70 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs')

# And plot them again
fig, ax1 = plt.subplots(1, 1, figsize=(12, 8))
domain_reproj.plot(ax=ax1)
poly_gdf_reproj.boundary.plot(ax = ax1, color = 'red')

将两个多边形重新投影到同一投影系统后,重叠区域会发生变化。黄色圆圈有助于发现差异。我该如何解决这个问题?

Geopandas 只是 re-projecting 多边形中的每个点,即“(-100,62),(-170,62),(-170,64),(-100,64)”而不是沿线投影。

您可以检查 poly_gdf.iloc[0].geometry.wkt 只给您五个点,正如您所期望的那样,在投影地图中由许多小线段组成的宽曲线。

如果您想要一个能够很好地投影的多边形,一种选择是沿着多边形的每条边添加更多点。

正如 Michael 所建议的,您可以使用 shapely 的 interpolate

非常干净地完成此操作
original_polygon = Polygon([(-100,62),(-170,62),(-170,64),(-100,64),(-100,62)])

polygon = Polygon([original_polygon.boundary.interpolate(i, normalized=True) for i in np.linspace(0, 1, 1000)])

poly_gdf = geopandas.GeoDataFrame([1], geometry=[polygon], crs=domain.crs)