Как преобразовать координаты широты / долготы из градуса в км, чтобы создать сетку в 1 км - PullRequest
0 голосов
/ 07 июня 2019

У меня есть фрейм данных, содержащий координаты широты / долготы в десятичном градусе.

Моя цель - объединить данные в прямоугольную сетку площадью 1 км². В связи с этим я преобразовал свои координаты в км на основе метода, описанного в Преобразование широты, долготы в расстояние от экватора в километрах и округления до ближайшего километра

Метод заключается в расчете расстояния от контрольной точки до точек (широта = 0, долгота) и (широта, долгота = 0).

Но это не работает, потому что кажется, что оно зависит от контрольной точки.

Принимая мою контрольную точку как (lon_ref = среднее (lon), lat_ref = среднее (широта)), я получаю агрегирование в тех же точках плитки, которые находятся на расстоянии 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 миллионов латов / лон в моем фрейме данных?

1 Ответ

0 голосов
/ 08 июня 2019

Похоже, что вы присваиваете переменную format дважды, второе присваивание стирает первое. Вы имели в виду что-то вроде format_lon и format_lat?

Обратите внимание, что как только вы исправите это, результат все равно будет зависеть от контрольной точки - это неизбежно, когда вы проецируете сферические координаты на плоскую карту. Но результат должен быть разумным.

...