Использование функции ST_Distance_Sphere в PostGIS

Ответить
Homme
Новоприбывший
Сообщения: 4
Зарегистрирован: 23 дек 2008, 15:48
Репутация: 0

Использование функции ST_Distance_Sphere в PostGIS

Сообщение Homme »

Есть у меня две точки
POINT(55.61625091743 37.689565976533)
POINT(55.657041182323 37.838668578149)

Это все в Москве.

Когда я хочу найти расстояние между ними с помощью st_distance_sphere(point1, point2) - я получаю 24104 метра. То есть 24 км.
Но любой картографический сервис (google maps, yandex maps, mapinfo и пр.) считают, что расстояние равно 30км.

Я обнаружил, что если запрос будет вида
select st_distance_sphere(geomfromtext('POINT(37.689566 55.616251)',-1), geomfromtext('POINT(37.731589 55.885072)',-1));

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

А если на google maps нарисовать точки POINT(37.689566 55.616251) и POINT(37.731589 55.885072) - то мы получим 24 км!

То есть все наоборот.

В чем же подвох? Я уже совсем запутался.

Спасибо.
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Использование функции ST_Distance_Sphere в PostGIS

Сообщение Denis Rykov »

Итак, по порядку:
Homme писал(а):Есть у меня две точки
POINT(55.61625091743 37.689565976533)
POINT(55.657041182323 37.838668578149)
Когда я хочу найти расстояние между ними с помощью st_distance_sphere(point1, point2) - я получаю 24104 метра. То есть 24 км.
Во-первых, результат выполнения функции SELECT ST_DISTANCE_SPHERE(GeomFromText('POINT(55.61625091743 37.689565976533)',-1), GeomFromText('POINT(55.657041182323 37.838668578149)',-1) будет 16962.7163062151.
Homme писал(а): Я обнаружил, что если запрос будет вида
select st_distance_sphere(geomfromtext('POINT(37.689566 55.616251)',-1), geomfromtext('POINT(37.731589 55.885072)',-1)); то есть я переставил местами широту и долготу, то результат будет 30км., что есть правильно.
Во-вторых, Вы не просто переставили долготу и широту местами, но еще и изменили их значения (для второй точки) с POINT(55.657041182323 37.838668578149) на POINT(37.731589 55.885072).

А как был получен результат 24 км я так и не понял.
Homme
Новоприбывший
Сообщения: 4
Зарегистрирован: 23 дек 2008, 15:48
Репутация: 0

Re: Использование функции ST_Distance_Sphere в PostGIS

Сообщение Homme »

да, моя ошибка.

Следует читать
POINT(55.61625091743 37.689565976533)
POINT(55.885071693832 37.731589218916)

Я отметил их на карте
http://maps.google.com/maps/ms?ie=UTF8& ... 2b7a75&z=4

первая точка - "Коммент Лехи..."
вторая точка - "По дороге..."

Расстояние меряем между ними.

Запрос select st_distance_sphere(geomfromtext('POINT(55.616251 37.689566)',-1), geomfromtext('POINT(55.885072 37.731589)',-1));
возвращает 24104.6952008978
А Google Maps (как и прочие сервисы) считает что там 30км. Попробуйте сами - там есть "Инструмент для измерения расстояний".

А если переставить в запросе местами широту и долготу (как я писал ранее) - мы получим как раз 30км.

P.S. То же самое между точками "Коммент Лехи" и "Я сказал". В postgreSQL - 16982..., в Гугле - 10км. Здесь почему-то наоборот, в Гугле меньше.
Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: Использование функции ST_Distance_Sphere в PostGIS

Сообщение Максим Дубинин »

а если попробовать со SRID?

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

geomfromtext('POINT(55.616251 37.689566)',4326)
пристегивайтесь, турбулентность прямо по курсу
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Использование функции ST_Distance_Sphere в PostGIS

Сообщение Denis Rykov »

Использование SRID не поможет, так как в мануале по PostGIS для ST_Distance_Sphere сказано:
This function currently does not look at the SRID of a point geometry and will always assume its in WGS 80 long lat.
Все гораздо проще, в PostGIS используется обозначение:

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

ST_Distance_Sphere(geometry pointlonlatA, geometry pointlonlatB);
То есть, первая координата - долгота, вторая - широта. Подробнее здесь.
Для более точных измерений нужно использовать функцию ST_Distance_Spheroid.
Spatial is now, more than ever, just another column- The Geometry Column.
Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: Использование функции ST_Distance_Sphere в PostGIS

Сообщение Максим Дубинин »

ааа, то есть долгота с широтой были местами перепутаны? ну сколько ж еще раз будем наступать на одни и те же грабли :)
пристегивайтесь, турбулентность прямо по курсу
Homme
Новоприбывший
Сообщения: 4
Зарегистрирован: 23 дек 2008, 15:48
Репутация: 0

Re: Использование функции ST_Distance_Sphere в PostGIS

Сообщение Homme »

$lat_1 = 55;
$lon_1 = 37;

$lat_2 = 57;
$lon_2 = 39;

insert into points_table (data) values (GeomFromText('POINT($lat_1 $lon_1)',4001));
для простоты допустим, что эта запись имеет id = 1;

А теперь ищем расстояние между точкой №1 и точкой №2 (точки №2 в таблице нет).

select st_distance_sphere(data, GeomFromText('POINT($lon_2 $lat_2)',4001) where id=1;

Вероятно, этот запрос не верен, потому что data у нас - это $lat_1 $lon_1 ?

А как же мне переставить на лету lon и lat?

Или у меня все неправильно, и я должен при занесении точек в таблицу, сразу писать lon lat? Но тогда, чтобы построить полигон или точку, напр. на Google Maps, я должен каждый раз переставлять местами lon и lat, после того как выберу их из базы?
Homme
Новоприбывший
Сообщения: 4
Зарегистрирован: 23 дек 2008, 15:48
Репутация: 0

Re: Использование функции ST_Distance_Sphere в PostGIS

Сообщение Homme »

Товарищи, ну ответьте-же :)
Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: Использование функции ST_Distance_Sphere в PostGIS

Сообщение Максим Дубинин »

мне кажется _DR_ вам исчерпывающе ответил, просто следите за тем, как генерируете точки, чтобы первой была долгота, а второй - широта. Иначе точки получатся совершенно другие и соответственно расстояние будет другое.
Homme писал(а):Или у меня все неправильно, и я должен при занесении точек в таблицу, сразу писать lon lat?
как у вас в таблице хранятся точки - дело ваше, просто подставлять вы их должны в определенном порядке.
Но тогда, чтобы построить полигон или точку, напр. на Google Maps, я должен каждый раз переставлять местами lon и lat, после того как выберу их из базы?
Да, "скармливая" точки тому или иному API, вы должны учитывать то, что где-то они определяются как latlong, а где-то, как longlat. Это реалии, с этим надо мириться и учитывать. Стандарта нет.
пристегивайтесь, турбулентность прямо по курсу
Ответить

Вернуться в «PostGIS/PostgreSQL»

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

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