PostGIS: длина линии - PullRequest
       29

PostGIS: длина линии

1 голос
/ 27 сентября 2019

Я использую PostGIS для расчета длины определяемой пользователем строки.Столбец определен как geography(LineString,4326).Линия строки представлена ​​этим GeoJSON:

"track": {
  "type": "LineString",
  "coordinates": [
    [
      49.364325571013,
      16.785549033597
    ],
    [
      49.363254969491,
      16.642149334451
    ]
  ]
}

SELECT ST_Length("geography") FROM table; возвращает 15945.7486086962, но длина, измеренная на Google Картах, составляет ~ 10 км.

Что я делаю не так?Как измерить длину, чтобы получить то же значение, что и из Google Maps?

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Я считаю, что это классический вопрос переключения x, y позиций.

Учитывая x, y :

SELECT 
    ST_Length(
      ST_GeogFromText('SRID=4326;LINESTRING(49.364325571013 16.785549033597,49.363254969491 16.642149334451)'),true);

    st_length     
------------------
 15869.9069442778

и"та же" линия LineString переключается на y, x ..

SELECT 
   ST_Length(
     ST_GeogFromText('SRID=4326;LINESTRING(16.785549033597 49.364325571013,16.642149334451 49.363254969491)'),true)

    st_length     
------------------
 10416.8606521809
1 голос
/ 27 сентября 2019

Разобрался с проблемой.

Я использовал ST_GeomFromText('LINESTRING(lat lon, lat lon)') для создания строки.Правильный порядок: lon lat, поэтому ST_GeomFromText('LINESTRING(lon lat, lon lat)').

GeoJSON использует тот же порядок координат: 49.363254969491 = широта, 16.642149334451 = долгота.

Причина, по которой я этого не понялпотому что я использовал Leaflet, чтобы нарисовать линию.Я в основном взял точки на geoJSON.getLayers()[0].feature.geometry.coordinates и передал их объекту Polyline.Он создал точки полилинии, взяв первую координату из GeoJSON как Lat, а вторую как Lng.Таким образом, он перевернулся во второй раз и отображался правильно.

Поэтому после переключения lon lat в запросе мне пришлось использовать функцию L.GeoJSON.coordsToLatLngs(), чтобы правильно отобразить строку.

...