Страница 1 из 1

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

Добавлено: 23 дек 2008, 16:03
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 км!

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

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

Спасибо.

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

Добавлено: 23 дек 2008, 19:30
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 км я так и не понял.

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

Добавлено: 24 дек 2008, 00:34
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км. Здесь почему-то наоборот, в Гугле меньше.

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

Добавлено: 24 дек 2008, 01:57
Максим Дубинин
а если попробовать со SRID?

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

geomfromtext('POINT(55.616251 37.689566)',4326)

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

Добавлено: 24 дек 2008, 08:10
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.

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

Добавлено: 24 дек 2008, 20:44
Максим Дубинин
ааа, то есть долгота с широтой были местами перепутаны? ну сколько ж еще раз будем наступать на одни и те же грабли :)

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

Добавлено: 24 дек 2008, 23:51
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, после того как выберу их из базы?

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

Добавлено: 12 янв 2009, 09:37
Homme
Товарищи, ну ответьте-же :)

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

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