Speichertyp "ST_Geometry" in PostgreSQL
ArcSDE for PostgreSQL unterstützt Geometriespeichertypen, die International Organization for Standards (ISO)- und Open Geospatial Consortium, Inc. (OGC)-kompatiblen SQL-Zugriff (Structured Query Language) auf die Geodatabase bereitstellen. Diese Speichertypen sind ST_Geometry und PostGIS-Geometrie. Sie erweitern die Funktionen der PostgreSQL-Datenbank, indem sie die Speicherung von Objekten (Punkte, Linien und Polygone) ermöglichen, die geographische Features darstellen. Sie ermöglichen Ihnen, räumliche Daten in andere Typen der Geschäftsdaten zu integrieren; dadurch erhält die Mehrbenutzer-Datenbank den Vorteil, eine geographische Komponente zu den Analysen und Datenprodukten hinzufügen zu können. Die räumlichen Daten zusammen mit anderen Geschäftsobjekten zu speichern vereinfacht auch den Mehrbenutzerzugriff, die Verwaltung und die Sicherheit der Daten, da Sie weniger Datenspeicherressourcen verwalten müssen.
Standardmäßig verwendet eine ArcSDE-Geodatabase in PostgreSQL den räumlichen Datentyp "ST_Geometry". Er implementiert die SQL 3-Spezifikation benutzerdefinierter Datentypen (UDTs) und ermöglicht es Ihnen, Spalten zu erstellen, die zum Speichern von räumlichen Daten wie der Lage eines Orientierungspunktes, einer Straße oder eines Flurstückes geeignet sind. Eine Erklärung des räumlichen Datentyps "ST_Geometry" finden Sie unter Was ist der Speichertyp "ST_Geometry"?.
Wenn Sie den räumlichen Datentyp "ST_Geometry" in einer Geodatabase in PostgreSQL verwenden, können Sie auf die räumlichen Daten über SQL-Funktionen, die den räumlichen ISO SQL/MM-Standard implementieren, und über die OGC Simple Feature Specification zugreifen. Sie können SQL-Befehle zum Speichern, Abrufen und Bearbeiten von räumlichen Features wie bei jedem anderen Datentyp verwenden. Sie können eine lange Liste standardbasierter Funktionen mit SQL-Befehlen und gespeicherten Prozeduren verwenden, um räumliche Daten abzurufen und zu analysieren. Der SQL-Zugriff auf die Daten macht es möglich, mit anderen Anwendungen auf Daten zuzugreifen, die in einer Geodatabase in PostgreSQL erstellt wurden.
In diesem Thema wird Folgendes beschrieben:
- Die Architektur des räumlichen Datentyps, wie er in einer ArcSDE-Geodatabase in PostgreSQL verwendet wird
- Speichern von Feature-Classes unter Verwendung des Speichertyps "ST_Geometry"
- Datensätze in der Tabelle "sde_coordinate_system"
- Zugehörige Dokumentation
Informationen zum Arbeiten mit Tabellen, die den Speichertyp "ST_Geometry" mit SQL verwenden, finden Sie in den folgenden Themen:
- Erstellen von Tabellen mit einer "ST_Geometry"-Spalte
- Einfügen von Features in eine Tabelle mit einer "ST_Geometry"-Spalte
- Abfragen von Tabellen mit einer "ST_Geometry"-Spalte
- Aktualisieren von Werten in einer räumlichen "ST_Geometry"-Spalte
- Verwenden von räumlichen Sichten für Tabellen mit einer ST_Geometry-Spalte
Informationen zum PostGIS-Geometrietyp finden Sie unter Was ist der Geometrietyp PostGIS?
Wie ST_Geometry räumliche Daten speichert
Nachfolgend finden Sie die Beschreibung von "ST_Geometry" in PostgreSQL:
Name |
Typ |
Beschreibung |
---|---|---|
size |
LONG INTEGER |
Die Gesamtlänge der ST_Geometry-Struktur einschließlich des Shape-Puffers |
srid |
LONG INTEGER |
Enthält die Kennung für die Geometrie, die sie mit ihrem zugeordneten Raumbezugsdatensatz (Koordinatensystem) in der Tabelle "sde_spatial_references" verknüpft. |
numpts |
LONG INTEGER |
Die Anzahl der Punkte, die die Geometrie definieren; für Multipart-Geometrien schließt dies die Trennzeichen zwischen jedem Teil ein, ein Punkt für jedes Trennzeichen. |
entity |
SHORT INTEGER |
Der Typ des geometrischen Features, der in der räumlichen Spalte (Linestring, Multilinestring, Multipoint, Multipolygon, Punkt oder Polygon) gespeichert ist, dessen Wert eine Bitmaske ist, die von der gespeicherten Prozedur "st_geom_util" abgeleitet wurde. |
sqltype |
SHORT INTEGER |
Der SQL-Typ für das Shape; z. B. POINT_TYPE, POINTM_TYPE oder MULTIPOLYGONZM_TYPE |
minx |
LFLOAT |
Definiert zusammen mit miny, maxx und maxy den räumlichen Envelope der Geometrie |
miny |
LFLOAT |
Definiert zusammen mit minx, maxx und maxy den räumlichen Envelope der Geometrie |
maxx |
LFLOAT |
Definiert zusammen mit minx, miny und maxy den räumlichen Envelope der Geometrie |
maxy |
LFLOAT |
Definiert zusammen mit minx, miny und maxx den räumlichen Envelope der Geometrie |
minz |
LFLOAT |
Minimaler Z-Wert |
maxz |
LFLOAT |
Maximaler Z-Wert |
minm |
LFLOAT |
Minimaler Messwert |
maxm |
LFLOAT |
Maximaler Messwert |
Fläche |
LFLOAT |
Die Fläche der Geometrie |
len |
LFLOAT |
Die Länge des Umfangs der Geometrie |
Shape |
BYTEA |
Komprimierter Shape von Esri |
Wie andere Objekttypen enthält auch der ST_Geometry-Datentyp eine Konstruktormethode und Funktionen. Eine Konstruktormethode ist eine Funktion, die eine neue Instanz (Objekt) des Datentyps zurückgibt und die Werte seiner Attribute festlegt.
Der Name des Konstruktors ist der Gleiche wie der Typ (ST_Geometry). Wenn Sie ein Objekt vom Typ "ST_Geometry" instanziieren, rufen Sie die Konstruktormethode auf, wie im folgenden Beispiel gezeigt:
CREATE TABLE hazardous_sites (name varchar(128), location st_geometry);
Die folgenden "ST_Geometry accessor"-Funktionen nehmen eine einzelne ST_Geometry als Eingabe und geben den angeforderten Eigenschaftswert als Zahl zurück:
- Die Elementfunktion "ST_Area" gibt die Fläche einer Geometrie zurück.
- "ST_Len" gibt die Länge einer Geometrie zurück.
- "ST_Entity" gibt eine Zahl zurück, die eine Bitmaske enthält, die den Entitätstyp beschreibt.
- "ST_NumPoints" gibt die Anzahl von Punkten (Stützpunkten) zurück, die eine Geometrie definieren.
- "ST_MinM", "ST_MinX", "ST_MinY" und "ST_MinZ" geben die minimale gewünschte Koordinate einer Geometrie zurück.
- "ST_MaxM", "ST_MaxX", "ST_MaxY" und "ST_MaxZ" geben die maximale gewünschte Koordinate einer Geometrie zurück.
- ST_SRID gibt die Raumbezugskennung für eine Geometrie zurück.
Die folgende Abfrage gibt z. B. den Namen und die Fläche der einzelnen Staaten in den USA zurück.
SELECT name, st_area(geometry) FROM us_states ORDER BY name;
"ST_LineString", "ST_MultiLineString", "ST_MultiPoint", "ST_MultiPolygon", "ST_Point" und "ST_Polygon" sind alle Subtypes (oder Subclasses) von "ST_Geometry". "ST_Geometry" und die zugehörigen Subtypes haben gemeinsame Attribute und Funktionen. Die Konstruktordefinition für "ST_LineString", "ST_MultiLineString", "ST_MultiPoint", "ST_MultiPolygon", "ST_Point" und "ST_Polygon" ist die Gleiche. Der Name des Konstruktors ist der Gleiche wie der des konstruierten Typs.
Metadaten-Schema
Der räumliche Datentyp für PostgreSQL-Typen und Metadatentabellen wird im sde-Schema gespeichert. Die Schemadefinition ist die Basistabellenbeschreibung für Metadatentabellen, die verwendet wird, um den Typ Spalte/Tabelle, den räumlichen Index und die Raumbezugsinformationen zu definieren und zu beschreiben.
Eine Beschreibung der einzelnen Tabellen finden Sie in der Auflistung unter Systemtabellen einer Geodatabase in PostgreSQL. Die Tabellen sind "st_coordinate_systems", "st_units_of_measure", "sde_geometry_columns", "sde_spatial_references" und "sde_coordinate_system".
Erstellen von Feature-Classes mit dem Speichertyp "ST_Geometry" unter Verwendung von ArcGIS
Wenn Sie ArcSDE for PostgreSQL erstmals installieren, ist "ST_Geometry" beim Erstellen von Feature-Classes durch ArcGIS Desktop oder den Befehl "sdelayer" der Standard-Geometriespeichertyp. Die Standardeinstellungen für die ArcSDE-Speicherung werden in der Tabelle "sde_dbtune" durch die GEOMETRY_STORAGE-Parameter des Konfigurationsschlüsselworts DEFAULTS definiert. Wenn Sie den GEOMETRY_STORAGE-Parameterwert des Schlüsselworts DEFAULTS nicht ändern, werden alle Ihre Feature-Classes mit dem Speichertyp "ST_Geometry" erstellt, außer wenn Sie beim Erstellen der Feature-Class ein anderes Konfigurationsschlüsselwort angeben, in dem GEOMETRY_STORAGE auf PG_GEOMETRY festgelegt ist.
Wenn Sie sich entscheiden, den DEFAULTS GEOMETRY_STORAGE-Parameter in PG_GEOMETRY zu ändern, der die von PostGIS verwendeten räumlichen Datentypen angibt, können Sie ein neues Konfigurationsschlüsselwort für den Speichertyp "ST_Geometry" erstellen. Erstellen Sie beispielsweise ein Konfigurationsschlüsselwort wie folgt:
##ST_GEOMETRY GEOMETRY_STORAGE "ST_GEOMETRY" UI_TEXT "User-interface for ST_GEOMETRY keyword" END
Sie verwenden den Befehl "sdedbtune", um Werte in der Tabelle "sde_dbtune" zu ändern oder hinzuzufügen. Weitere Informationen finden Sie unter Ändern des Inhalts der Tabelle DBTUNE, nachdem sie erstellt wurde.
Der PostGIS-Speichertyp und der Speichertyp "ST_Geometry" können zusammen in der gleichen Datenbank verwendet werden. Während es nur einen Standard-Geometriespeichertyp geben kann, können einzelne Tabellen mit verschiedenen Geometriespeichertypen erstellt werden. Wenn Sie also den standardmäßigen GEOMETRY_STORAGE in PG_GEOMETRY ändern, können Sie weiterhin einige der Feature-Classes mit dem Speichertyp ST_GEOMETRY unter Angabe eines ähnlichen Schlüsselworts wie oben dargestellt erstellen.
Wenn Sie eine Feature-Class erstellen, die ST_GEOMETRY für GEOMETRY_STORAGE verwendet, wird die Business-Tabelle der Feature-Class mit einer Spalte des Typs "ST_Geometry" erstellt, in der räumliche Daten für die Feature-Class gespeichert werden.
Verwenden von vorhandenen PostgreSQL-Tabellen mit ST_Geometry-Spalten
Wenn Sie mithilfe von SQL eine Tabelle mit einer ST_Geometry-Spalte erstellen, können Sie die Tabelle bei ArcSDE registrieren, falls die folgenden Kriterien erfüllt werden:
- Der Benutzer, von dem die Tabelle registriert wird, muss der Besitzer sein.
- Die Tabelle muss eine einzelne "ST_Geometry"-Spalte enthalten.
- Die Tabelle darf keine weiteren benutzerdefinierten Spalten aufweisen.
- Die Tabelle darf nur einen Geometrietyp aufweisen (Punkte, Linien oder Polygone), einzelne Multipart-Geometrien (Multipoint, Multilinestring oder Multipolygon) sind jedoch zulässig.
- Alle Datensätze in der Tabelle müssen denselben Raumbezug aufweisen.
Außerdem muss eine eindeutige Spalte vom Typ "Integer" ohne Nullwerte (NOT NULL) vorhanden sein, die als registrierte Zeilen-ID-Spalte verwendet werden kann. Diese Spalte kann der Tabelle vor der Registrierung in ArcSDE oder während der Registrierung hinzugefügt werden.
Außerdem sollte die Tabelle einen räumlichen Index haben. Dieser kann vorher mit SQL hinzugefügt werden oder nach dem Registrieren der Tabelle in ArcSDE.
Erstellen einer Tabelle mit einer "ST_Geometry"-Spalte
Im folgenden Beispiel wird mithilfe von SQL eine Tabelle "blocks" mit der ST_Geometry-Spalte "shape" erstellt.
CREATE TABLE sasha.blocks (objectid integer NOT NULL, block varchar(4), res smallint, shape st_geometry) WITHOUT OIDS;
Erstellen eines räumlichen Indexes für die Tabelle
ArcSDE for PostgreSQL verwendet einen Generalized Search Tree (GiST)-Index. Verwenden Sie eine CREATE INDEX-Anweisung mit der GiST-Zugriffsmethode und der "st_geometry_ops"-Operatorklasse, um für die Spalte "ST_Geometry" einer Tabelle einen Index zu erstellen. Beispiele:
CREATE INDEX blockssp_idx ON blocks USING gist(zone st_geometry_ops);
Registrieren der Tabelle in ArcSDE
Sobald die Tabelle mit der Spalte "ST_Geometry" vorhanden ist und einen räumlichen Index hat, verwenden Sie den Befehl "sdelayer –o register", um die Tabelle bei ArcSDE zu registrieren. Wenn Sie eine Tabelle in ArcSDE registrieren, wird für die Tabelle in den Systemtabellen "sde_layers", "sde_table_registry" und "sde_geometry_columns" ein Datensatz hinzugefügt. Außerdem werden der Systemtabelle "sde_column_registry" für jede Spalte in der Tabelle Datensätze hinzugefügt.
sdelayer –o register –l blocks,shape –e a –C objectid,SDE –R 5 –t ST_GEOMETRY – s myserver –i sde:postgresql:myserver –D mycitydb –u sasha –p super1
Für Tabellen, die eine große Anzahl von Datensätzen enthalten, braucht die Registrierung möglicherweise weniger Zeit, wenn Sie die Zeilen-ID-Spalte als vom Benutzer verwaltet registrieren.
sdelayer –o register –l blocks,shape –e a –C objectid,USER –t ST_GEOMETRY –s myserver –i sde:postgresql:myserver –D mycitydb –u sasha –p super1
Wenn Sie jedoch die Feature-Kennungsspalte als vom Benutzer verwaltet registrieren und dann die Feature-Class in der Geodatabase registrieren, fügt ArcGIS eine zusätzliche Feature-Kennungsspalte mit dem Namen "object_ID" hinzu. Die Werte in dieser Spalte werden von ArcGIS verwaltet. Wenn die Tabelle eine große Anzahl von Datensätzen enthält, kann das Hinzufügen dieser zusätzlichen "object_ID"-Spalte einige Zeit in Anspruch nehmen.
Vorausgesetzt, dass Sie die räumliche Spalte registriert haben und unter Verwendung der Funktion "st_register_spatial_column" eine Raumbezugs-ID (SRID) für die Tabelle angegeben haben, müssen Sie keine SRID mit dem Befehl "sdelayer" angeben. Wenn Sie jedoch der Tabelle noch keine SRID zugewiesen haben, müssen Sie eine gültige SRID mit der Option –R angeben, wie im folgenden Beispiel gezeigt:
sdelayer –o register –l infestations,site –e p+ –C siteid,SDE –s myserver –t ST_GEOMETRY –R 3 –i sde:postgresql:myserver –D meddb –u blorca –p it.s.me
Wie bereits in diesem Thema erwähnt, wenn der benötigte Raumbezug nicht in der Tabelle "sde_spatial_references" vorhanden ist, erstellen Sie eine Template-Feature-Class in ArcCatalog, die den gewünschten Raumbezug verwendet, und fragen dann die Tabelle "sde_spatial_references" ab, um zu sehen, welche SRID ihr zugewiesen wurde. Dies ist die Nummer, die Sie beim Registrieren von anderen räumlichen Tabellen im gleichen Koordinatenbezugssystem verwenden müssen.
Wenn Sie die räumliche Spalte nicht unter Verwendung der Funktion "st_register_spatial_column" mit einer SRID registriert haben und auch keine mit der Option –R angeben, wenn Sie die Tabelle in ArcSDE registrieren, wird die SRID des ersten Datensatzes verwendet. Wenn Sie die räumliche Spalte nicht unter Verwendung der Funktion "st_register_spatial_column" mit einer SRID registriert haben und die Tabelle leer ist, wird die SRID 0 verwendet. Die SRID 0 ist nur zu Beispiel- und Dokumentationszwecken vorhanden und sollte nicht für Produktionsdaten verwendet werden. Die Spezifikationen für diese SRID sind wie folgt:
falsex |
- 400 |
falsey |
- 400 |
xyunits |
1000000000 |
falsez |
- 100000 |
zunits |
10000 |
falsem |
- 100000 |
munits |
10000 |
xycluster_tol |
0.000000008983153 |
zcluster_tol |
.001 |
mcluster_tol |
.001 |
srtext |
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]], PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] |
cs_id |
4326 |
organization |
EPSG |
Die vollständige Syntax und eine Beschreibung des Befehls "sdelayer" finden Sie in der "ArcSDE Administration Command Reference", die zusammen mit ArcGIS Server Enterprise bereitgestellt wird.
Der Befehl "sdelayer" fügt die Tabelle nur den ArcSDE-Systemtabellen hinzu. Um die ArcGIS Desktop-Geodatabase-Funktionalität wie z. B. Topologie, Versionierung und Netzwerke verwenden zu können, müssen Sie die Tabelle auch bei der Geodatabase registrieren. Weitere Informationen finden Sie unter Registrieren einer Tabelle in der Geodatabase und Registrieren einer Tabelle eines Drittanbieters mit einer räumlichen Spalte.
Tipps
- Sie können die räumliche Spalte in einer Tabelle, die eine ST_Geometry-Spalte enthält, durch das Ausführen der Funktion "sde.st_register_spatial_column" registrieren. Dies weist die SRID für die Tabelle zu und verhindert dadurch, dass Benutzer andere SRIDs angeben, wenn sie Daten über SQL einfügen.
SELECT st_register_spatial_column( '<database_name>', '<schema_name>', '<table_name>', '<spatial_column_name>', <srid>)
SELECT st_register_spatial_column( 'mycitydb', 'sasha', 'blocks', 'shape', 4)
- Sie können die Registrierung einer räumlichen Spalte aufheben, indem Sie die Funktion "st_unregister_spatial_column()"ausführen. Diese Funktion hebt die Registrierung einer räumlichen Spalte auf, indem er die räumliche Spalte aus der Systemtabelle "sde_geometry_columns" entfernt, damit die räumliche Spalte nicht mehr mit einem Raumbezugssystem verknüpft ist.
SELECT st_unregister_spatial_column( '<database_name>', '<schema_name>', '<table_name>', '<column_name>')
- Sie können überprüfen, ob eine räumliche Spalte registriert ist, indem Sie die Funktion "st_isregistered_spatial_column" ausführen.
SELECT st_isregistered_spatial_column( '<database_name>', '<schema_name>', '<table_name>', '<column_name>', <srid>)
Datensätze in der Tabelle "sde_coordinate_systems"
In der Tabelle "sde_coordinate_systems" im SDE-Schema werden die ID und die Beschreibung der Koordinatensysteme, die in der Datenbank verwendet werden, gespeichert. Sie wird vollständig mit den Koordinatensystemen ausgefüllt, wenn die Geodatabase erstellt wird.
Sie können die Koordinatensysteme in dieser Tabelle für die Feature-Classes verwenden, die Sie mittels ArcGIS Desktop oder SQL erstellen.
Zusätzlich zum Zuweisen eines Koordinatensystems müssen Sie einen Raumbezug erstellen. ArcGIS Desktop führt dies als Teil der Feature-Class-Erstellung durch. Informationen zum Erstellen eines Raumbezugs für Tabellen mit SQL finden Sie unter Erstellen von räumlichen Indizes für Tabellen mit einer "ST_Geometry"-Spalte.
Weitere PostgreSQL-Dokumentation
PostgreSQL-Dokumentation finden Sie auf der PostgreSQL-Website unter http://www.postgresql.org/docs/. Diese Dokumentation enthält Informationen zum Installieren und Verwalten von PostgreSQL, SQL-Befehlen und Programmierung sowie Lernprogramme zur Verwendung von PostgreSQL.
- Benutzergruppen
Es gibt viele PostgreSQL-Benutzergruppen überall auf der Welt. Eine Liste von einigen Gruppen finden Sie unter http://pugs.postgresql.org/.
- Fallstudien
Links zu Fallstudien von Sites, die PostgreSQL verwenden, finden Sie unter http://www.postgresql.org/about/casestudies/.
- Wöchentlicher Newsletter
Jede Woche wird ein Community-Newsletter ausgegeben, der die neuesten Entwicklungen und auf PostgreSQL bezogene Informationen auflistet: http://www.postgresql.org/community/weeklynews/.