1 回答

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊
通過 0.1 m * 0.1 m 面積輕松解決平均數(shù)據(jù)
為此,您必須將緯度,經(jīng)度坐標(biāo)轉(zhuǎn)換為x,y坐標(biāo)。
在這里,我使用模塊:utm
x,y,_,_ = utm.from_latlon(latitude, longitude)
之后,您可以創(chuàng)建一個(gè)新列,以分米為單位表示x,y坐標(biāo):
def apply_fun (raw):
x,y,_,_ = utm.from_latlon(raw['Lat'],raw['Long'])
return str(np.round(x*10))+"|"+str(np.round(y*10))
然后將其添加到您的數(shù)據(jù)幀:
x = df.apply(lambda row : apply_fun(row),axis=1)
df.insert(3,'Group',x)
并應(yīng)用 groupby 函數(shù):
gdf = df.groupby(['Group']).agg({"Lat":["mean"],"Long":["mean","count"],"val":["mean"]})
gdf = gdf.reset_index().drop(columns=['Group'],level=0)
gdf.columns = [' '.join(col) for col in gdf.columns]
我們完成了!:)
上一個(gè)解決方案的泛化
要按 k1 米 * k2 米面積對(duì)數(shù)據(jù)進(jìn)行分組,只需修改此函數(shù):
def apply_fun (raw):
x,y,_,_ = utm.from_latlon(raw['Lat'],raw['Long'])
return str(np.round(x/k1))+"|"+str(np.round(y/k2))
對(duì)先前解決方案的批評(píng)
正如我之前指出的那樣,為了解決這個(gè)問題,我們必須將緯度,long轉(zhuǎn)換為x,y坐標(biāo)。
在前面的解決方案中,我將緯度,經(jīng)度轉(zhuǎn)換為utm坐標(biāo)。utm系統(tǒng)是一個(gè)制圖投影,將地球劃分為120個(gè)區(qū)域:60個(gè)北部和60個(gè)南部。因此,當(dāng)我們這樣做時(shí):
x,y,area_number,NS = utm.from_latlon(raw['Lat'],raw['Long'])
(x,y)是我們?cè)谠摰貐^(qū)的位置。我們可以得出結(jié)論,當(dāng)我們的傳感器位于同一UTM區(qū)域時(shí),我們的解決方案才有效。(area_number,NS)
我們還可以使用 ECEF 轉(zhuǎn)換進(jìn)行此轉(zhuǎn)換,該轉(zhuǎn)換直接將緯度,經(jīng)度轉(zhuǎn)換為 x,y 坐標(biāo)。我不知道這些方法的精度,由于我們被要求精確到十分之一米,我更喜歡選擇看起來更準(zhǔn)確的utm轉(zhuǎn)換。
如果要使用 ECEF 方法,請(qǐng)按如下方式完成:
import pyproj
def gps_to_ecef_pyproj(lat, lon, alt):
ecef = pyproj.Proj(proj='geocent', ellps='WGS84', datum='WGS84')
lla = pyproj.Proj(proj='latlong', ellps='WGS84', datum='WGS84')
x, y, z = pyproj.transform(lla, ecef, lon, lat, alt, radians=False)
return x, y, z
x,y,z = gps_to_ecef_pyproj(raw['Lat'],raw['Long'],0)
(我從這里獲取代碼:https://gis.stackexchange.com/questions/230160/converting-wgs84-to-ecef-in-python)
添加回答
舉報(bào)