"ST_Geometry" in PostgreSQL

Der räumliche Datentyp "ST_Geometry" kann in PostgreSQL-Datenbanken mit und ohne Geodatabase verwendet werden. Der Datentyp "ST_Geometry" ermöglicht die Integration räumlicher Daten in andere Geschäftsdatentypen. 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 anschließend weniger Datenspeicherressourcen verwalten müssen.

Um in PostgreSQL-Geodatabases den Typ "ST_Geometry" zu verwenden, müssen Sie vor dem Erstellen einer Geodatabase die Bibliothek "st_geometry" in die PostgreSQL-Installation kopieren. Anweisungen hierzu finden Sie unter Erstellen einer Geodatabase in PostgreSQL unter Windows oder Erstellen einer Geodatabase in PostgreSQL unter Linux. Wenn Sie eine PostgreSQL-Datenbank verwenden, die keine Geodatabase enthält, können Sie den Typ "ST_Geometry" zur Verwendung in räumlichen Tabellen installieren, die in der Datenbank erstellt werden.

Über die folgenden Links erhalten Sie weitere Informationen zum Typ "ST_Geometry" in PostgreSQL:

Wie ST_Geometry räumliche Daten speichert

Nachfolgend finden Sie die Beschreibung von "ST_Geometry" in PostgreSQL:

NameTypBeschreibung

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 gespeichert wird (Linestring, Multilinestring, Multipoint, Multipolygon, Punkt oder Polygon).

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

area

LFLOAT

Die Fläche der Geometrie.

len

LFLOAT

Die Länge des Umfangs der Geometrie.

shape

BYTEA

Komprimiertes Shape von Esri.

Wie andere Objekttypen enthält auch der ST_Geometry-Datentyp eine Konstruktormethode und Funktionen. Eine Konstruktormethode gibt eine neue Instanz (Objekt) des Datentyps zurück und legt die Werte seiner Attribute fest.

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_Length" 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.

Schemadefinition "ST_Geometry"

Der räumliche Datentyp für PostgreSQL-Funktionen, -Tabellen und -Sichten wird im SDE-Schema gespeichert. Die Schemadefinition ist die Basistabellenbeschreibung für Systemtabellen, die verwendet wird, um den Typ "Spalte/Tabelle", den räumlichen Index und die Raumbezugsinformationen zu definieren und zu beschreiben.

Die Tabellen sind "sde_geometry_columns" und "sde_coordinate_systems". Die Sichten sind "st_geometry_columns" und "st_spatial_references" und basieren auf diesen Tabellen.

Detailinformationen:

Neben den Systemtabellen, Sichten und Funktionen werden Informationen zu "ST_Geometry" anhand der folgenden Datenbankobjekte verwaltet:

  • Eine SDE-Anmelderolle
  • Ein SDE-Schema in der Datenbank
  • Ein ST_Geometry-Trigger: sde_coord_sys_def_insert_tg
  • ST_Geometry-Domänen:
    • st_geomcollection
    • st_linestring
    • st_multilinestring
    • st_multipoint
    • st_multipolygon
    • st_point
    • st_polygon

Erstellen von Feature-Classes mit dem Speichertyp "ST_Geometry" mit ArcGIS

Den zu verwendenden Speichertyp wählen Sie beim Erstellen von Feature-Classes mit ArcGIS aus.

Wenn Sie eine Feature-Class in ArcGIS erstellen, die den Speichertyp "ST_Geometry" verwendet, wird die Business-Tabelle der Feature-Class mit einer Spalte vom Typ "ST_Geometry" erstellt, in der räumliche Daten für die Feature-Class gespeichert werden.

In einer Datenbank

Für Feature-Classes, die Sie in einer PostgreSQL-Datenbank erstellen, wird standardmäßig der räumliche Datentyp "ST_Geometry" verwendet. Um einen räumlichen PostGIS-Datentyp zu verwenden, müssen Sie bei der Erstellung der Feature-Class über den ArcGIS-Client ein anderes Schlüsselwort angeben. Weitere Informationen finden Sie unter Erstellen einer Feature-Class.

