2016-11-09 8 views
1

In Postgres 9.1+ Datenbank enthält Routenpunkte:Wie Entfernung zu berechnen, die von Breiten- und Längen

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

Punkte von Browser navigator.geolocation Anrufe von javascript gespeichert werden.

Wie berechne ich die Routenlänge aus diesen Daten? Die Route ist weniger als 300 km, so dass direkte Linienlängen zwischen den Punkten summiert werden können. Es sollte in Postgres 9.1 und neuer funktionieren.

Ergebnis sollte eine Zahl sein, Gesamtentfernung zwischen Punkten in Kilometern. Datenbank- und JavaScript-Code-Sendepunkte können neu berechnet werden, wenn dies zumutbar ist.

Antworten in Calculate distance between two points in google maps V3, wie dies in den Produktionssprachen implementiert werden kann.

Sie verwenden For-Schleife, die nicht in SQL verfügbar ist. Kann Maby SUM() mit Window-Funktion dazu verwendet werden?

+1

http://stackoverflow.com/questions/1502590/berechnete-entfernung-zwischen-zweipunkte-in-google -maps-v3/1502821 # 1502821 – Teemu

+0

Antworten dazu enthalten Code in C#, Javascript und Java. Sie verwenden für die Schleife, die nicht in SQL verfügbar ist. Wie implementiert man dies in SQL oder Postgres? Wahrscheinlich sollte eine Fensterfunktion verwendet werden. – Andrus

+0

??? Es gibt viele Antworten ohne Schleifen. Die Idee war, die hairsine-Formel einzuführen, die Sie in jeder beliebigen Sprache anwenden können. Mit dieser Bemerkung wissen Sie bereits, dass Sie keine Kopie-Pasta-Antwort für eine Frage erwarten können, die keinen Versuch zeigt, das Problem zu lösen. – Teemu

Antwort

1

Ich nehme an, Sie wollen den Abstand von dem frühesten Zeitpunkt, zu dem nächsten frühesten, und so weiter ...

Ab Postgresql 9.3 gibt es eine elegante Lösung, die ein lateral join verwenden.

zuerst die postgis Erweiterung installieren, so dass Sie seine Entfernung Funktionen nutzen können:

CREATE EXTENSION POSTGIS; 

nun die Abfrage:

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; 

Diese Abfrage mit distinct on sollte für alle Versionen arbeiten:

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' gibt' ERROR: konnte Erweiterungssteuerungsdatei nicht öffnen "/usr/share/postgresql/9.1/extension/postgis.control": Keine solche Datei oder Verzeichnis' Es gibt andere Erweiterungen aber keine Postgis in diesem Verzeichnis. Wie installiere ich Postgis in Postgres 9.1 in Debian Squeeze x64 Linux? – Andrus

+0

Nie versucht, aber es gibt eine Anleitung, z.B. hier: http://postgis.net/install/ – mlinth

+0

Diese Seite schrieb, dass postgis in 9.1 nicht unterstützt wird. Wie wird die Formel für die Entfernungsberechnung anstelle von Postgis verwendet? – Andrus

Verwandte Themen