我從與單個 shapefile 中存在的其他多邊形的交集創建了多邊形:

所以這個 shapefile 的資料框由 4 行組成,具有不同的幾何形狀,每一行對應一個不同的交叉區域多邊形,因此每種顏色對應一行。在此資料框中,有一個“值”列,其中這些行的值顯示在相交多邊形的每個部分中。現在,在另一個 shapefile 中,我有一個點(標記為紅點),其中包含一個值。當覆寫在第一個 shapefile 的頂部時,我們現在看到了這一點,該點在空間上“包含”在 lavender 區域內:

我正在嘗試使用python和geopandas將紅點“空間連接”到薰衣草交叉區域,以便薰衣草交叉區域的當前23值被該點的19值替換,而其他交叉區域的值保持不變。
我一直在嘗試使用 geopandas 的空間連接功能來完成此操作,特別是該.sjoin()功能,但在這里有些困惑,因為當我嘗試將點空間連接到多邊形時,剩下的就是單個薰衣草相交區,而輸出資料框中缺少其他交叉區域(行)。我想這是因為空間連接只留下那些實際上“空間連接”的特征,盡管我想保留所有相交的區域多邊形,只是替換了預期的值。
到目前為止,我已經嘗試過:
point_in_poly = gpd.sjoin(intersected_polygons, point, how='inner', op='contains')
它只產生一個單行的地理資料框。如何增加我的空間連接代碼,以便為我提供所有相交多邊形的地理資料框,但僅將薰衣草交叉區域的“值”值替換為 19,因此四個多邊形行?
uj5u.com熱心網友回復:
- 您沒有提供樣本資料,因此在溶解時生成了 5 個多邊形會生成一個類似于您的影像的圓圈
- 簡單地
sjoin(how="left")是為每個多邊形獲取行的基礎 - 然后只是
fillna()來自多邊形值的點值
# sjoin and replace
gdf_merged = (
gpd.sjoin(gdf_polys, gdf_point, how="left")
.assign(value=lambda d: d["value_right"].fillna(d["value_left"]))
.pipe(
lambda d: d.drop(
columns=[
c for c in d.columns if c.endswith("_left") or c.endswith("_right")
]
)
)
)
形象化

模擬資料
gdf_polys
value geometry
0 23 POLYGON ((-0.10569 51.50166, -0.10708 51.50183...
1 44 POLYGON ((-0.13165 51.50222, -0.13026 51.50205...
2 65 POLYGON ((-0.11911 51.49384, -0.11885 51.49471...
3 77 POLYGON ((-0.11823 51.51004, -0.11849 51.50918...
4 88 POLYGON ((-0.11809 51.51004, -0.11793 51.50916...
gdf_point
value geometry
0 200 POINT (-0.11119 51.50625)
結果
geometry value
0 POLYGON ((-0.10569 51.50166, -0.10708 51.50183... 200.00
1 POLYGON ((-0.13165 51.50222, -0.13026 51.50205... 44.00
2 POLYGON ((-0.11911 51.49384, -0.11885 51.49471... 65.00
3 POLYGON ((-0.11823 51.51004, -0.11849 51.50918... 77.00
4 POLYGON ((-0.11809 51.51004, -0.11793 51.50916... 88.00
完整代碼
import geopandas as gpd
import pandas as pd
from shapely.geometry import Point, MultiPolygon
import matplotlib.pyplot as plt
# construct some geometry that is similar to image
gdf = gpd.read_file(gpd.datasets.get_path("naturalearth_cities")).loc[
lambda d: d["name"].eq("London")
]
utm = gdf.estimate_utm_crs()
S = 1000
p = gdf.to_crs(utm)["geometry"].values[0]
geoms = [
Point(p.x x, p.y y).buffer(S).intersection(p.buffer(S))
for x, y in [[S, S], [-S, -S], [S, -S], [-S, S]]
]
geoms = [p.buffer(S).difference(MultiPolygon(geoms))]
gdf_polys = gpd.GeoDataFrame(
pd.DataFrame({"value": [23, 44, 65, 77, 88]}),
geometry=geoms,
crs=utm,
).to_crs(gdf.crs)
gdf_point = gpd.GeoDataFrame(
pd.DataFrame({"value": [200]}),
geometry=[Point(p.x S // 2, p.y S // 2)],
crs=utm,
).to_crs(gdf.crs)
# sjoin and replace
gdf_merged = (
gpd.sjoin(gdf_polys, gdf_point, how="left")
.assign(value=lambda d: d["value_right"].fillna(d["value_left"]))
.pipe(
lambda d: d.drop(
columns=[
c for c in d.columns if c.endswith("_left") or c.endswith("_right")
]
)
)
)
# visualize
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1 = gdf_polys.plot("value", ax=ax1)
gdf_polys.apply(
lambda x: ax1.annotate(
text=x["value"], xy=x.geometry.centroid.coords[0], ha="center", color="white"
),
axis=1,
)
gdf_point.plot(ax=ax1, color="red")
ax2 = gdf_merged.plot("value", ax=ax2)
ax2.set_yticks([])
gdf_merged.apply(
lambda x: ax2.annotate(
text=x["value"], xy=x.geometry.centroid.coords[0], ha="center", color="white"
),
axis=1,
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/516147.html
上一篇:SQL聯合和合并子集表
