Расстояние между точками

Не знаете, где задать вопрос? Задавайте здесь.
Аватара пользователя
Svility
Участник
Сообщения: 55
Зарегистрирован: 24 окт 2017, 19:41
Репутация: 5
Откуда: 32637

Расстояние между точками

Сообщение Svility » 07 сен 2018, 21:35

Подскажите, как рассчитать расстояние между двумя точками в георгафической системе координат?

Задача: автоматически вести расчет между каждыми вершинами линии и их сумму (протяженность линии)

trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Расстояние между точками

Сообщение trir » 07 сен 2018, 21:53


Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2241
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1514
Откуда: Казань

Re: Расстояние между точками

Сообщение Игорь Белов » 07 сен 2018, 21:55

Нужны умные книжки и статьи, чтобы их изучить и начать программировать? Или нужны готовые программы, которые умеют считать? Или библиотеки, чтобы использовать API?
И что понимается под расстоянием? Длина хорды, соединяющей две точки в трёхмерном пространстве? Длина отрезка дуги кратчайшей кривой линии? А если кривая, то на какой поверхности? Сфера? Эллипсоид? Выбор зависит от требуемой точности и от того, насколько велики расстояния.

Правильное название задачи в любом случае «Обратная геодезическая задача». IMHO лучше начать с учебников.
Ну или попробуйте со статей на форуме:
http://gis-lab.info/qa/great-circles.html
http://gis-lab.info/qa/sphere-geodesic- ... oblem.html
The purpose of computing is insight, not numbers

Аватара пользователя
Svility
Участник
Сообщения: 55
Зарегистрирован: 24 окт 2017, 19:41
Репутация: 5
Откуда: 32637

Re: Расстояние между точками

Сообщение Svility » 08 сен 2018, 09:58

Расстояние между двумя точками функцией ST_Distance:

Код: Выделить всё

SELECT ST_Distance(gg1, gg2) As spheroid_dist, ST_Distance(gg1, gg2, false) As sphere_dist
FROM (SELECT
	ST_GeographyFromText('SRID=4326;POINT(39.032269 45.044826)') As gg1,
	ST_GeographyFromText('SRID=4326;POINT(39.032293 45.043928)') As gg2
	) As foo  ;
Результат:

Код: Выделить всё

spheroid_dist | sphere_dist
99.81502644  | 99.87098323
В QGIS функция $LENGHT показывает результат: 99.76;
Расчет расстояния по статье (http://gis-lab.info/qa/great-circles.html) показывает: 99,89

Только начинаю разбираться...не совсем понятна разница в значениях :(

gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Расстояние между точками

Сообщение gamm » 09 сен 2018, 11:47

Svility писал(а):
08 сен 2018, 09:58
не совсем понятна разница в значениях
сравните радиусы глобусов, для начала.

Аватара пользователя
Svility
Участник
Сообщения: 55
Зарегистрирован: 24 окт 2017, 19:41
Репутация: 5
Откуда: 32637

Re: Расстояние между точками

Сообщение Svility » 09 сен 2018, 18:41

Использую вот такую формулу в Excel:

Код: Выделить всё

=ATAN2(SIN(ПИ()*45,044826/180)*SIN(ПИ()*45,043928/180)+COS(ПИ()*45,044826/180)*COS(ПИ()*45,043928/180)*COS(ABS(ПИ()*39,032293/180-ПИ()*39,032269/180));КОРЕНЬ((COS(ПИ()*45,043928/180)*SIN(ПИ()*39,032293/180-ПИ()*39,032269/180))^2+(COS(ПИ()*45,044826/180)*SIN(ПИ()*45,043928/180)-SIN(ПИ()*45,044826/180)*COS(ПИ()*45,043928/180)*COS(ABS(ПИ()*39,032293/180-ПИ()*39,032269/180)))^2))*6378137
в ней использую радиус Земли(большая полуось) = 6378137м.
Среднее значение радиуса земли = 6371,008. Где и как его учесть, подскажите.

Используя координаты:
Y1=45,044826
Y2=45,043928
X1=39,032269
X2=39,032293
Расстояние должно получиться 99.76м (никак не могу добиться такого результата :( )

gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Расстояние между точками

Сообщение gamm » 09 сен 2018, 19:35

Svility писал(а):
09 сен 2018, 18:41
Расстояние должно получиться 99.76м
1) почему? если вы линейкой измеряли, то вы не правы.
2) у вас точность представления координат порядка 10 см, так что если в первом знаке совпадут, и то хорошо.
3) Ёкселем лучше не пользоваться ...

Аватара пользователя
Svility
Участник
Сообщения: 55
Зарегистрирован: 24 окт 2017, 19:41
Репутация: 5
Откуда: 32637

