Was ist der Zweck von PostGIS unter PostgreSQL?

49

PostgreSQL unterstützt bereits räumliche Datentypen, Operatoren und Indizierungen.

Was genau bietet PostGIS, das es erforderlich machte, als Erweiterung zu PostgreSQL zu existieren?

Warum nutzen wir nicht alle nur die räumlichen Funktionen von PostgreSQL?

Zeruno
quelle
2
Es ist PostGIS, das diese räumlichen Datentypen, Operatoren und Indizierungen
bereitstellt
5
Nein, er spricht von den nativen PostgreSQL-Geometrietypen.
Evan Carroll
4
Die kurze Antwort lautet: PostGIS ist (jetzt) ​​10x so funktional wie die PgSQL-Typen. Die lange Antwort, die die Frage umfasst, warum neue Typen entwickelt und nicht nur die bereits vorhandenen verbessert werden, wird im Folgenden behandelt.
Paul Ramsey
1
Dasselbe geschah mit dem Java Spring Framework. Java hatte Mängel / fehlende Funktionen. Spring hat viele Java-Fehler behoben und nützliche Funktionen hinzugefügt. Java hat die Fixes und Features von Spring kopiert. Die Leute fragen dann, warum Frühling existiert ...
Neil McGuigan

Antworten:

86

Wenn Sie das Universum auf Anfang 2001 zurückverwandeln und nicht nur die Erfinder von PostGIS in die Zukunft blicken lassen, sondern auch den PSC von PgSQL in die Zukunft blicken lassen, besteht PostGIS möglicherweise aus einer Reihe von Patches für PgSQL. Aber zumindest, wenn wir als Patches zum Kern angefangen hätten, wären wir zuerst auf folgendes gestoßen:

  • Kernbereiche von PgSQL unterstützen keine Lücken, aber das GIS-Modell will wirklich Lücken. Können wir das ändern?

Und Kern-PgSQL hätte gesagt: "Nein, natürlich nicht, Bereiche haben eine gut verstandene Semantik und wir können nicht rückwärts inkompatible Änderungen vornehmen."

Als Nicht-Kernentwickler war PostGIS in der Lage, monatliche und halbjährliche Veröffentlichungen für eine Reihe von Jahren auszuschalten, während der PgSQL-Kern mit jährlichen und längeren Veröffentlichungen einherging. Wir konnten auch beliebige Funktionen hinzufügen, wann immer wir wollten, da wir in unserem Projekt Commit-Rechte hatten, aber das Erlangen von Commit-Rechten in PgSQL dauert sehr lange.

Als PostGIS genug externen Wert demonstrierte, den der PgSQL-Kern überblickte, und sich sagte, "huh, das wäre schön gewesen, wenn er ein zusätzliches Feature in Core gewesen wäre", gab es bereits so viel Code mit einem anderen Standard und Stil PgSQL (ganz zu schweigen von einer inkompatiblen Lizenz), dass die Idee des Zusammenführens nicht wirklich möglich war.

Stattdessen ist PostGIS das kanonische Beispiel für eine Really Large Complex Extension, mit der PgSQL modular und erweiterbar bleibt. "Wie wird sich das auf so etwas wie PostGIS auswirken?", Wird oft gefragt, während PgSQL einige Änderungen bewertet. Dies ist auch eine gute Sache, vielleicht nicht ganz so schön wie PostGIS als Teil des Kerns, aber gut genug.

Es gibt noch andere Gründe, wie die lange Liste von Abhängigkeiten, die der PgSQL-Kern nicht gerne gesehen hätte, die allgemein geringere Codekonsistenz und API-Sauberkeit, deren Verbesserung sie verzweifelt hätten, und so weiter. Bereits bei der Konzeption war PostGIS zu groß für PgSQL, um es mit einem Bissen zu schlucken.

