Für mich Ist PostGIS und allgemein GIS Neuland. Ich habe mir schon ein paar Postings in diesem Forum durchgelesen, aber nichts gefunden, was meine Fragen beantwortet.
Ich möchte in einer Tabelle Punkte (POIs) als Koordinaten, die ich als GPS Daten (Lat/Long dezimal, also SRID 4326) bekomme, ablegen.
Dazu habe ich mir eine Tabelle geschrieben in der ich die Punkte ablege:
Tabelle POI mit den Spalten:
- poi_name: String
- poi_lat: Float
- poi_long: Float
Jetzt möchte ich (vorläufig) mit diesen Punkten folgendes tun. Gib mir alle Punkte die im Umkreis von X km liegen geordnet nach ihrer Entfernung und als 2. Use Case berechne die Entfernung zwischen zwei POIs.
Also hatte ich eine Spalte poi_geom4326 (mittels SELECT AddGeometryColumn…) angelegt, Index drauf gelegt und mit einem Trigger diese Spalte automatisch gefüllt. Leider waren die Ergebnisse die ich mit SQL erzielt habe nicht das was ich erwartet hatte: Distanzen von ca. 20-30 km ergaben Werte von 0.45, etc. Wenn ich es richtig verstanden habe liegt es daran, dass Geomwerte mit SRID 4326 nicht metrisch ‘behandelt’ werden können.
Also habe ich ein wenigweiter gesuch und bin auf ein SR System (Gauß-Krüger) mit der SRID 31467 gestossen, bei welchem man die Entfernungen in Metern ageben können soll. Hierfür habe ich eine weitere Geo-Spalte mit Index angelegt, die ebenfalls vom Trigger mit befüllt wird.
Die Trigger-Funktion sieht wie folgt aus:
CREATE OR REPLACE FUNCTION setGeoData() RETURNS trigger AS ’
BEGIN
NEW.poi_geom4326 := SetSRID(makepoint(NEW.lat, NEW.lon), 4326);
NEW.poi_geom31467 := Translate(NEW.poi_geom4326, 31467);
RETURN new;
END
’ LANGUAGE plpgsql;
Wenn ich nun die Distanz berechnen lasse bekomme ich zu grosse Werte heraus, z.B.
SELECT start.poi_name, ende.poi_name, distance(start.poi_geom31467,ende.poi_geom31467) FROM POI As start, POI As ende where start.poi_id=12 AND ende.poi_id=25
liefert eine Distanz von ca 36000 Metern (?). Die Luftlinie zwischen den beiden Punkten mit Google Earth handgemessen sind ca 27.1 km und
ST_Distance_Sphere liefert 27.3 km.
Jetzt könnte ich ja ST_Distanz_Sphere benutzen um alle Punkte innerhalb eines Radius zu bekommen, aber davon wurde abgeraten, weil es nicht performant genug ist, da es nicht über den Index gehen kann und für jeden Punkt individuell berechnet werden muss. Die Lösung welche ich gefunden haben benutzt die extend(mittelpunkt, radius) Method mit der intersects (&&) operation. Wenn ich dort den Radius in Metern angebe bekomme ich zu viele Ergebnisse.
Wie gesagt, es kann sein, dass ich ein grundlegendes Problem habe (Brett vor dem Kopf), da ich mich zum ersten mal mit GIS befasse. Von daher bin ich für jede Hilfe dankbar!