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)
添加回答
举报