Membuat tabel spasial dengan PostGIS

20

Dalam dokumentasi PostGIS dikatakan bahwa ada dua langkah untuk membuat tabel spasial dengan SQL:

  1. Buat tabel non-spasial normal.
  2. Tambahkan kolom spasial ke tabel menggunakan fungsi "AddGeometryColumn" OpenGIS.

Jika saya mengikuti contoh, saya akan membuat tabel bernama terrain_pointsseperti ini:

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

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

Atau, jika saya melihat tabel yang ada di pgAdmin III , sepertinya saya bisa membuat tabel yang sama seperti ini:

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

Apakah kedua metode ini menghasilkan hasil yang sama? Apakah versi berdasarkan pgAdmin III hanya lebih verbose, dan melakukan hal-hal yang AddGeometryColumnakan dilakukan secara default?

BenjaminGolder
sumber
Saya harap Anda tidak meraih setiap piksel dari raster dan menyimpannya sebagai poin :)
Ragi Yaser Burhum
tidak, tidak sama sekali. :) Tapi saya akan menggunakan ST_DumpPoints pada beberapa linestrings kontur untuk mengisi tabel ini.
BenjaminGolder

Jawaban:

9

Tidak, mereka tidak menghasilkan hasil yang sama.

Dengan metode kedua Anda masih perlu menambahkan catatan di tabel GEOMETRY_COLUMNS, dan Anda perlu melakukannya dengan pernyataan INSERT, atau menggunakan fungsi Populate_Geometry_Columns seperti yang disarankan dalam jawaban lain.

AddGeometryColumn akan menangani hal ini untuk Anda (bersama-sama dengan membuat indeks dan kendala).

capooti
sumber
2
Untuk referensi di masa mendatang, ini tidak lagi benar: postgis.net/docs/AddGeometryColumn.html
Janosimas
7

Kedua metode harus menghasilkan hasil yang sama. AddGeometryColumntidak hanya akan membuat bidang geometri, itu akan memvalidasi dan membuat indeks yang diperlukan juga. Selama Anda melakukan semua hal ini secara manual, hasilnya akan sama. Jika Anda memiliki kolom geometri yang ada, Anda bisa menggunakan Populate_Geometry_Columnsfungsi untuk memvalidasinya dan membuat indeks yang diperlukan.

Senthil
sumber
Apakah ini berarti kedua metode akan menghasilkan hasil yang sama?
BenjaminGolder
Ini akan melakukan hal yang sama, jika Anda menggunakan geometry_columns yang ada, validasikan dan buat indeks dengan benar. Anda dapat memeriksa elsasoft.org/samples/postgre_postgis/…
Senthil
maaf @Senthil, saya tidak mengerti kalimat Anda. Apa maksud Anda ketika Anda mengatakan: "jika Anda menggunakan geometry_columns yang ada, validasikan dan buat indeks dengan benar"? Apakah itu perintah yang hilang dari contoh?
BenjaminGolder
@BenjaminGolder Lihat apa yang dilakukan AddGeometryColumn dengan tautan ini: elsasoft.org/samples/postgre_postgis/... Dalam kasus Anda, selama wkb_geometry sudah ada di tabel geometry_column dan Anda membuat indeks secara manual. Jadi, terlihat baik-baik saja. tetapi, opsi termudah adalah pergi dengan AddGeometryColumn untuk bidang baru.
Senthil
Saya mengedit jawaban Anda untuk membuatnya lebih jelas. Terima kasih.
BenjaminGolder
5

Di PostGIS 2.0+ Anda dapat membuat kolom geometri secara langsung menggunakan bahasa definisi data umum.

Sebagai contoh:

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