2017-06-09 1 views
2

Ich muss berechnen, wenn ein Punkt nicht weiter entfernt ist als ein gegebener Radius von einem anderen Punkt. Ich benutzte die Funktion ST_DWithin, in Google Maps bekomme ich lanLot mit "Was ist hier" Abschnitt von zwei Punkten. Erstens: (43.2137617, 76.8598076) und zweitens (43.220109 76.865100). Die Entfernung zwischen ihnen beträgt 1,25 km. Meine AbfragePostgresql Postgis ST_DWithin immer True zurückgeben

SELECT ST_DWithin (
    ST_GeomFromText('POINT(76.8598076 43.2137617)',3857), 
    ST_GeomFromText('POINT(76.865100 43.220109)',3857), 
    100 
); 

Und es gibt immer wahr zurück. Ich denke, dass ich Radius 100 Meter und verwendete SRID 3875, um Meter zu verwenden. Was ist falsch?

Antwort

1

Die Koordinaten, die Sie verwenden, befinden sich nicht in CRS 3857, sondern sind relativ unprojiziert lat-long, d. H. CRS 4326, also suchen Sie nach Punkten innerhalb von 100 Grad zueinander. Sie müssten den Punkt in 4326 erstellen, ihn in 3857 unter Verwendung ST_Transform projizieren und dann die Entfernungsberechnung in Metern vornehmen.

SELECT ST_DWithin (
    ST_Transform(ST_GeomFromText('POINT(76.8598076 43.2137617)',4326),3857), 
    ST_Transform(ST_GeomFromText('POINT(76.865100 43.220109)',4326),3857), 
    100 
); 

CRS 3857 ist eine Projektion, die nicht Entfernungen nicht bewahrt, die auch Sie vom Äquator wegbewegen. Vielleicht möchten Sie stattdessen ST_Distance_Sphere verwenden. Vergleicht man die beiden Methoden, gibt die erste 1134m zwischen den Punkten und die zweite 825m ... ein großer Unterschied!

SELECT ST_Distance_Sphere (
    ST_GeomFromText('POINT(76.8598076 43.2137617)',4326), 
    ST_GeomFromText('POINT(76.865100 43.220109)',4326)) 
    <= 100; 
Verwandte Themen