Расстояние между двумя точками в Москве
-
- Новоприбывший
- Сообщения: 4
- Зарегистрирован: 08 июн 2021, 22:59
- Репутация: 0
- Откуда: Москва
Расстояние между двумя точками в Москве
Коллеги, здравствуйте!
Стоит простая задача: определить расстояние между двумя точками, которые заданы широтой и долготой в градусах, в километрах/метрах.
Работа идет на python, но, если вы знаете решение даже не этом языке, буду очень признателен за помощь.
Например, есть 2 точки: 55.076255, 38.747688 и 55.044887, 38.82657.
В яндекс картах расстояние равняется примерно 6 км.
Пример кода:
from shapely.geometry import Point, Polygon
import geopandas
# задаю первую точку, указывая, что формат координат - градусы
t = geopandas.GeoSeries([Point(55.076255, 38.747688, )], crs={
'init': 'epsg:4326'})
# задаю первую точку, указывая, что формат координат - градусы
t2 = geopandas.GeoSeries([Point(55.044887, 38.82657, )], crs={
'init': 'epsg:4326'})
t = t.to_crs(3576) # перевожу координаты в километры для EPSG:3576
t2 = t2.to_crs(3576) # перевожу координаты в километры для EPSG:3576
d = t.distance(t2) # выдает 8456.313775
Если менять стандарт EPSG:3576 на другие из https://spatialreference.org/ref/?search=Russia
то выдает 10-11-12 км, но никак не 6.
Подскажите, пожалуйста, в чем может быть ошибка?
Стоит простая задача: определить расстояние между двумя точками, которые заданы широтой и долготой в градусах, в километрах/метрах.
Работа идет на python, но, если вы знаете решение даже не этом языке, буду очень признателен за помощь.
Например, есть 2 точки: 55.076255, 38.747688 и 55.044887, 38.82657.
В яндекс картах расстояние равняется примерно 6 км.
Пример кода:
from shapely.geometry import Point, Polygon
import geopandas
# задаю первую точку, указывая, что формат координат - градусы
t = geopandas.GeoSeries([Point(55.076255, 38.747688, )], crs={
'init': 'epsg:4326'})
# задаю первую точку, указывая, что формат координат - градусы
t2 = geopandas.GeoSeries([Point(55.044887, 38.82657, )], crs={
'init': 'epsg:4326'})
t = t.to_crs(3576) # перевожу координаты в километры для EPSG:3576
t2 = t2.to_crs(3576) # перевожу координаты в километры для EPSG:3576
d = t.distance(t2) # выдает 8456.313775
Если менять стандарт EPSG:3576 на другие из https://spatialreference.org/ref/?search=Russia
то выдает 10-11-12 км, но никак не 6.
Подскажите, пожалуйста, в чем может быть ошибка?
-
- Гуру
- Сообщения: 4057
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1054
- Ваше звание: программист
- Откуда: Казань
Re: Расстояние между двумя точками в Москве
ошибки нет, вы считаете в проекциях, которые все искажают (углы, площади, и расстояния).
EPSG:3576 - это Lambert azimuthal equal-area projection, для полярный районов, зачем она в Москве - непонятно; проекция обещала сохранять площади (в приполярье), но не расстояния в Москве.
Для расстоний нужно либо что-то равнопромежуточное, либо (для малых расстояний) поперечную Меркатора (UTM , или Гаусса-Крюгера, с нужной зоной), либо считать по большой дуге прямо на нужном глобусе. У Москвы зона вроде 7 для ГК, и 37 для UTM, EPSG:28407 и EPSG:32637 соответственно.
Яндекс скорее всего не заморачивается, и считает на сфере, а не на эллипсоиде, RTFM
-
- Гуру
- Сообщения: 1088
- Зарегистрирован: 30 окт 2014, 16:33
- Репутация: -248090259
- Откуда: г. Жуковский МО
Re: Расстояние между двумя точками в Москве
gamm, Мне кажется, ТС нет необходимости изучать основы. Достаточно ввести подходящую СК, как Вы и сказали. Я правда склоняюсь к СК-95. В GM получил такой результат:
alexber10, Судя по всему, данные об СК Вы берете с EPSG.org? Если да - просто в поиске введите код EPSG 20007. Получите данные во всех мыслимых форматах.
-
- Гуру
- Сообщения: 4057
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1054
- Ваше звание: программист
- Откуда: Казань
-
- Новоприбывший
- Сообщения: 4
- Зарегистрирован: 08 июн 2021, 22:59
- Репутация: 0
- Откуда: Москва
Re: Расстояние между двумя точками в Москве
Добрый день. Спасибо за ваши ответы!
Для ESPG 28407, 32637, 20007, которые вы указали, получаются следующие результаты для точек (55.076255, 38.747688) и (55.044887, 38.82657):
ESPG:28407 - 9392.982745 км
ESPG:32637 - 9389.225352 км
ESPG:20007 - 9392.989983 км
Думаю, тут проблема в библиотеке, которую использую.
Зато по этой ссылке
Видимо, тут можно считать в лоб, хотя еще погуглю библиотеки.
Для ESPG 28407, 32637, 20007, которые вы указали, получаются следующие результаты для точек (55.076255, 38.747688) и (55.044887, 38.82657):
ESPG:28407 - 9392.982745 км
ESPG:32637 - 9389.225352 км
ESPG:20007 - 9392.989983 км
Думаю, тут проблема в библиотеке, которую использую.
Зато по этой ссылке
, решая обратную геодезическую задачу, получаю правильный результат 6.11 км для точек 55.076255, 38.747688) и (55.044887, 38.82657)!
Видимо, тут можно считать в лоб, хотя еще погуглю библиотеки.
Использовал https://spatialreference.org/ref/?search=Russia. Теперь буду и ваш сайт использовать.
-
- Новоприбывший
- Сообщения: 4
- Зарегистрирован: 08 июн 2021, 22:59
- Репутация: 0
- Откуда: Москва
Re: Расстояние между двумя точками в Москве
Пример кода, вдруг кому-то пригодится.
Расчет расстояния до МКАДА через обратную геодезическую задачу
import math
a_e = 6371.0
def spherToCart(lat, lon):
x = math.cos(lat) * math.cos(lon)
y = math.cos(lat) * math.sin(lon)
z = math.sin(lat)
return (x, y, z)
def inverse(lat1, lon1, lat2, lon2):
x, y, z = spherToCart(lat2, lon2)
x, y = rotate(x, y, lon1)
z, x = rotate(z, x, math.pi / 2 - lat1)
lat, lon = cartToSpher(x, y, z)
dist = math.pi / 2 - lat
azi = math.pi - lon
return (dist, azi)
def rotate(x, y, a):
c = math.cos(a)
s = math.sin(a)
u = x * c + y * s
v = -x * s + y * c
return (u, v)
def cartToSpher(x, y, z):
lat = math.atan2(z, math.sqrt(x * x + y * y))
lon = math.atan2(y, x)
return (lat, lon)
lat1, lon1, lat2, lon2 = 55.621506, 37.786676, 55.044887, 38.82657
lat1 = math.radians(lat1)
lon1 = math.radians(lon1)
lat2 = math.radians(lat2)
lon2 = math.radians(lon2)
dist, azi2 = inverse(lat2, lon2, lat1, lon1)
dist, azi1 = inverse(lat1, lon1, lat2, lon2)
print("%f %f %.4f" % (math.degrees(azi1), math.degrees(azi2), dist * a_e))
Расчет расстояния до МКАДА через обратную геодезическую задачу
import math
a_e = 6371.0
def spherToCart(lat, lon):
x = math.cos(lat) * math.cos(lon)
y = math.cos(lat) * math.sin(lon)
z = math.sin(lat)
return (x, y, z)
def inverse(lat1, lon1, lat2, lon2):
x, y, z = spherToCart(lat2, lon2)
x, y = rotate(x, y, lon1)
z, x = rotate(z, x, math.pi / 2 - lat1)
lat, lon = cartToSpher(x, y, z)
dist = math.pi / 2 - lat
azi = math.pi - lon
return (dist, azi)
def rotate(x, y, a):
c = math.cos(a)
s = math.sin(a)
u = x * c + y * s
v = -x * s + y * c
return (u, v)
def cartToSpher(x, y, z):
lat = math.atan2(z, math.sqrt(x * x + y * y))
lon = math.atan2(y, x)
return (lat, lon)
lat1, lon1, lat2, lon2 = 55.621506, 37.786676, 55.044887, 38.82657
lat1 = math.radians(lat1)
lon1 = math.radians(lon1)
lat2 = math.radians(lat2)
lon2 = math.radians(lon2)
dist, azi2 = inverse(lat2, lon2, lat1, lon1)
dist, azi1 = inverse(lat1, lon1, lat2, lon2)
print("%f %f %.4f" % (math.degrees(azi1), math.degrees(azi2), dist * a_e))
-
- Гуру
- Сообщения: 5292
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1015
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Расстояние между двумя точками в Москве
https://gis.stackexchange.com/questions ... ght-answerimport geopy.distance
dist = geopy.distance.geodesic((38.8459879,117.454361),(38.846255,117.459880))
dist.meters
-
- Новоприбывший
- Сообщения: 4
- Зарегистрирован: 08 июн 2021, 22:59
- Репутация: 0
- Откуда: Москва
Re: Расстояние между двумя точками в Москве
Разобрался, спасибо!
-
- Гуру
- Сообщения: 4057
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1054
- Ваше звание: программист
- Откуда: Казань
-
- Участник
- Сообщения: 91
- Зарегистрирован: 13 апр 2012, 17:09
- Репутация: 52
-
- Гуру
- Сообщения: 5292
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1015
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
-
- Участник
- Сообщения: 91
- Зарегистрирован: 13 апр 2012, 17:09
- Репутация: 52
-
- Гуру
- Сообщения: 4205
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Re: Расстояние между двумя точками в Москве
В Mapinfo на MapBasic'е задача решается в две строки:
1. установить проекцию WGS84
2. получить его длину (построить отрезок по координатам)
Простите, не очень разобрался, а где здесь собственно МКАД?
И на сколько я помню, с приемлемой точностью на участке в 20 км - земля плоская. Достаточно получить координаты в проецированной СК и посчитать по формуле Пифагора.
Но еще интересней узнать про задачу, для которой в Москве, задаются вопросом о расстоянии между точками. На ум приходит только баллистика.
-
- Гуру
- Сообщения: 1088
- Зарегистрирован: 30 окт 2014, 16:33
- Репутация: -248090259
- Откуда: г. Жуковский МО
Re: Расстояние между двумя точками в Москве
Boris писал(а): ↑21 июн 2021, 21:45На ум приходит только баллистика.
-
- Участник
- Сообщения: 91
- Зарегистрирован: 13 апр 2012, 17:09
- Репутация: 52
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 36 гостей