2016-11-09 6 views
1

В базе данных Postgres 9.1+ содержит точки маршрута:Как рассчитать расстояние от широты и долготы

create table doksyndm (
id serial primary key, 
readingtime timestamp with time zone not null, 
latitude float, 
longitude float 
); 

Очки сохраняются в браузере с помощью navigator.geolocation вызовы из JavaScript.

Как рассчитать длину маршрута с этих данных? Маршрут составляет менее 300 км, поэтому можно суммировать прямые линии между точками. Он должен работать в Postgres 9.1 и новее.

Результат будет одним номером, общим расстоянием между точками в километрах. Точки отправления кода базы данных и javascript могут быть пересчитаны, если это разумно.

Ответы в Calculate distance between two points in google maps V3 как реализовать это на продуральных языках.

Они используют цикл, который недоступен в SQL. Maby SUM() с функцией окна может использоваться для реализации этого?

+1

http://stackoverflow.com/questions/1502590/calculate-distance-between-two-points-in-google -maps-v3/1502821 # 1502821 – Teemu

+0

Ответы на это содержат код на C#, Javascript и Java. Они используют для цикла, который недоступен в sql. Как реализовать это в sql или Postgres? Возможно, какая-то функция окна должна использоваться. – Andrus

+0

??? Существует множество ответов без циклов. Идея заключалась в том, чтобы представить формулу haversine, вы можете применить ее на любом языке, который вы хотите. С этим представителем вы уже знаете, что вы не можете ожидать получения копии-макаронного ответа на вопрос, который не показывает попыток решить проблему. – Teemu

ответ

1

Я предполагаю, что вы хотите, расстояние от первой точки до следующего самого раннего, и так далее ...

По Postgresql 9.3, есть элегантное решение с помощью lateral join.

Во-первых, установите расширение PostGIS, так что вы можете использовать свои функции расстояния:

CREATE EXTENSION POSTGIS; 

Теперь запрос:

SELECT SUM(st_distance(st_point(a.longitude,a.latitude)::geography, 
         st_point(b.longitude,b.latitude)::geography) 
      )/1000 AS distance_km FROM doksyndm a 
LEFT JOIN LATERAL 
(SELECT * FROM doksyndm WHERE readingtime > a.readingtime limit 1) b ON TRUE; 

Этот запрос с использованием distinct on должны работать для всех версий:

SELECT SUM (st_distance(st_point(alon,alat)::geography, 
       st_point(blon,blat)::geography))/1000 as distance_km FROM 
    (select distinct ON (a.readingtime) a.readingtime, 
             a.latitude as alat, 
             a.longitude as alon, 
             b.latitude as blat , 
             b.longitude as blon 
    FROM doksyndm a inner join doksyndm b on a.readingtime < b.readingtime 
ORDER by a.readingtime,b.readingtime) x 
+0

'CREATE EXTENSION POSTGIS' возвращает' ERROR: не удалось открыть файл управления расширением "/usr/share/postgresql/9.1/extension/postgis.control": нет такого файла или каталога 'Существуют другие расширения, но не postgis в этом каталоге. Как установить postgis в Postgres 9.1 в Debian Squeeze x64 Linux? – Andrus

+0

Никогда не пробовал, но есть руководство, например. здесь: http://postgis.net/install/ – mlinth

+0

На этой странице написано, что postgis не поддерживается в 9.1. Как использовать формулу для расчета расстояния вместо postgis? – Andrus