2016-04-01 18 views
0

Ich habe einige Fragen + Antworten hier auf SO über dieses Thema gelesen, aber ich kann nicht verstehen, welcher der übliche Weg ist (wenn es einen gibt .. .) um alle Punkte innerhalb eines "Kreises" mit einem bestimmten Radius zu finden, zentriert auf einen gegebenen Punkt.Der effizienteste Weg, Punkte innerhalb eines bestimmten Radius von einem gegebenen Punkt zu finden

Insbesondere fand ich zwei Möglichkeiten, die das überzeugendste scheinen:

select id, point 
from my_table 
where st_Distance(point, st_PointFromText('POINT(-116.768347 33.911404)', 4326)) < 10000; 

und:

select id, point 
from my_table 
where st_Within(point, st_Buffer(st_PointFromText('POINT(-116.768347 33.911404)', 4326), 10000)); 

Welche der effizienteste Weg ist meine Datenbank abzufragen? Gibt es noch eine andere Option?

Antwort

1

Das Erstellen eines Puffers zum Auffinden der Punkte ist definitiv nein, weil (1) der Aufwand zum Erstellen der Geometrie, die den Puffer darstellt, und (2) die Punkt-in-Polygon-Berechnung viel weniger effizient ist als a einfache Distanzberechnung

Sie arbeiten offensichtlich mit (Längen-, Breiten-) Daten, also sollten Sie diese in ein geeignetes kartesisches Koordinatensystem umwandeln, das die gleiche Maßeinheit wie Ihre Entfernung von 10.000 hat. Wenn dieser Abstand in Meter ist, können Sie den Punkt auch aus der Tabelle in geography umwandeln und direkt auf den Koordinaten (long, lat) berechnen. Da Sie nur die Punkte identifizieren möchten, die innerhalb der angegebenen Entfernung liegen, können Sie die ST_DWithin() function mit Berechnung auf der Kugel für zusätzliche Geschwindigkeit verwenden (nicht bei sehr hohen Breiten oder mit sehr langen Distanzen):

SELECT id, point 
FROM my_table 
WHERE ST_DWithin(point::geography, 
       ST_GeogFromText('POINT(-116.768347 33.911404)'), 
       10000, false); 
0

ich folgende Abfrage

SELECT *, ACOS(SIN(latitude) * SIN(Lat)) + COS(latitude) * COS(Lat) * COS(longitude) - (Long))) * 6380 AS distance FROM Table_tab WHERE ACOS(SIN(latitude) * SIN(Lat) + COS(latitude) * COS(Lat) * COS(longitude) - Long)) * 6380 < 10 

In obigen Abfrage Breiten- und Längen verwendet haben, sind aus der Datenbank und lat, sind lange die Punkte aus wir suchen möchten.

ARBEIT: Es wird die Entfernung (In KM) zwischen allen Punkten in der Datenbank von Suchpunkten berechnet und überprüft, ob die Entfernung weniger als 10 KM ist. Es wird alle Koordinaten innerhalb von 10 KM zurückgeben.

Verwandte Themen