Paul Ramsey
quelle
Auch ... PostGIS ist C ++. Dies wäre ein Showstopper für eine PostgreSQL-Zusammenführung. Ob es nun sein sollte oder nicht . Abhängigkeiten würden es auch ganz aufhalten - GDAL? Ha! Ich kann nicht einmal Core dazu bringen, zuzustimmen, von Perl> 5.8.0 abhängig zu sein. Das Entwicklungstempo ist gering, auch wenn Sie über Commit-Rechte verfügen. committers müssen nicht nur für alles, was im Baum steckt, frei sein, sie müssen die Codeüberprüfung durchlaufen und in einigen Monaten oder Jahren große Änderungen vornehmen. Es gibt Vorteile in Bezug auf die Codequalität, aber es ist sicher nicht schnelllebig.
Craig Ringer
Es ist ein besonderes Problem, dass Core Pg Dinge immer wieder neu erfindet, um zu vermeiden, dass mehr externe Bibliotheken benötigt werden. Da dies bedeuten würde, dass $ ancient_unix_42 mit $ weird_vendor_compiler auf $ dead_architecture dies unterstützen müsste, müssten alle Buildfarm-Mitglieder aktualisiert werden usw. Es ist wohl eines der Probleme, wenn man ausgereift und stabil ist.
Craig Ringer
@CraigRinger Warum ist PostGIS Ihrer Meinung nach C ++? Das ist eine Beleidigung :-)
Nicklas Avén
Ist es nicht? Ich hätte schwören können. Aber sicher sieht es nicht so aus. Mein Fehler. Eigentlich mag ich (gemäßigt und zurückhaltend) die Verwendung von C ++ sowieso.
Craig Ringer
4
Für einige Zeit verfügte PostGIS über einige C ++ - Komponenten, um eine Bindung an GEOS herzustellen. Nachdem GEOS seine eigene C-API hinzugefügt hatte, wurden diese Teile entfernt und PostGIS wurde zu "reinem" C.
Paul Ramsey
34

Das stimmt einfach nicht, PostgreSQL unterstützt keine räumlichen Datentypen. Es unterstützt geometrische Typen. Diese sind für einige Dinge vollkommen in Ordnung, aber völlig unabhängig von den realen Koordinatensystemen. Einheimische Typen

Aktualisieren

Die Indexfrage finden Sie in den FAQ

Warum werden PostgreSQL-R-Tree-Indizes nicht unterstützt?

Frühe Versionen von PostGIS verwendeten die PostgreSQL-R-Tree-Indizes. PostgreSQL-R-Trees wurden jedoch seit Version 0.6 vollständig verworfen, und die räumliche Indizierung wird mit einem R-Tree-over-GiST-Schema bereitgestellt.

Unsere Tests haben ergeben, dass die Suchgeschwindigkeit für native R-Tree und GiST vergleichbar ist. Native PostgreSQL-R-Trees weisen zwei Einschränkungen auf, die sie für die Verwendung mit GIS-Funktionen unerwünscht machen (beachten Sie, dass diese Einschränkungen auf die aktuelle native PostgreSQL-R-Tree-Implementierung zurückzuführen sind, nicht auf das R-Tree-Konzept im Allgemeinen):

  • R-Tree-Indizes in PostgreSQL können keine Features verarbeiten, die größer als 8 KB sind. GiST-Indizes können mit dem "verlustbehafteten" Trick den Begrenzungsrahmen für das Feature selbst ersetzen.

  • R-Tree-Indizes in PostgreSQL sind nicht "nullsicher", daher schlägt die Erstellung eines Index für eine Geometriespalte fehl, die nullgeometrische Elemente enthält. [GiST-Indizes sind nullsicher]

Evan Carroll
quelle
Können Sie auf Ihren letzten Punkt eingehen - den über GiST-Indizes? PostgreSQL stellte R-Tree zur Verfügung und stellt dies nun über einen GiST-Index zur Verfügung, so dass ich über diesen Punkt verwirrt bin.
Zeruno
aktualisiert mit direktem text aus der faq.
Evan Carroll
1
Die GiST-API ist eine PostgreSQL-Sache, die von access / gist.h bereitgestellt wird . Sie können es in PostGIS hier sehen
Evan Carroll
3
Obwohl PostGIS über eine eigene Implementierung von Rtree-on-Gist verfügt, ähnelt es derjenigen, die PgSQL für die Kernunterstützung von grafischen Objekten verwendet, und zwar aus dem einfachen Grund, aus dem wir diese ursprünglich kopiert haben.
Paul Ramsey
1
@Zeruno, Nein. Wenn Sie den rtree-Splitter in PgSQL ändern, ändert sich das Verhalten von PostGIS nicht, da wir in gserialized_gist_picksplit_2d () einen eigenen haben. Sie werden nicht, wenn überhaupt, dass es sich nicht allzu sehr von PgSQL unterscheidet.
Paul Ramsey
8

