Creazione di tabelle spaziali con PostGIS


20

Nella documentazione di PostGIS si dice che ci sono due passaggi per creare una tabella spaziale con SQL:

  1. Crea una normale tabella non spaziale.
  2. Aggiungi una colonna spaziale alla tabella usando la funzione "AddGeometryColumn" di OpenGIS.

Se seguissi gli esempi, creerei una tabella chiamata in terrain_pointsquesto modo:

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

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

In alternativa, se guardo le tabelle esistenti in pgAdmin III , sembra che potrei creare la stessa tabella in questo modo:

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);

Questi due metodi producono lo stesso risultato? La versione basata su pgAdmin III è semplicemente più dettagliata e fa cose che AddGeometryColumnfarebbero di default?


Spero che non afferrerai ogni singolo pixel del raster e lo memorizzerai come punto :)
Ragi Yaser Burhum,

no, per niente. :) Ma userò ST_DumpPoints su alcune linee di contorno per riempire questa tabella.
BenjaminGolder,

Risposte:


9

No, non stanno producendo gli stessi risultati.

Con il secondo metodo dovresti comunque aggiungere un record nella tabella GEOMETRY_COLUMNS e dovresti farlo con un'istruzione INSERT o usando la funzione Populate_Geometry_Columns come suggerito nell'altra risposta.

AddGeometryColumn si occuperà di farlo per te (insieme alla creazione dell'indice e dei vincoli).


2
Per riferimento futuro, questo non è più vero: postgis.net/docs/AddGeometryColumn.html
Janosimas

7

I due metodi dovrebbero produrre gli stessi risultati. AddGeometryColumnnon solo creerà il campo della geometria, ma convaliderà e creerà anche gli indici necessari. Finché fai tutte queste cose manualmente, il risultato sarà lo stesso. Se hai una colonna geometrica esistente, puoi utilizzare la Populate_Geometry_Columnsfunzione per convalidarla e creare gli indici necessari.


Questo significa che i due metodi produrranno lo stesso risultato?
BenjaminGolder,

Farà lo stesso, se hai usato geometrie_colonne esistenti, convalida e crea gli indici correttamente. Puoi controllare elsasoft.org/samples/postgre_postgis/…
Senthil,

scusa @Senthil, non capisco bene la tua frase. Cosa intendi quando dici: "se hai usato geometria_colonne esistenti, convalida e creato gli indici correttamente"? È un comando mancante negli esempi?
BenjaminGolder,

@BenjaminGolder Guarda cosa fa AddGeometryColumn con questo link: elsasoft.org/samples/postgre_postgis/… Nel tuo caso, purché wkb_geometry sia già presente nella tabella geometry_columns e crei l'indice manualmente. Quindi, sembra a posto. ma l'opzione più semplice è andare con AddGeometryColumn per i nuovi campi.
Senthil,

Ho modificato la tua risposta per renderlo più chiaro. Grazie.
BenjaminGolder,

5

In PostGIS 2.0+ è possibile creare direttamente la colonna della geometria utilizzando un linguaggio comune di definizione dei dati.

Per esempio:

-- 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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.