Створення просторових таблиць за допомогою 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робиться за замовчуванням?


Я сподіваюся, що ви не захоплюєте кожен піксель растру і зберігаєте його як крапку :)
Ragi Yaser Burhum,

ні, зовсім ні. :) Але я буду використовувати ST_DumpPoints на деяких контурних рядках для заповнення цієї таблиці.
БенджамінГолдер

Відповіді:


9

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

З другим методом вам все-таки потрібно буде додати запис у таблицю GEOMETRY_COLUMNS, і вам потрібно буде це зробити за допомогою оператора INSERT або використовуючи функцію Populate_Geometry_Columns, як запропоновано в іншій відповіді.

AddGeometryColumn подбає про це для вас (разом із створенням індексу та обмежень).


2
Для подальшої довідки це більше не відповідає дійсності: postgis.net/docs/AddGeometryColumn.html
Janosimas

7

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


Чи означає це, що два методи дадуть однаковий результат?
BenjaminGolder

Це зробить те саме, якщо ви правильно використали існуючі стовпці geometry_column, перевірити та створити індекси належним чином. Ви можете перевірити elsasoft.org/samples/postgre_postgis / ...
Senthil

Вибачте @Senthil, я не дуже розумію ваше речення. Що ви маєте на увазі, коли ви говорите: "якщо ви використовували існуючі геометричні стовпці, перевіряйте та створюйте індекси належним чином"? Це команда, якої немає у прикладах?
BenjaminGolder

@BenjaminGolder Подивіться, що робить AddGeometryColumn за цим посиланням: elsasoft.org/samples/postgre_postgis/… У вашому випадку до тих пір, поки wkb_geometry вже є в таблиці geometry_column і ви створюєте індекс вручну. Отже, виглядає чудово. але найпростіший варіант - перейти з 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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.