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

In Geodatabases wird der räumliche Typ "ST_Geometry" zwar standardmäßig verwendet, doch muss vor dem Erstellen einer Geodatabase die Bibliothek "ST_Geometry" in die PostgreSQL-Installation kopiert werden. Weitere Anweisungen finden Sie unter Erstellen einer Geodatabase in PostgreSQL unter Windows oder unter Erstellen einer Geodatabase in PostgreSQL unter Linux. Wenn Sie eine PostgreSQL-Database 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.

Um Ihnen zu veranschaulichen, wie der Typ "ST_Geometry" in PostgreSQL verwendet wird, wird in diesem Abschnitt Folgendes beschrieben:

Wie ST_Geometry räumliche Daten speichert

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

NameTypeBeschreibung

Größe

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

Fläche

LFLOAT

Die Fläche der Geometrie

len

LFLOAT

Die Länge des Umfangs der Geometrie

Form

BYTEA

Komprimierter 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

Beim Erstellen von Feature-Classes durch ArcGIS Desktop wählen Sie den zu verwendenden Speichertyp 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

Sie geben den räumlichen Datentyp an, wenn eine Feature-Class in ArcGIS erstellt wird.

In einer Geodatabase

Speicherinformationen für Feature-Classes werden durch Konfigurationsschlüsselwort-Einstellungen in der Tabelle "sde_dbtune" gesteuert. Sie geben ein Konfigurationsschlüsselwort an, wenn Sie eine Feature-Class in ArcGIS erstellen. Beim Erstellen der Geodatabase ist der Parameter "GEOMETRY_STORAGE" des Konfigurationsschlüsselworts "DEFAULTS" auf "ST_GEOMETRY" festgelegt. Wenn Sie alle oder die meisten räumlichen Daten mit dem Typ "ST_Geometry" speichern möchten, ändern Sie den Parameterwert "GEOMETRY_COLUMNS" des DEFAULT-Schlüsselworts nicht. Wenn Sie anschließend eine Feature-Class aus ArcGIS erstellen, geben Sie das DEFAULTS-Schlüsselwort an.

Wenn Sie den Parameter "DEFAULTS GEOMETRY_STORAGE" so ändern, dass der PostGIS-Datentyp "geometry" oder "geography" verwendet wird, Sie aber einige Feature-Classes mit dem Datentyp "ST_Geometry" erstellen möchten, können Sie ein neues Konfigurationsschlüsselwort für den ST_Geometry-Speichertyp erstellen. Verwenden Sie das Geoverarbeitungswerkzeug Konfigurationsschlüsselwörter für Geodatabase exportieren, um den Inhalt der Tabelle "sde_dbtune" in eine Textdatei zu exportieren, fügen Sie ein Schlüsselwort hinzu, dessen "GEOMETRY_STORAGE" auf "ST_GEOMETRY" eingestellt ist, und importieren Sie anschließend die Änderungen mit dem Geoverarbeitungswerkzeug Konfigurationsschlüsselwörter für Geodatabase importieren. Sie können beispielsweise die Tabelle "sde_dbtune" exportieren und ein Konfigurationsschlüsselwort wie folgt hinzufügen:

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

Nachdem das Schlüsselwort hinzugefügt wurde, können Sie es beim Erstellen einer Feature-Class in ArcGIS angeben, damit die neue Feature-Class den Speichertyp "ST_Geometry" verwendet.

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 ObjectID 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 jedem 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