亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python - 地理分箱 - 地理邊界內的平均值

python - 地理分箱 - 地理邊界內的平均值

一只甜甜圈 2022-08-02 16:55:40
使用如下數據, - 捕獲各種近距離位置的測量值Lat Long    val35.611053   139.628525  -72.8235.61105336 139.6285236 -78.0435.61105373 139.6285223 -72.9935.61105409 139.6285209 -69.0435.61105445 139.6285195 -65.435.61105482 139.6285182 -66.6835.61105518 139.6285168 -65.8235.61105555 139.6285155 -64.4735.61105591 139.6285141 -71.2635.61105627 139.6285127 -68.3635.61105664 139.6285114 -74.4835.611057   139.62851   -74.2735.61105736 139.62851   -77.9735.61105773 139.62851   -68.6635.61105809 139.62851   -70.2135.61105845 139.62851   -76.0535.61105882 139.62851   -88.8335.61105918 139.62851   -73.1735.61105955 139.62851   -67.6335.61105991 139.62851   -71.8535.61106027 139.62851   -77.4235.61106064 139.62851   -71.0835.611061   139.62851   -79.27需要對此數據執行分檔操作 - 即獲取每個0.1x0.1米中所有值的平均值。一種方法是找到邊緣(如NW,SW,NE和SE),并將其劃分為一組0.1x0.1米的網格和每個網格內的查找值,并計算平均值并歸因于網格中心的緯度/經度,以便我們得到如下結果。valLat Long    Mean_val    Sample_count雖然所提議的方法可能很幼稚,但還想知道是否可以有一種基于以下方法的方法:pandas
查看完整描述

1 回答

?
萬千封印

TA貢獻1891條經驗 獲得超3個贊

通過 0.1 m * 0.1 m 面積輕松解決平均數據

為此,您必須將緯度,經度坐標轉換為x,y坐標。


在這里,我使用模塊:utm


x,y,_,_ = utm.from_latlon(latitude, longitude) 

之后,您可以創建一個新列,以分米為單位表示x,y坐標:


def apply_fun (raw):

    x,y,_,_ = utm.from_latlon(raw['Lat'],raw['Long']) 

    return str(np.round(x*10))+"|"+str(np.round(y*10))

然后將其添加到您的數據幀:


x = df.apply(lambda row : apply_fun(row),axis=1)

df.insert(3,'Group',x)

并應用 groupby 函數:


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]

我們完成了!:)


上一個解決方案的泛化

要按 k1 米 * k2 米面積對數據進行分組,只需修改此函數:


def apply_fun (raw):

    x,y,_,_ = utm.from_latlon(raw['Lat'],raw['Long']) 

    return str(np.round(x/k1))+"|"+str(np.round(y/k2)) 

對先前解決方案的批評

正如我之前指出的那樣,為了解決這個問題,我們必須將緯度,long轉換為x,y坐標。


在前面的解決方案中,我將緯度,經度轉換為utm坐標。utm系統是一個制圖投影,將地球劃分為120個區域:60個北部和60個南部。因此,當我們這樣做時:


x,y,area_number,NS = utm.from_latlon(raw['Lat'],raw['Long'])

(x,y)是我們在該地區的位置。我們可以得出結論,當我們的傳感器位于同一UTM區域時,我們的解決方案才有效。(area_number,NS)


我們還可以使用 ECEF 轉換進行此轉換,該轉換直接將緯度,經度轉換為 x,y 坐標。我不知道這些方法的精度,由于我們被要求精確到十分之一米,我更喜歡選擇看起來更準確的utm轉換。


如果要使用 ECEF 方法,請按如下方式完成:


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)


查看完整回答
反對 回復 2022-08-02
  • 1 回答
  • 0 關注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號