Ich erstelle eine Anwendung, die jeden Record
in einer Tabelle abfragen und zurückgeben soll, von der X
Kilometer entfernt sind PointX
. Records
und PointX
‚s Positionen werden bestimmt aus (long/lat)
Informationen , die von Google Geocode API.
Ich bin neu bei PostGIS. Nach einer kurzen Recherche habe ich diese Frage gefunden . Die Antwort scheint zu lauten:
SELECT *
FROM your_table
WHERE ST_Distance_Sphere(the_geom, ST_MakePoint(your_lon,your_lat)) <= radius_mi * 1609.34
Das Problem ist: Auch wenn ich erst mit GIS anfange, kann ich mir bei der obigen Abfrage nicht vorstellen, wie dies einen Index verwenden kann. Es gibt 2 Funktionsaufrufe. Ich stelle mir vor, dass der Tisch nach allen durchsucht wird Record
. Ich möchte mich irren :)
Frage: Verfügt PostGIS über einen Indextyp, mit dem die obige Abfrage ausgeführt werden kann? Wenn nicht, was wäre der empfohlene Ansatz, um das zu tun, was ich brauche?
quelle
ST_SetSRID()
um dieST_MakePoint
zuvor in der Abfrage Geographie Gießen.Antworten:
Es gibt zwei Schlüssel, um eine gute geodätische Abfrageleistung bei großen Tabellen mit
geometry
Spalten zu erzielen, die geografische WGS 1984-Daten (SRID 4326) verwenden:ST_DWithin
Funktion, die anhand eines verfügbaren räumlichen Index sucht und Geografie-Features mit einer kartesischen Entfernung findetST_DWithin
ihn verwenden könnenSchauen wir uns also an, was in der realen Welt passiert. Zuerst müssen wir eine Tabelle mit einer Million zufälliger Punkte erstellen und füllen:
Wenn wir die ST_Distance-Abfrage ausführen, erhalten wir Ihren erwarteten vollständigen Tabellenscan:
Wenn wir jetzt verwenden
ST_DWithin
, erhalten wir immer noch einen vollständigen Tabellenscan (wenn auch einen schnelleren):Und dies ist das letzte Stück - Aufbau des Deckungsindex (Besetzungsgeographie):
Schließlich verwendet der Optimierer den räumlichen Index und es wird angezeigt, aber was sind drei Größenordnungen zwischen Freunden?
Einige Einschränkungen:
Da ich ein Datenbank-Nerd bin, verfügt mein Heim-PC über 16 GB RAM, sechs 3,3-GHz-Kerne und eine 256-Gbit-SSD für den Standardtabellenbereich der Datenbank. Ihr Kilometerstand kann variieren
Ich habe die Erstellungs-SQL vor jeder Abfrage erneut ausgeführt, um das Spielfeld in Bezug auf "heiße" Seiten im Cache auszugleichen. Dies kann jedoch zu geringfügig unterschiedlichen Ergebnissen führen, da derselbe zufällige Startwert nicht für verschiedene Läufe verwendet wurde
Und ein Hinweis:
quelle