2009-06-21 5 views
28

PostgreSQL unterstützt eine Vielzahl von geometric types out of the Box, zusammen mit vielen geometrischen operators und GiST indexes, die räumliche Indexierung von Daten bieten scheinen.Geodaten in PostgreSQL

Und dann gibt es auch PostGIS, die eine Erweiterung zu PG ist.

Was ist der Unterschied zwischen der integrierten räumlichen Unterstützung in PG und PostGIS?

Wenn meine Anwendung geografische Koordinaten (Punkte, Flächen, Polygone) speichern und dann effizient Abfragen ausführen muss (z. B. Punkt-in-Polygon, Polygon-Schnitt), benötige ich PostGIS oder kann ich (wohl) mehr verwenden bequeme und einfachere integrierte Datentypen/Syntax?

Antwort

31

Zunächst möchte ich GiST-Indizes verdeutlichen: GiST ist eigentlich ein Framework zum Erstellen von Indizes für neue Datentypen, nicht für ein bestimmtes Indexierungsschema. Dieses Framework wird für die geometrischen Typen verwendet, die mit Postgres geliefert werden, aber es wird auch für einen Trigramm-übereinstimmenden Textähnlichkeitsindex auf Standard-Textspalten verwendet und wird natürlich von den Indexierungsschemata vieler externer Pakete verwendet, unter denen wir können Nummer PostGIS.

Ob die standardmäßigen geometrischen Datentypen für Sie arbeiten oder Sie PostGIS benötigen, hängt vollständig von Ihrer Anwendung ab.

PostGIS speichert geometrische Daten in einer Spalte vom Typ "Geometrie"; In diesem können Sie mehr oder weniger beliebige Daten speichern (Punkte, Kreise, Polygone, Was haben Sie?). Die Indexierung ist schnell und ziemlich ausgereift: Sie kann Dinge wie verlustbehaftete Indizierung mit Begrenzungsrahmen für komplexe Formen ausführen, die sonst nicht vernünftig indexierbar sind. Verschiedene räumliche Bezugssysteme werden unterstützt, mit automatischer Umwandlung der Ergebnisse von Abfragen. PostGIS unterstützt auch standardisierte OpenGIS-Formate, die beim Datenaustausch mit anderen Systemen helfen können.

Im Gegensatz dazu ist die Menge der internen geometrischen Typen und ihrer Indizes viel weniger anspruchsvoll. Es gibt keinen echten "generischen" Geometrietyp. Stattdessen müssen Sie auswählen, dass der Typ einer Spalte ein Punkt, eine Linie, ein Kreis, ein Vieleck oder was Sie haben soll; Bei Kombinationen müssen Sie wahrscheinlich mehrere Spalten verwenden. Die Indizierung ist nicht so gut; Es können nicht so viele verschiedene Arten von Shapes indiziert werden (obwohl Sie Bounding Box-Unterstützung hinzufügen könnten, indem Sie eine separate Spalte für sie verwenden und die Bounding Boxes manuell generieren) und die Indizes sind in manchen Situationen wahrscheinlich nicht so schnell. Wenn andererseits die internen geometrischen Typen Ihre Anforderungen erfüllen, haben Sie den Vorteil, dass Ihre Anwendung leichter auf andere Systeme übertragen werden kann, auf denen Postgres, aber nicht PostGIS installiert ist.

Mein Rat wäre, mit den internen geometrischen Typen herumzuspielen und zu sehen, wie gut das für Sie funktioniert; Wenn Sie Probleme haben, probieren Sie PostGIS aus.

+0

danke. Hey, würde es dir etwas ausmachen, einen Blick darauf zu werfen: http://stackoverflow.com/questions/1012504/sql-query-for-point-in-polygon-using-postgres –

+0

Auf dem einen sieht aus, als ob Sie bereits Ihre Antwort haben: Sie mischen Standard-Postgre-Geometrietypen und PostGIS-Typen. Dies sind zwei getrennte Dinge; Ich schlage vor, dass Sie das eine oder das andere verwenden, es sei denn, Sie finden einen seltsamen Fall, in dem die Standard-Postgres-Typen effizienter sind oder besser funktionieren als die PostGIS-Typen. –