In einer Geodatabase

Speicherinformationen für Feature-Classes werden durch Konfigurationsschlüsselwort-Einstellungen in einer Systemtabelle gesteuert. Sie geben ein Konfigurationsschlüsselwort an, wenn Sie eine Feature-Class in ArcGIS erstellen. Mit dem Konfigurationsschlüsselwort "DEFAULTS" wird der Parameter "GEOMETRY_STORAGE" entweder auf "ST_Geometry" festgelegt (wenn Sie die Geodatabase mit Verwendung von "ST_Geometry" erstellt haben) oder auf "PG_Geometry" (wenn Sie die Geodatabase mit Verwendung von räumlichen PostGIS-Datentypen erstellt haben).

Wenn der Parameter "DEFAULTS GEOMETRY_STORAGE" so festgelegt wurde, dass der PostGIS-Datentyp "geometry" oder "geography" verwendet wird, Benutzer aber einige Feature-Classes mit dem Datentyp "ST_Geometry" erstellen müssen, muss der Geodatabase-Administrator ein Konfigurationsschlüsselwort für den ST_Geometry-Speichertyp erstellen. Verwenden Sie das Geoverarbeitungswerkzeug Konfigurationsschlüsselwörter für Geodatabase exportieren, um den Inhalt der Systemtabelle in eine Textdatei zu exportieren, fügen Sie ein Schlüsselwort hinzu, für das "GEOMETRY_STORAGE" auf "ST_GEOMETRY" festgelegt ist, und importieren Sie anschließend die Änderungen mit dem Geoverarbeitungswerkzeug Konfigurationsschlüsselwörter für Geodatabase importieren. Sie können beispielsweise die Inhalte der Systemtabelle in eine Textdatei exportieren und ein Konfigurationsschlüsselwort hinzufügen. Dazu gehen Sie wie folgt vor:

##ST_GEOMETRY
GEOMETRY_STORAGE    "ST_GEOMETRY"
UI_TEXT   "User-interface for ST_GEOMETRY keyword"

END

Weitere Informationen finden Sie unter Ändern von Konfigurationsschlüsselwörtern.

Nachdem das Schlüsselwort hinzugefügt wurde, kann es von allen Benutzern bei der Erstellung einer Feature-Class in ArcGIS angegeben werden.

Zugreifen auf PostgreSQL-Tabellen mit ST_Geometry-Spalten mithilfe von ArcGIS

Wenn Sie SQL verwenden, um eine Tabelle mit einer ST_Geometry-Spalte zu erstellen, können Sie über SQL, benutzerdefinierte Anwendungen von Drittanbietern und ArcGIS auf die Daten zugreifen. Wenn Sie eine Verbindung mit der Datenbank von ArcGIS herstellen, können Sie Analysen anzeigen oder durchführen. Sie können auch Daten in Tabellen laden, die eine ST_Geometry-Spalte enthalten. Hierzu müssen die folgenden Kriterien erfüllt werden:

  • Die Tabelle darf nur eine einzige ST_Geometry-Spalte enthalten.
  • Die Tabelle darf keine weiteren benutzerdefinierten Spalten aufweisen.
  • Wenn in der Tabelle mehrere Geometrietypen (Punkte, Linien oder Polygone) gespeichert werden, müssen Sie angeben, welche Geometrietypen Sie anzeigen möchten. In ArcGIS kann jeweils nur ein Typ angezeigt werden.
  • Alle Datensätze in der Tabelle müssen denselben Raumbezug aufweisen.

