Создание пространственных таблиц с PostGIS

20

В документации PostGIS говорится, что есть два шага для создания пространственной таблицы с SQL:

  1. Создайте обычную непространственную таблицу.
  2. Добавьте пространственный столбец в таблицу, используя функцию OpenGIS «AddGeometryColumn».

Если бы я следовал за примерами, я бы создал таблицу под названием terrain_pointsтак:

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

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

В качестве альтернативы, если я посмотрю на существующие таблицы в pgAdmin III , мне кажется, что я мог бы создать такую ​​же таблицу, например:

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

Эти два метода дают одинаковый результат? Является ли версия, основанная на pgAdmin III, просто более многословной, и делает ли она то, что AddGeometryColumnбудет по умолчанию?

BenjaminGolder
источник
Я надеюсь, что вы не захватываете каждый пиксель растра и не сохраняете его как точку :)
Ragi Yaser Burhum
нет, совсем нет :) Но я собираюсь использовать ST_DumpPoints для некоторых контурных линий для заполнения этой таблицы.
BenjaminGolder

Ответы:

9

Нет, они не дают одинаковых результатов.

Со вторым методом вам все равно нужно добавить запись в таблицу GEOMETRY_COLUMNS, и вам нужно будет сделать это с помощью оператора INSERT или с помощью функции Populate_Geometry_Columns, как это предлагается в другом ответе.

AddGeometryColumn позаботится о том, чтобы сделать это за вас (вместе с созданием индекса и ограничений).

capooti
источник
2
Для дальнейшего использования это уже не так: postgis.net/docs/AddGeometryColumn.html
Janosimas
7

Два метода должны давать одинаковые результаты. AddGeometryColumnне только создаст поле геометрии, но также проверит и создаст необходимые индексы. Пока вы делаете все это вручную, результат будет одинаковым. Если у вас есть столбец геометрии, вы можете использовать Populate_Geometry_Columnsфункцию для его проверки и создания необходимых индексов.

Senthil
источник
Значит ли это, что два метода дадут одинаковый результат?
BenjaminGolder
Это будет делать то же самое, если вы использовали существующие geometry_columns, правильно проверяли и создавали индексы. Вы можете проверить elsasoft.org/samples/postgre_postgis/...
Senthil
извините @Senthil, я не совсем понимаю ваше предложение. Что вы имеете в виду, когда говорите: «если вы использовали существующие geometry_columns, правильно проверяли и создавали индексы»? Это команда, которая отсутствует в примерах?
BenjaminGolder
@BenjaminGolder Посмотрите, что делает AddGeometryColumn с этой ссылкой: elsasoft.org/samples/postgre_postgis/… В вашем случае, пока wkb_geometry уже существует в таблице geometry_columns, и вы создаете индекс вручную. Итак, выглядит хорошо. но самый простой вариант - перейти с AddGeometryColumn для новых полей.
Сентил
Я отредактировал ваш ответ, чтобы сделать его более понятным. Спасибо.
BenjaminGolder
5

В PostGIS 2.0+ вы можете создавать столбец геометрии напрямую, используя общий язык определения данных.

Например:

-- 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
источник