У меня есть фрейм данных, содержащий координаты широты и долготы в десятичной степени.
Моя цель - объединить данные в прямоугольную сетку размером 1 км². В этом отношении я преобразовал свои координаты в км на основе метода, описанного в Преобразовать широту, долготу в расстояние от экватора в километрах и округлить до ближайшего километра
Метод заключается в вычислении расстояния от опорной точки до точек (широта = 0, долгота) и (широта, долгота = 0).
Но это не работает, потому что это похоже на точку отсчета.
Принимая мою контрольную точку как (lon_ref = mean (lon), lat_ref = mean (lat)), я в конечном итоге собираю те же точки плитки, которые находятся на расстоянии 120 км друг от друга.
Это код, который я использую:
# get the coordinates of my reference point
lat_ref, lon_ref = data["lat"].mean() , data["lon"].mean()
# the distance function
from pyproj import Geod
wgs84_geod = Geod(ellps='WGS84')
format = lambda x: wgs84_geod.inv(lon_ref,lat_ref,0,x)[2]/1000 #km
format = lambda x: wgs84_geod.inv(lon_ref,lat_ref,x,0)[2]/1000 #km
# Apply the function on my dataframe
data["londist"]=data['lon'].map(format)
data["latdist"]=data['lat'].map(format)
# round to the nearest km
step=1 # 1km
to_bin = lambda x: np.round(x / step) * step
data["latbin"] = data['latdist'].map(to_bin)
data["lonbin"] = data['londist'].map(to_bin)
Это работает для некоторых широт и долгих, но не для других,
Пример:
point1 (46.9574,4.29949) # lat,lon in °
point2( 46.9972 ,3.18153)
Рассчитайте расстояние и округление, используя приведенный выше код:
point1 (latbin = 259 , lonbin=5205)
point2(latbin = 259 , lonbin=5205)
Две точки будут суммированы вместе. Однако расстояние между двумя точками составляет 85 км!
dist=wgs84_geod.inv(4.29949,46.9574,3.18153,46.9972)[2]/1000
Как я могу решить эту проблему? Есть ли какой-либо другой эффективный метод для агрегации, учитывая, что у меня есть 10 миллионов широт / долг в моем фрейме данных?