Auswahl per Begrenzungsrahmen mit PostGIS

12

Ich habe einen großen Datensatz in einer PostGIS-Datenbank. Ich betrachte es über ein Webinterface, das die Daten als GeoJSON lädt. Es sind zu viele Daten auf einmal für den Client verfügbar (10 MB im Wert von ...). Daher möchte ich einen Datenbereich innerhalb des Begrenzungsrahmens erhalten, der von den Fensterrändern gebildet wird (die gepunktete Linie im Bild unten) ). Es ist einfach, die Koordinaten für die Punkte f und g zu ermitteln.

Frage 1: Ist das eine gute Art, Dinge zu tun? Sollte ich darüber nachdenken, sie als Kacheln zwischenzuspeichern, oder ist diese Methode wahrscheinlich effizient genug?

Frage 2: Wie rufe ich nur die Daten in diesem Begrenzungsrahmen ab?

Frage 3: Wenn eine Form die Kante des Begrenzungsrahmens überlappt (z. B. Form A unten), gibt es eine einfache Möglichkeit, sie zuzuschneiden, wie es im zweiten Bild abgefragt wird?

Bildbeschreibung hier eingeben

Mr_Chimp
quelle
Welchen Viewer führen Sie auf dem Client aus?
underdark
Mapstraction. Ich benutze derzeit OpenLayers als Provider.
Mr_Chimp

Antworten:

8

Ändern Sie einfach die Reihenfolge der Fragen und Sie haben ein Verfahren:

2) Wählen Sie nur das aus, was die bbox ( ST_Intersects) schneidet .
3) Schneide es mit der bbox, um die Polygone ( ST_Intersection) abzuschneiden .
1) Erstellen Sie eine neue Tabelle mit den Ergebnissen ( CREATE TABLE newtable AS SELECT...).

ST_Intersection-Dokumente enthalten ein Codebeispiel. Sie müssen es anpassen und ST_PolygonFromText als bbox verwenden.

Pablo
quelle
4

Ich denke, die meisten (alle) Web-Clients (und auch Desktop-GIS) tun dies. Sie können nicht den gesamten Datensatz senden.

Ob Sie eine Art Caching einrichten sollten, hängt davon ab, ob Ihre Daten statisch variieren oder sich ändern.

Wenn Sie dieses Kontrollkästchen aktivieren, werden die Daten sehr schnell abgerufen (wenn Sie einen räumlichen Index haben), aber dies ist natürlich nicht kostenlos. Sie zahlen mit etwas CPU-Leistung.

Wie bereits gesagt: Um die Polygone in Ihrer Ausdehnung zu finden, verwenden Sie ST_Intersects.

Verwenden Sie ST_Intersection, um nur den Teil in Ihrem Extent abzurufen, aber tun Sie das nicht. ST_Intersection ist ein kostspieliger Prozess. Wenn Sie keine extrem großen Polygone haben, ist es meines Erachtens besser, die gesamten Polygone zu senden.

Aber ich nehme an, Sie möchten dies im laufenden Betrieb tun, anstatt es in einen Tisch zu legen

Nicklas Avén
quelle