Wenn Sie die Tabelle in einer Geodatabase mit SQL erstellt haben, können Sie sie bei der Geodatabase registrieren, sofern Sie die Geodatabase-Funktionalität (z. B. Replikation, Netzwerke, Beziehungsklassen und Topologie) verwenden oder die Tabelle in ArcGIS bearbeiten möchten. Um sie bei der Geodatabase zu registrieren, müssen die folgenden Kriterien erfüllt sein:

  • 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).
  • Alle Datensätze in der Tabelle müssen denselben Raumbezug aufweisen.
  • Außerdem muss eine eindeutige Spalte vom Typ "Integer" ohne NULL-Werte (NOT NULL) vorhanden sein, die als Objekt-ID verwendet werden kann.

Registrieren der ST_Geometry-Spalte

Wenn Sie zum Erstellen einer Tabelle mit einer ST_Geometry-Spalte SQL verwenden, können Sie die Spalte zur Verwendung eines bestimmten Raumbezugs und einer Dimensionalität registrieren. Auf diese Weise können Sie Datensätze, die Sie über SQL einfügen, nicht unbeabsichtigt einfügen, wenn die Datensätze einen anderen Raumbezug verwenden. Verwenden Sie hierzu die Funktion sde.st_register_spatial_column. Die Syntax zum Verwenden dieser Funktion lautet wie folgt:

SELECT st_register_spatial_column('<database_name>', '<schema_name>', 
'<table_name>', '<spatial_column_name>', <srid>, <coordinate_dimension>)

Die von Ihnen zu spezifizierende SRID muss in der Tabelle "public.sde_spatial_references" enthalten sein. Durch die Koordinatendimension wird angegeben, ob die Daten nur über XY-Koordinaten (2), XYZ-Koordinaten (3), XYZM-Koordinaten (4) oder XYM-Koordinaten (5) verfügen. Wenn Sie keine Koordinatendimension angeben, werden die Daten standardmäßig so konfiguriert, als ob sie nur XY-Dimensionen enthielten.

Im folgenden Beispiel ist die Shape-Spalte der Blocktabelle im Schema "sasha" der Datenbank "mycitydb" für die Verwendung der SRID 4236 und zum Speichern nur dreidimensionaler Koordinaten registriert:

SELECT st_register_spatial_column(
'mycitydb', 'sasha', 'blocks', 'shape', 4236, 3);

Dadurch wird ein Datensatz für die räumliche Spalte zur Tabelle "public.sde_geometry_columns" in der Geodatabase oder Datenbank hinzugefügt.

Wenn die räumliche Spalte leer ist und Sie diese mit einer bestimmten SRID und Dimensionalität registrieren, können Sie die Registrierung aufheben, um die SRID oder Dimensionalität zu ändern, und die Spalte danach mit anderen Werten erneut registrieren. Sie können die Registrierung einer räumlichen Spalte aufheben, indem Sie die Funktion st_unregister_spatial_column() ausführen. Diese Funktion entfernt die räumliche Spalte aus der Systemtabelle "public.sde_geometry_columns", so dass die räumliche Spalte nicht mehr mit einem Raumbezugssystem verknüpft ist. Die Syntax zum Verwenden dieser Funktion lautet wie folgt:

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. Die Syntax zum Verwenden dieser Funktion lautet wie folgt:

SELECT st_isregistered_spatial_column(
'<database_name>', '<schema_name>',
 '<table_name>', '<column_name>', <srid>)

Wenn die räumliche Spalte mit der angegebenen SRID registriert ist, wird 1 zurückgegeben, andernfalls wird 0 zurückgegeben.

Mit der Funktion st_get_coord_dimension können Sie ermitteln, mit welcher Dimensionalität die Tabelle registriert wurde. Die Syntax zum Verwenden der Funktion st_get_coord_dimension lautet wie folgt:

SELECT st_get_coord_dimension(
'<schema_name>', '<table_name>', '<column_name>', <srid>)

In diesem Beispiel gibt die Funktion st_get_coord_dimension XYZ zurück, da die Blocktabelle als dreidimensional registriert ist:

SELECT st_get_coord_dimension(
'sasha', 'blocks', 'shape', 4236);

st_get_coord_dimension
---------------------------
xyz