python - 地理分箱 - 地理边界内的平均值

使用如下数据, - 捕获各种近距离位置的测量值


Lat Long    val

35.611053   139.628525  -72.82

35.61105336 139.6285236 -78.04

35.61105373 139.6285223 -72.99

35.61105409 139.6285209 -69.04

35.61105445 139.6285195 -65.4

35.61105482 139.6285182 -66.68

35.61105518 139.6285168 -65.82

35.61105555 139.6285155 -64.47

35.61105591 139.6285141 -71.26

35.61105627 139.6285127 -68.36

35.61105664 139.6285114 -74.48

35.611057   139.62851   -74.27

35.61105736 139.62851   -77.97

35.61105773 139.62851   -68.66

35.61105809 139.62851   -70.21

35.61105845 139.62851   -76.05

35.61105882 139.62851   -88.83

35.61105918 139.62851   -73.17

35.61105955 139.62851   -67.63

35.61105991 139.62851   -71.85

35.61106027 139.62851   -77.42

35.61106064 139.62851   -71.08

35.611061   139.62851   -79.27

需要对此数据执行分档操作 - 即获取每个0.1x0.1米中所有值的平均值。一种方法是找到边缘(如NW,SW,NE和SE),并将其划分为一组0.1x0.1米的网格和每个网格内的查找值,并计算平均值并归因于网格中心的纬度/经度,以便我们得到如下结果。val


Lat Long    Mean_val    Sample_count

虽然所提议的方法可能很幼稚,但还想知道是否可以有一种基于以下方法的方法:pandas


一只甜甜圈
浏览 127回答 1
1回答

万千封印

通过 0.1 m * 0.1 m 面积轻松解决平均数据为此,您必须将纬度,经度坐标转换为x,y坐标。在这里,我使用模块:utmx,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 pyprojdef 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, zx,y,z = gps_to_ecef_pyproj(raw['Lat'],raw['Long'],0)(我从这里获取代码:https://gis.stackexchange.com/questions/230160/converting-wgs84-to-ecef-in-python)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python