Re: Расстояние между точками

Сообщение Svility » 09 сен 2018, 19:59

Если использовать разные варианты в PostGis:

Код: Выделить всё

SELECT
round(CAST(ST_Distance('POINT(39.032269 45.044826)'::geography, 'POINT(39.032293 45.043928)'::geography) As numeric),3) AS st_distance,
round(CAST(ST_Distance(ST_GeographyFromText('POINT(39.032269 45.044826)'), ST_GeographyFromText('POINT(39.032293 45.043928)')) As numeric),3) AS st_distance2,
round(CAST(ST_Length_Spheroid('LINESTRING(39.032269 45.044826, 39.032293 45.043928)', 'SPHEROID["WGS84",6378137,298.25728]') As numeric),3) AS st_length_spheroid,
round(CAST(ST_Length_Spheroid('LINESTRING(39.032269 45.044826, 39.032293 45.043928)', 'SPHEROID["GRS_1980",6378137,298.257222101]') As numeric),3) AS st_length_spheroid
;
Результат получается:
qqq.jpg
qqq.jpg (26.62 КБ) 11693 просмотра
А если замерить расстояние линейкой в qgis, то:
qq.jpg
qq.jpg (54.44 КБ) 11693 просмотра
Все бы ничего, но на 100км, разница в расчетах составляет 200 м. - что для моих целей много :(

gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Расстояние между точками

Сообщение gamm » 09 сен 2018, 20:41

Svility писал(а):
09 сен 2018, 19:59
А если замерить расстояние линейкой в qgis
а что измеряет линейка вам известно?

Аватара пользователя
Svility
Участник
Сообщения: 55
Зарегистрирован: 24 окт 2017, 19:41
Репутация: 5
Откуда: 32637

Re: Расстояние между точками

Сообщение Svility » 09 сен 2018, 20:49

gamm писал(а):
09 сен 2018, 20:41
а что измеряет линейка вам известно?
Расстояние с учетом эллипсоида? :D
Я собственно хочу восстановить алгоритм расчета по линейки qgis.

trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Расстояние между точками

Сообщение trir » 09 сен 2018, 22:06

Я собственно хочу восстановить алгоритм расчета по линейки qgis.
ну так код посмотрите - зачем огород городить?

gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Расстояние между точками

Сообщение gamm » 10 сен 2018, 05:35

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

Аватара пользователя
Svility
Участник
Сообщения: 55
Зарегистрирован: 24 окт 2017, 19:41
Репутация: 5
Откуда: 32637

Re: Расстояние между точками

Сообщение Svility » 10 сен 2018, 13:12

Ваши ответы ориентированна для кого? На программистов?
Я не знаю в каком из множества файлов qgis лежат параметры расчета, если такой вообще есть.

Я не уверен, но надеюсь что qgis берет теже координаты что отображаются снизу экрана.
Еще момент: проект в 3857, а вектор в 4326 + перепроецирование на лету.

trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Расстояние между точками

Сообщение trir » 10 сен 2018, 13:24

в справке написанно
The length calculated by this function respects both the current project's ellipsoid setting and distance unit settings.
https://github.com/qgis/QGIS/blob/maste ... /%24length
так что она считает в 3857

viewtopic.php?f=25&t=23810&p=161820&hil ... 8C#p161820

gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Расстояние между точками

Сообщение gamm » 10 сен 2018, 13:33

Я не уверен, но надеюсь что qgis берет теже координаты что отображаются снизу экрана.
Еще момент: проект в 3857, а вектор в 4326 + перепроецирование на лету.
у вас минимум две проблемы, на что вам уже неоднократно указывали

1) похоже, вы брали координаты с экрана двигая мышкой, где они (а) округлены, и (в) пересчитаны из пикселей, точность каждого числа примерно 0.1 метра. Какую точность вы получаете в итоге, никому не ведомо, а вы хотите, чтобы расстояния совпали.

2) расстояние в проекции (тем более такой кривой, как web merkator) сильно отличается от расстояния на глобусе - а похоже, вы в проекции и считаете, и хотите, чтобы расстояния совпали.

Сделайте, хотя бы, одинаковые проекции (градусы на одинаковом глобусе) для всех данных, и считайте расстояние на этом же глобусе. Предварительно выгрузив точки в shape, и загрузив в базу, чтобы числа были те же самые, без округления. Тогда можно что-то обсуждать.

P.S. Чтобы считать расстояния, нужно выбрать какую=нибудь равнопремежуточную проекцию, посмотрев, какая из них дает минимальные ошибки для ваших типичных расстояний.

Ответить

Вернуться в «Я новичок!»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 13 гостей