PostGIS ist ein räumlicher Datenbank-Extender für objektrelationale PostgreSQL -Datenbanken. Es werden geografische Objekte unterstützt, sodass Standortabfragen in SQL ausgeführt werden können.

SELECT superhero.name
FROM city, superhero
WHERE ST_Contains(city.geom, superhero.geom)
AND city.name = 'Gotham';

Zusätzlich zur grundlegenden Standorterkennung bietet PostGIS viele Funktionen, die in anderen konkurrierenden räumlichen Datenbanken wie Oracle Locator / Spatial und SQL Server selten zu finden sind. Weitere Informationen finden Sie in der PostGIS-Funktionsliste .

Die Liste der PostGIS-Funktionen erweitert auch diese Funktionen:

PostGIS fügt der PostgreSQL- Datenbank zusätzliche Typen (Geometrie, Geografie, Raster usw.) hinzu . Außerdem werden Funktionen, Operatoren und Indexverbesserungen hinzugefügt, die für diese räumlichen Typen gelten. Diese zusätzlichen Funktionen, Operatoren, Indexbindungen und Typen erweitern die Leistungsfähigkeit des zentralen PostgreSQL-DBMS und machen es zu einem schnellen, funktionsreichen und robusten räumlichen Datenbankverwaltungssystem.

Funktionsliste

Die PostGIS 2+ -Reihe bietet:

  • Verarbeitungs- und Analysefunktionen für Vektor- und Rasterdaten zum Spleißen, Zerteilen, Verwandeln, Reklassifizieren und Sammeln / Vereinigen mit der SQL-Rasterzuordnungsalgebra für eine feinkörnige Rasterverarbeitung
  • Räumliche Reprojektion Von SQL aufrufbare Funktionen für Vektor- und Rasterdaten Unterstützung für den Import / Export von ESRI-Shapefile-Vektordaten über Befehlszeilen- und GUI-Tools sowie Unterstützung für weitere Formate über andere Open Source-Tools von Drittanbietern
  • Gepackte Befehlszeile zum Importieren von Rasterdaten aus vielen Standardformaten: GeoTiff, NetCDF, PNG, JPG

  • Unterstützung für das Rendern und Importieren von Vektordaten für Standardtextformate wie KML, GML, GeoJSON, GeoHash und WKT mit SQL Rendern von Rasterdaten in verschiedenen Standardformaten GeoTIFF, PNG, JPG, NetCDF, um nur einige zu nennen, die SQL verwenden

  • Aufrufbare SQL-Funktionen für nahtlose Raster- / Vektor-Funktionen zum Extrudieren von Pixelwerten nach geometrischen Regionen, Ausführen von Statistiken nach Regionen, Ausschneiden von Rastern nach Geometrie und Vektorisieren von Rastern Unterstützung für 3D-Objekte, räumliche Indizes und Funktionen Unterstützung für Netzwerktopologie Packaged Tiger Loader / Geocoder / Reverse Geocoder Verwendung von US Census Tiger Daten

Darüber hinaus auf die bereits in diesem Beitrag genannten Punkte / Teile. Ich würde hinzufügen, wie auf der PostGIS-Website erwähnt, wie es funktioniert

Da sich PostGIS in C befindet, kann es auf andere Bibliotheken in C und C ++ zurückgreifen, und das sehr großzügig. PostGIS ist abhängig von:

  • GEOS für viele Geometrieverarbeitungsalgorithmen
  • Proj.4 für Koordinaten- Neuprojektionsfunktionen
  • GDAL für Rasterverarbeitung und Formatunterstützung
  • LibXML2 für XML-Analyse
  • JSON-C für das JSON-Parsen
  • SFCGAL für erweiterte 3D-Unterstützung und zusätzliche Geoverarbeitungsalgorithmen
Whyzar
quelle