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:

Informationen zum Arbeiten mit Tabellen, die den Speichertyp "ST_Geometry" mit SQL verwenden, finden Sie in den folgenden Themen:

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 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:

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>)
    Um die Shape-Spalte der Tabelle "blocks" zu registrieren und ihr eine SRID zuzuweisen, führen Sie die folgende Anweisung aus:
    SELECT st_register_spatial_column(
    'mycitydb', 'sasha', 'blocks', 'shape', 4)
    Dies fügt der Tabelle "sde_geometry_columns" in der Geodatabase die räumliche Spalte hinzu. Die von Ihnen angegebene SRID (4 im vorangehenden Beispiel) muss in der Tabelle "sde_spatial_references" vorhanden sein. Wenn das Raumbezugssystem, das Sie benötigen, nicht bereits in der Tabelle "sde_spatial_references" vorhanden ist, können Sie ArcCatalog starten, eine Verbindung mit der Geodatabase herstellen und dann eine neue Feature-Class erstellen, die das gewünschte Raumbezugssystem und "ST_Geometry"-Speicherung verwendet. Dabei wird die Tabelle "sde_spatial_references" mit dem gewünschten Raumbezug ausgefüllt und ArcCatalog berechnet die X,Y, Z - und M-Versätze und Einheiten sowie die Layer-Ausdehnung für Sie. Es ist auch möglich, SQL zu verwenden, um den Raumbezug einzufügen. Dabei müssen Sie jedoch die richtigen X,Y, Z - und M-Versätze und Einheiten selbst berechnen. Beachten Sie aber, dass Sie die Registrierung der Spalte "ST_Geometry" aufheben müssen, um die Tabelle in ArcSDE mit dem Befehl "sdelayer" zu registrieren. Sie können z. B. eine Tabelle erstellen, und andere Benutzer führen Einfügungen in die Tabelle mit SQL aus. Um die Verwendung einer einzelnen SRID zu erzwingen, können Sie die Spalte "ST_Geometry" mit der SRID registrieren, die Sie möchten. Wenn Sie sich dann entscheiden, die Tabelle in ArcSDE zu registrieren, führen Sie die Funktion "st_unregister_spatial_column" aus. (Siehe nächster Tipp.)
  • 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 würden dies durchführen, bevor Sie die Tabelle in ArcSDE registrieren, oder wenn Sie eine leere räumliche Spalte mit einer anderen SRID registrieren möchten. Sie können die Registrierung aufheben und sie dann erneut mit einer anderen SRID unter Verwendung der Funktion "st_register_spatial_column" registrieren.
  • 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>) 
    Dies gibt 1 zurück, wenn die räumliche Spalte registriert ist, und 0, wenn sie nicht registriert ist.

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.


7/10/2012