2017-02-21 4 views
1

Ich möchte alle Punkte finden, die nicht weiter als eine punktspezifische Entfernung von einem bestimmten Punkt entfernt sind. Wie bei einer normalen Radius-Suche ist nur der Radius für jeden Punkt variabel (jeder Eintrag definiert einen Kreis um sich selbst mit einem Punkt + Radius).PostGIS finde alle Kreise mit einem bestimmten Punkt - wie definiere ich einen Index

Die Frage, die ich habe, ist, wie man einen Index für dieses Problem definiert (die Abfrage, die ich im Moment verwende), auch wenn es möglich ist, einen Index mit Nicht-GIS- und GIS-Feldern zu erstellen (wie das Enable-Feld unten)).

ich diese Arbeits Abfrage haben derzeit für sie

SELECT "Locations"."Name", 
FROM public."Locations" 
WHERE 
    "Locations"."Enabled" = TRUE 
    AND ST_DWithin(
     "Locations"."MyCoord"::geography, 
     ST_SetSRID(ST_MakePoint(<Given Long>, <Given Lat>),4326)::geography, 
     "Locations"."Radius"); 

mit einer Tabelle wie folgt aus

Id: uuid 
Name: text 
Enabled: boolean 
MyCoord: GEOGRAPHY(Point) 
Radius: double precision 

Antwort

1
Create index some_name_idx on public."Locations" using gist("MyCoord") 

Aber Sie haben einen Fehler - gibt es eine solche Funktion ST_DWithin (Geometrie, keine Geographie, numerisch) - Wenn Sie Radius in Metern haben, verwenden Sie in beiden Fällen geografisch, so dass Sie keine Konvertierung benötigen (auch im Index)


EDIT:

Keine Sorge - es wird funktionieren, ich habe es überprüft ... als Beweis, habe ich eine Tabelle planet_osm_point von osm2pgsql mit Index erstellt bekam:

CREATE INDEX planet_osm_point_index 
    ON planet_osm_point 
    USING gist 
    (way); 

Und ich bin mit einer Abfrage wie das Ihre:

explain select * 
from planet_osm_point 
where st_dwithin(way,ST_geomfromtext('POINT(2219360.7 6457010.96)'),300) 

Ausgang ist here. Wie Sie sehen Raum Index wird verwendet ...

+0

Dies war ein Kopieren und Einfügen Fehler, sowohl eine Geographie. Aber wie kann der Index auf nur MyCoord (welches das Zentrum des Kreises ist) die Suche beschleunigen, wenn der Radius überhaupt nicht im Index verwendet wird (AFAIK wird mindestens eine Bounding Box benötigt, um die Suche zu beschleunigen). – Fionn

+0

Der feine Unterschied, den ich in der Abfrage sehe, ist, dass Sie eine statische Distanz haben, nach der gesucht werden soll, aber in meiner Abfrage befindet sich sowohl die Entfernung als auch eine Koordinate in der abgefragten Tabelle. Ihre Abfrage hat also nur ein Variablenelement und meins hat zwei. – Fionn

+0

Haben Sie es überprüft? Dieses Element ist auch eine Variable, die ich mir ausgedacht habe, nachdem der Index erstellt wurde ... Es gibt keinen Unterschied. Wie Sie sehen, gibt es keine 300 in der Indexdefinition ... – Jendrusk

Verwandte Themen