Использование функции ST_Distance_Sphere в PostGIS
-
- Новоприбывший
- Сообщения: 4
- Зарегистрирован: 23 дек 2008, 15:48
- Репутация: 0
Использование функции ST_Distance_Sphere в PostGIS
Есть у меня две точки
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 км!
То есть все наоборот.
В чем же подвох? Я уже совсем запутался.
Спасибо.
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
Итак, по порядку:
А как был получен результат 24 км я так и не понял.
Во-первых, результат выполнения функции SELECT ST_DISTANCE_SPHERE(GeomFromText('POINT(55.61625091743 37.689565976533)',-1), GeomFromText('POINT(55.657041182323 37.838668578149)',-1) будет 16962.7163062151.Homme писал(а):Есть у меня две точки
POINT(55.61625091743 37.689565976533)
POINT(55.657041182323 37.838668578149)
Когда я хочу найти расстояние между ними с помощью st_distance_sphere(point1, point2) - я получаю 24104 метра. То есть 24 км.
Во-вторых, Вы не просто переставили долготу и широту местами, но еще и изменили их значения (для второй точки) с POINT(55.657041182323 37.838668578149) на POINT(37.731589 55.885072).Homme писал(а): Я обнаружил, что если запрос будет вида
select st_distance_sphere(geomfromtext('POINT(37.689566 55.616251)',-1), geomfromtext('POINT(37.731589 55.885072)',-1)); то есть я переставил местами широту и долготу, то результат будет 30км., что есть правильно.
А как был получен результат 24 км я так и не понял.
-
- Новоприбывший
- Сообщения: 4
- Зарегистрирован: 23 дек 2008, 15:48
- Репутация: 0
Re: Использование функции ST_Distance_Sphere в PostGIS
да, моя ошибка.
Следует читать
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км. Здесь почему-то наоборот, в Гугле меньше.
Следует читать
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
Использование SRID не поможет, так как в мануале по PostGIS для ST_Distance_Sphere сказано:
То есть, первая координата - долгота, вторая - широта. Подробнее здесь.
Для более точных измерений нужно использовать функцию ST_Distance_Spheroid.
Все гораздо проще, в PostGIS используется обозначение:This function currently does not look at the SRID of a point geometry and will always assume its in WGS 80 long lat.
Код: Выделить всё
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
ааа, то есть долгота с широтой были местами перепутаны? ну сколько ж еще раз будем наступать на одни и те же грабли 

пристегивайтесь, турбулентность прямо по курсу
-
- Новоприбывший
- Сообщения: 4
- Зарегистрирован: 23 дек 2008, 15:48
- Репутация: 0
Re: Использование функции ST_Distance_Sphere в PostGIS
$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, после того как выберу их из базы?
$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, после того как выберу их из базы?
-
- Новоприбывший
- Сообщения: 4
- Зарегистрирован: 23 дек 2008, 15:48
- Репутация: 0
Re: Использование функции ST_Distance_Sphere в PostGIS
Товарищи, ну ответьте-же 

- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9129
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 748
- Ваше звание: NextGIS
- Откуда: Москва
- Контактная информация:
Re: Использование функции ST_Distance_Sphere в PostGIS
мне кажется _DR_ вам исчерпывающе ответил, просто следите за тем, как генерируете точки, чтобы первой была долгота, а второй - широта. Иначе точки получатся совершенно другие и соответственно расстояние будет другое.
как у вас в таблице хранятся точки - дело ваше, просто подставлять вы их должны в определенном порядке.Homme писал(а):Или у меня все неправильно, и я должен при занесении точек в таблицу, сразу писать lon lat?
Да, "скармливая" точки тому или иному API, вы должны учитывать то, что где-то они определяются как latlong, а где-то, как longlat. Это реалии, с этим надо мириться и учитывать. Стандарта нет.Но тогда, чтобы построить полигон или точку, напр. на Google Maps, я должен каждый раз переставлять местами lon и lat, после того как выберу их из базы?
пристегивайтесь, турбулентность прямо по курсу
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей