Erstellen von räumlichen Tabellen mit PostGIS

20

In der PostGIS-Dokumentation heißt es, dass es zwei Schritte zum Erstellen einer räumlichen Tabelle mit SQL gibt:

  1. Erstellen Sie eine normale nicht räumliche Tabelle.
  2. Fügen Sie der Tabelle mit der OpenGIS-Funktion "AddGeometryColumn" eine räumliche Spalte hinzu.

Wenn ich den Beispielen folgen würde, würde ich eine Tabelle mit folgendem Namen erstellen terrain_points:

CREATE TABLE terrain_points ( 
  ogc_fid serial NOT NULL, 
  elevation double precision,
);

SELECT AddGeometryColumn('terrain_points', 'wkb_geometry', 3725, 'POINT', 3 );

Wenn ich mir alternativ vorhandene Tabellen in pgAdmin III ansehe , könnte ich die gleiche Tabelle wie folgt erstellen:

CREATE TABLE terrain_points
(
  ogc_fid serial NOT NULL,
  wkb_geometry geometry,
  elevation double precision,
  CONSTRAINT terrain_points_pk PRIMARY KEY (ogc_fid),
  CONSTRAINT enforce_dims_wkb_geometry CHECK (st_ndims(wkb_geometry) = 3),
  CONSTRAINT enforce_geotype_wkb_geometry CHECK (geometrytype(wkb_geometry) = 'POINT'::text OR wkb_geometry IS NULL),
  CONSTRAINT enforce_srid_wkb_geometry CHECK (st_srid(wkb_geometry) = 3725)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE terrain_points OWNER TO postgres;

-- Index: terrain_points_geom_idx

-- DROP INDEX terrain_points_geom_idx;

CREATE INDEX terrain_points_geom_idx
  ON terrain_points
  USING gist
  (wkb_geometry);

Erzielen diese beiden Methoden dasselbe Ergebnis? Ist die auf pgAdmin III basierende Version einfach ausführlicher und erledigt sie Dinge, AddGeometryColumndie standardmäßig funktionieren würden?

BenjaminGolder
quelle
Ich hoffe, Sie greifen nicht jedes einzelne Pixel des Rasters und speichern es als Punkt :)
Ragi Yaser Burhum
Nein überhaupt nicht. :) Aber ich werde ST_DumpPoints für einige Konturlinien verwenden, um diese Tabelle zu füllen.
BenjaminGolder

Antworten:

9

Nein, sie liefern nicht die gleichen Ergebnisse.

Bei der zweiten Methode müssten Sie weiterhin einen Datensatz in die Tabelle GEOMETRY_COLUMNS einfügen und dies mit einer INSERT-Anweisung oder mit der Funktion Populate_Geometry_Columns, wie in der anderen Antwort vorgeschlagen.

AddGeometryColumn übernimmt dies für Sie (zusammen mit der Erstellung des Index und der Einschränkungen).

capooti
quelle
2
Zum späteren Nachschlagen gilt dies nicht mehr: postgis.net/docs/AddGeometryColumn.html
Janosimas
7

Die beiden Methoden sollten die gleichen Ergebnisse liefern. AddGeometryColumnerstellt nicht nur das Geometriefeld, sondern validiert und erstellt auch die erforderlichen Indizes. Solange Sie all diese Dinge manuell erledigen, ist das Ergebnis dasselbe. Wenn Sie über eine vorhandene Geometriespalte verfügen, können Sie diese mit der Populate_Geometry_ColumnsFunktion validieren und die erforderlichen Indizes erstellen.

Senthil
quelle
Bedeutet dies, dass beide Methoden das gleiche Ergebnis liefern?
BenjaminGolder
Dies gilt auch, wenn Sie vorhandene geometry_columns verwendet, Indizes überprüft und ordnungsgemäß erstellt haben. Sie können elsasoft.org/samples/postgre_postgis/…
Senthil
sorry @Senthil, ich verstehe deinen Satz nicht ganz. Was meinen Sie, wenn Sie sagen: "Wenn Sie vorhandene geometry_columns verwendet haben, überprüfen und erstellen Sie die Indizes ordnungsgemäß"? Ist das ein Befehl, der in den Beispielen fehlt?
BenjaminGolder
@BenjaminGolder Schauen Sie, was AddGeometryColumn mit diesem Link macht: elsasoft.org/samples/postgre_postgis/… In Ihrem Fall, solange wkb_geometry bereits in geometry_columns vorhanden ist und Sie den Index manuell erstellen. Sieht also gut aus. Die einfachste Option ist jedoch AddGeometryColumn für neue Felder.
Senthil
Ich habe Ihre Antwort bearbeitet, um sie klarer zu machen. Vielen Dank.
BenjaminGolder
5

In PostGIS 2.0+ können Sie die Geometriespalte direkt mithilfe einer gemeinsamen Datendefinitionssprache erstellen.

Beispielsweise:

-- points in geographic wgs84 coordinates (epsg:4326)
create table mypoints (id serial, name varchar, geom geometry(Point, 4326));

-- lines in spherical mercator (epsg:3857)
create table mylines (id serial, name varchar, geom geometry(LineString, 3857));

-- polygons in Dutch national coordinate system (epsg:28992)
create table mypolygons (id serial, name varchar, geom geometry(Polygon, 28992));

-- multipolygons in British National Grid (epsg:27700)
create table 
  mymultipolygons(id serial, name varchar, geom geometry(Multipolygon, 27700));

-- generic geometry (no data type constraints)
create table mygeometries(id serial, name varchar, geom geometry);
anneb
quelle