Postgis - st_distance - PullRequest
       5

Postgis - st_distance

3 голосов
/ 09 июня 2011

У меня проблемы с функцией st_distance в postgis.Он возвращает неверные результаты - для небольших расстояний ошибка невелика - 10, может быть, 20 метров, но для больших расстояний разница между моими результатами и, например, результатами карт Google слишком велика - от 700 метров до 2 километров и выше.Я использую srid = 4326. И второе - возможно, в этом проблема - скажем, у меня есть место, которое находится в 4 километрах.Постгис говорит, что это ~ 0,0417 {{some_units}} далеко.Сейчас я просто умножаю результат на 100 и получаю более или менее точные результаты.Могу ли я передать аргумент этой функции, который сказал бы «возвращаемое значение в километрах / метрах»?

пс.версия postgres - 9.0.1

Ответы [ 6 ]

3 голосов
/ 09 июня 2011

Вы должны использовать тип данных geography.

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

градусов нельзя перевести в метры любым простым способом. Чтобы получить результат в метрах от непрогнозируемой системы отсчета, расчет необходимо рассчитать по «большому кругу» вокруг шероида Земли. Вы используете только теорему Пифагора для вычисления расстояния на плоскости.

Итак, PostGIS не дает неверного результата. Вы можете перейти к системе пространственной привязки на основе метра в зависимости от того, покрывают ли ваши данные эту большую площадь, поэтому округление земного шара является проблемой. В таком случае вам следует вместо этого использовать тип данных geography и использовать srid 4326.

НТН

Никлас

1 голос
/ 08 июля 2013

Вы должны использовать свою проекцию, на данный момент она указывается в градусах, если вы хотите в метре, использовать ST_transform следующим образом:

    ST_Distance(st_transform(ST_GeometryFromText('POINT(longitude     latitude)',4326),900913),st_transform(point,900913)) 
0 голосов
/ 20 июля 2017

Если у вас есть данные в качестве geom, ответ sal - хороший ответ. Если у вас есть данные как lat long, попробуйте это:

select st_distance(point1,point2) from 
(SELECT ST_GeogFromText('SRID=4326;POINT(0 0)') point1,  
ST_GeogFromText('SRID=4326;POINT(0.25 0.4)') point2) a
0 голосов
/ 10 февраля 2016

SRID: 4326, т. Е. WGS1984 должен представлять мировые координаты по широте и долготе. Поэтому, когда вы хотите измерить расстояния, вам нужно проецировать в UTM. Вы можете сослаться на

spatial_ref_sys

таблица в вашей базе данных, чтобы увидеть, какой SRID использует какой блок. Чтобы измерить и спроецировать его в UTM. Вы можете найти требуемую зону utm с помощью функции utmzone . Затем вы можете использовать следующий запрос.

select st_distance(st_transform(geom1,utmzone(geom1)),st_transform(geom2,utmzone(geom2)))
0 голосов
/ 24 июня 2015

Детализация Nicklas'answer, учитывая, что все ваши гемы имеют srid 4326, вы можете использовать:

select st_distance(geom1::geography,geom2::geography)

чтобы узнать расстояние в метрах

Или, если быть более точным, преобразовать геометрию в прогнозируемые crs для конкретной области, такие как EPSG: 25832 ETRS89 / UTM zone 32N:

select st_distance(st_transform(geom1,25832),st_transform(geom2,25832))
0 голосов
/ 18 марта 2014

Вы должны сделать то, что сказал Кирилл, и преобразовать свою геометрию, чтобы использовать srid с единицами расстояния в метрах, например, 900913. Умножать то, что вы сейчас получаете в градусах (используя srid = 4326) на 100, - не самый лучший способ.

В зависимости от того, где вы находитесь, может существовать местный srid в метрах, более точный для вашего местоположения - например, SRID для Швейцарии - 21781. Проверьте это также: http://gothos.info/tag/coordinate-systems/ длянекоторые сриды в районе США.

...