Преобразовать широту, долготу в расстояние от экватора в километрах и округлить до ближайшего километра

Для каждой имеющейся у меня координаты я нахожу расстояние от экватора в километрах, что дает мне два расстояния:

from pyproj import Geod
wgs84_geod = Geod(ellps='WGS84')    
_,_, lon_dist = wgs84_geod.inv(0, 0,lon, 0)
_,_, lat_dist = wgs84_geod.inv(0, 0,0, lat)

В качестве проверки работоспособности я могу пересчитать исходную координату из этих значений следующим образом (предположим, что направление от координаты экватора (0,0) - север и запад:

_, new_lat, _ = wgs84_geod.fwd(0,0, 0, lat_dist)
new_lon, _, _ = wgs84_geod.fwd(0, 0, 90, lon_dist)

Это возвращает мне те же координаты, с которых я начал.

Теперь я хочу найти ближайшую к моей координате точку в километре. Я округляю lon_dist и lat_dist до километров от значений экватора.

lat_km_dist = round(lat_dist/1000)*1000 #to nearest km and back to meters
lon_km_dist = round(lon_dist/1000)*1000 

Я получаю координаты, используя эти расстояния так же, как и раньше

_, km_lat, _ = wgs84_geod.fwd(0,0, 0, lat_km_dist)
km_lon, _, _ = wgs84_geod.fwd(0, 0, 90, lon_km_dist)

Логика должна заключаться в том, что для нескольких координат в одной и той же области ближайшее расстояние между любой парой km_lat, km_lon должно быть 1 км. Это верно для оси Север / Юг, но для долгот расстояние меняется в зависимости от того, на какой широте я нахожусь. Я прилагаю два снимка экрана, чтобы наглядно представить проблему, где координаты km_lat, km_lon представлены черными кружками в центре многоугольников площадью 1 км.

Как я могу это исправить?

Копенгаген

Сан-Франциско


person clurhur    schedule 08.03.2017    source источник


Ответы (1)


По сути, этот алгоритм строит эквидистантную сетку (с точками на расстоянии 1 км) на экваторе (широта = 0) и главном меридиане (долгота = 0). Затем он эффективно строит сетку на эллипсоиде как декартово произведение этих точек.

Однако координаты широты и долготы не образуют декартовой системы отсчета, результирующие параллели / меридианы, генерируемые этими точками сетки, определяют «квадраты», размер которых зависит не только от конкретной долготы, но и от широты. На идеальной сфере это будет работать в направлении север-юг, поскольку тогда сетка на равном расстоянии (с точки зрения расстояния по большому кругу) на lon = 0 также равноудалена по широте (разница в широте равна разнице в расстоянии на радиус сферы).

Другими словами, если вы зафиксируете две широты lat1, lat2 и для определенной долготы lon переместитесь с (lat1, lon), (lat2, lon) на 1 км, скажем, в западном направлении, то эти вновь полученные точки не будут иметь одинаковой долготы ...

Я не совсем уверен, чего вы пытаетесь достичь, но если цель состоит в том, чтобы получить некоторые репрезентативные точки не слишком близко друг к другу, тогда, возможно, иерархическая кластеризация с точки зрения расстояния по дуге большого круга может дать разумные результаты ...

РЕДАКТИРОВАТЬ:

В качестве приблизительного обходного пути вы, скорее всего, можете уйти, выбрав другую контрольную точку, чем (0, 0) - новая контрольная точка не должна находиться слишком далеко от области, которую вы пытаетесь описать (что-то вроде "нижнего левого" угла интересующей области). Если вся интересующая область не покрывает значительную часть земного шара (большой диапазон широт), расхождения будут довольно небольшими, так что они, вероятно, будут почти незаметны в визуализации GoogleMaps ...

Так что если вас интересует Дания (судя по скриншотам), то может сработать что-то вроде следующего:

lat_ref, lon_ref = 53.637976, 6.694138

_,_, lon_dist = wgs84_geod.inv(lon_ref,lat_ref, lon, 0)
_,_, lat_dist = wgs84_geod.inv(lon_ref,lat_ref, 0, lat)

lat_km_dist = round(lat_dist/1000)*1000 #to nearest km and back to meters
lon_km_dist = round(lon_dist/1000)*1000


_, km_lat, _ = wgs84_geod.fwd(lon_ref,lat_ref,  0, lat_km_dist)
km_lon, _, _ = wgs84_geod.fwd(lon_ref,lat_ref, 90, lon_km_dist)
person ewcz    schedule 08.03.2017
comment
Как вы говорите, цель состоит в том, чтобы сократить большое количество координат до меньшего числа репрезентативных точек. Это необходимо, чтобы это не зависело от набора данных, поэтому при разных координатах в одной и той же области основная сетка не изменится. По этой причине я не хочу использовать кластеризацию. Есть ли способ учесть влияние широты на долготу в этом методе? - person clurhur; 08.03.2017
comment
@clurhur, вы можете попробовать изменить точку отсчета - я включил пример ... - person ewcz; 08.03.2017
comment
Спасибо за это. Я пробовал этот подход, и он приближает меня к дистанции в 1 км, которую я хочу. Сложность в том, что это зависит от знания этих опорных координат. Поскольку я хочу использовать этот метод в любой точке мира, для этого потребуется собрать много таких ссылок. Я видел список центров страны, но для стран, которые охватывают большую территорию Север / Юг, возникает та же проблема. - person clurhur; 08.03.2017
comment
@clurhur, может быть, что-нибудь в этом роде? stackoverflow.com/questions/9600801 / - person ewcz; 08.03.2017
comment
Спасибо за советы @ewcz. Я решил использовать одну из исходных координат в качестве центра вместо начала координат (0,0). - person clurhur; 13.03.2017