Criando tabelas espaciais com o PostGIS

20

Na documentação do PostGIS , diz que existem duas etapas para criar uma tabela espacial com SQL:

  1. Crie uma tabela não espacial normal.
  2. Adicione uma coluna espacial à tabela usando a função "AddGeometryColumn" do OpenGIS.

Se eu seguisse os exemplos, criaria uma tabela chamada terrain_pointsassim:

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

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

Como alternativa, se eu olhar para as tabelas existentes no pgAdmin III , parece que eu poderia criar a mesma tabela assim:

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

Esses dois métodos produzem o mesmo resultado? A versão baseada no pgAdmin III é simplesmente mais detalhada e faz o que AddGeometryColumnseria padrão?

BenjaminGolder
fonte
Espero que não estão agarrando cada pixel do raster e armazená-lo como um ponto :)
Ragi Yaser Burhum
não, de jeito nenhum. :) Mas eu vou usar ST_DumpPoints em algumas linhas de contorno para preencher esta tabela.
BenjaminGolder

Respostas:

9

Não, eles não estão produzindo os mesmos resultados.

Com o segundo método, você ainda precisará adicionar um registro na tabela GEOMETRY_COLUMNS, e faria isso com uma instrução INSERT ou usando a função Populate_Geometry_Columns, conforme sugerido na outra resposta.

AddGeometryColumn se encarregará de fazer isso por você (junto com a criação do índice e das restrições).

capooti
fonte
2
Para referência futura, isso não é mais verdade: postgis.net/docs/AddGeometryColumn.html
Janosimas
7

Os dois métodos devem produzir os mesmos resultados. AddGeometryColumnnão apenas criará o campo de geometria, mas também validará e criará os índices necessários. Contanto que você faça todas essas coisas manualmente, o resultado será o mesmo. Se você possui uma coluna geométrica existente, poderá usar a Populate_Geometry_Columnsfunção para validá-la e criar os índices necessários.

Senthil
fonte
Isso significa que os dois métodos produzirão o mesmo resultado?
21711 BenjaminGolder
Ele fará o mesmo, se você usou geometry_columns existentes, valide e crie índices adequadamente. Você pode verificar elsasoft.org/samples/postgre_postgis/...
Senthil
desculpe @ Senthil, não entendo bem sua frase. O que você quer dizer quando diz: "se você usou geometry_columns existentes, valida e cria índices adequadamente"? Esse é um comando que está faltando nos exemplos?
BenjaminGolder
@BenjaminGolder Veja o que AddGeometryColumn está fazendo com este link: elsasoft.org/samples/postgre_postgis/… No seu caso, desde que wkb_geometry já esteja na tabela geometry_columns e você crie o índice manualmente. Então, parece bem. mas, a opção mais fácil é usar AddGeometryColumn para novos campos.
Senthil
Editei sua resposta para torná-la mais clara. Obrigado.
21711 BenjaminGolder
5

No PostGIS 2.0+, você pode criar a coluna de geometria diretamente usando a linguagem comum de definição de dados.

Por exemplo:

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