Création de tables spatiales avec PostGIS

20

Dans la documentation PostGIS, il est indiqué qu'il existe deux étapes pour créer une table spatiale avec SQL:

  1. Créez une table non spatiale normale.
  2. Ajoutez une colonne spatiale à la table à l'aide de la fonction OpenGIS "AddGeometryColumn".

Si je suivais les exemples, je créerais un tableau appelé terrain_pointscomme ceci:

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

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

Alternativement, si je regarde les tables existantes dans pgAdmin III , il semble que je pourrais créer la même table comme ceci:

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

Ces deux méthodes produisent-elles le même résultat? La version basée sur pgAdmin III est-elle simplement plus verbeuse et fait-elle des choses qui AddGeometryColumnferaient par défaut?

BenjaminGolder
la source
J'espère que vous n'attrapez pas chaque pixel du raster et que vous ne le
stockez
Non pas du tout. :) Mais je vais utiliser ST_DumpPoints sur certaines lignes de contour pour remplir ce tableau.
BenjaminGolder

Réponses:

9

Non, ils ne produisent pas les mêmes résultats.

Avec la deuxième méthode, vous devrez toujours ajouter un enregistrement dans la table GEOMETRY_COLUMNS, et vous devrez le faire avec une instruction INSERT, ou en utilisant la fonction Populate_Geometry_Columns comme suggéré dans l'autre réponse.

AddGeometryColumn se chargera de le faire pour vous (avec la création de l'index et des contraintes).

capooti
la source
2
Pour référence future, ce n'est plus vrai: postgis.net/docs/AddGeometryColumn.html
Janosimas
7

Les deux méthodes devraient produire les mêmes résultats. AddGeometryColumncréera non seulement le champ de géométrie, mais aussi validera et créera les index nécessaires. Tant que vous effectuez toutes ces opérations manuellement, le résultat sera le même. Si vous avez une colonne de géométrie existante, vous pouvez utiliser la Populate_Geometry_Columnsfonction pour la valider et créer les index nécessaires.

Senthil
la source
Est-ce à dire que les deux méthodes produiront le même résultat?
BenjaminGolder
Il en sera de même si vous avez utilisé des colonnes geometry_column existantes, validez et créez correctement les index. Vous pouvez consulter elsasoft.org/samples/postgre_postgis/…
Senthil
désolé @Senthil, je ne comprends pas très bien ta phrase. Que voulez-vous dire lorsque vous dites: "si vous avez utilisé les colonnes geometry_columns existantes, validez et créez correctement les index"? Est-ce une commande qui manque dans les exemples?
BenjaminGolder
@BenjaminGolder Regardez ce que AddGeometryColumn fait avec ce lien: elsasoft.org/samples/postgre_postgis/… Dans votre cas, tant que wkb_geometry est déjà là dans la table geometry_columns et que vous créez manuellement un index. Donc, ça va bien. mais l'option la plus simple consiste à utiliser AddGeometryColumn pour les nouveaux champs.
Senthil
J'ai modifié votre réponse pour la rendre plus claire. Je vous remercie.
BenjaminGolder
5

Dans PostGIS 2.0+, vous pouvez créer la colonne de géométrie directement à l'aide du langage de définition de données commun.

Par exemple:

-- 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
la source