1 回答

TA貢獻(xiàn)1848條經(jīng)驗 獲得超6個贊
要使用庫來計算距離,您需要在統(tǒng)一系統(tǒng)上。來自谷歌,我相信你正在使用epsg:21781
首先使用標(biāo)準(zhǔn)化坐標(biāo)系
pyproj
做顏色和形狀的笛卡爾積
使用計算這些之間的距離
geopy
您現(xiàn)在可以選擇您想要的結(jié)果行。舉個例子,我在按顏色和形狀分組時采取了最近的做法
import pyproj, geopy.distance
df1 = pd.DataFrame({'Ecode': [2669827.294, 2669634.483, 2669766.266, 2669960.683],
'Ncode': [1261034.528, 1262412.587, 1261209.646, 1262550.374],
'shape': ['square', 'square', 'triangle', 'circle']})
df2 = pd.DataFrame({'CoorE': [2669636, 2669765, 2669827, 2669961],
'CoorN': [1262413, 1261211, 1261032, 1262550],
'color': ['purple', 'blue', 'blue', 'yellow']})
# assuming this co-ord system https://epsg.io/21781 then mapping to https://epsg.io/4326
sc = pyproj.Proj("epsg:21781")
dc = pyproj.Proj("epsg:4326")
df1 = df1.assign(
shape_gps=lambda x: x.apply(lambda r: pyproj.transform(sc, dc, r["Ecode"], r["Ncode"]), axis=1)
)
df2 = df2.assign(
color_gps=lambda x: x.apply(lambda r: pyproj.transform(sc, dc, r["CoorE"], r["CoorN"]), axis=1)
)
(df1
.assign(foo=1)
.merge(df2.assign(foo=1), on="foo")
.assign(distance=lambda x: x.apply(lambda r:
geopy.distance.geodesic(r["color_gps"], r["shape_gps"]).km, axis=1))
.sort_values("distance")
.groupby(["color","shape"]).agg({"distance":"first","CoorE":"first","CoorN":"first"})
)
為最近的合并更新
如果你選擇一個參考點(diǎn)來計算距離,你會得到你想要的。
import pyproj, geopy.distance
df1 = pd.DataFrame({'Ecode': [2669827.294, 2669634.483, 2669766.266, 2669960.683],
'Ncode': [1261034.528, 1262412.587, 1261209.646, 1262550.374],
'shape': ['square', 'square', 'triangle', 'circle']})
df2 = pd.DataFrame({'CoorE': [2669636, 2669765, 2669827, 2669961],
'CoorN': [1262413, 1261211, 1261032, 1262550],
'color': ['purple', 'blue', 'blue', 'yellow']})
# assuming this co-ord system https://epsg.io/21781 then mapping to https://epsg.io/4326
sc = pyproj.Proj("epsg:21781")
dc = pyproj.Proj("epsg:4326")
# pick a reference point for use in diatnace calcs
refpoint = pyproj.transform(sc, dc, df1.loc[0,["Ecode"]][0], df1.loc[0,["Ncode"]][0])
df1 = df1.assign(
shape_gps=lambda x: x.apply(lambda r: pyproj.transform(sc, dc, r["Ecode"], r["Ncode"]), axis=1),
distance=lambda x: x.apply(lambda r: geopy.distance.geodesic(refpoint, r["shape_gps"]).km, axis=1),
).sort_values("distance")
df2 = df2.assign(
color_gps=lambda x: x.apply(lambda r: pyproj.transform(sc, dc, r["CoorE"], r["CoorN"]), axis=1),
distance=lambda x: x.apply(lambda r: geopy.distance.geodesic(refpoint, r["color_gps"]).km, axis=1),
).sort_values("distance")
# no cleanup of columns but this works
pd.merge_asof(df1, df2, on="distance", direction="nearest")
添加回答
舉報