Crear tablas espaciales con PostGIS

20

En la documentación de PostGIS dice que hay dos pasos para crear una tabla espacial con SQL:

  1. Crea una tabla normal no espacial.
  2. Agregue una columna espacial a la tabla usando la función OpenGIS "AddGeometryColumn".

Si siguiera los ejemplos, crearía una tabla llamada terrain_pointsasí:

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

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

Alternativamente, si miro las tablas existentes en pgAdmin III , parece que podría crear la misma tabla de esta manera:

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

¿Estos dos métodos producen el mismo resultado? ¿La versión basada en pgAdmin III es simplemente más detallada y hace cosas que AddGeometryColumnharían de manera predeterminada?

BenjaminGolder
fuente
Espero que no estés agarrando cada píxel de la trama y almacenándolo como un punto :)
Ragi Yaser Burhum
No, en absoluto. :) Pero voy a usar ST_DumpPoints en algunas cadenas de líneas de contorno para llenar esta tabla.
BenjaminGolder

Respuestas:

9

No, no están produciendo los mismos resultados.

Con el segundo método aún necesitaría agregar un registro en la tabla GEOMETRY_COLUMNS, y necesitaría hacerlo con una instrucción INSERT, o usando la función Populate_Geometry_Columns como se sugiere en la otra respuesta.

AddGeometryColumn se encargará de hacer esto por usted (junto con la creación del índice y las restricciones).

capooti
fuente
2
Para referencia futura, esto ya no es cierto: postgis.net/docs/AddGeometryColumn.html
Janosimas
7

Los dos métodos deberían producir los mismos resultados. AddGeometryColumnno solo creará el campo de geometría, sino que también validará y creará los índices necesarios. Mientras haga todas estas cosas manualmente, el resultado será el mismo. Si tiene una columna de geometría existente, puede usar la Populate_Geometry_Columnsfunción para validarla y crear los índices necesarios.

Senthil
fuente
¿Significa esto que los dos métodos producirán el mismo resultado?
BenjaminGolder
Hará lo mismo, si usó geometry_columns existentes, validar y crear índices correctamente. Puede consultar elsasoft.org/samples/postgre_postgis/…
Senthil
lo siento @Senthil, no entiendo bien tu oración. ¿Qué quieres decir cuando dices: "si usaste geometry_columns, valida y crea índices correctamente"? ¿Es ese un comando que falta en los ejemplos?
BenjaminGolder
@BenjaminGolder Eche un vistazo a lo que AddGeometryColumn está haciendo con este enlace: elsasoft.org/samples/postgre_postgis/… En su caso, siempre que wkb_geometry ya esté en la tabla geometry_columns y cree el índice manualmente. Entonces, se ve bien. pero, la opción más fácil es ir con AddGeometryColumn para nuevos campos.
Senthil
Edité tu respuesta para hacerlo más claro. Gracias.
BenjaminGolder
5

En PostGIS 2.0+ puede crear la columna de geometría directamente usando un lenguaje de definición de datos común.

Por ejemplo:

-- 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
fuente