PostGIS ile uzamsal tablolar oluşturma


20

PostGIS belgelerinde SQL ile uzamsal bir tablo oluşturmanın iki adımı olduğunu söylüyor :

  1. Normal bir uzamsal olmayan tablo oluşturun.
  2. OpenGIS "AddGeometryColumn" işlevini kullanarak tabloya uzamsal bir sütun ekleyin.

Örnekleri izleseydim, şöyle bir tablo oluştururdum terrain_points:

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

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

Alternatif olarak, pgAdmin III'teki mevcut tablolara bakarsam , aynı tabloyu şu şekilde oluşturabilirim gibi görünüyor:

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

Bu iki yöntem aynı sonucu veriyor mu? PgAdmin III'e dayanan sürüm sadece daha ayrıntılı ve AddGeometryColumnvarsayılan olarak yapılacak şeyleri yapıyor mu?


Umarım raster her bir piksel kapmak ve bir nokta olarak saklamak değil :)
Ragi Yaser Burhum

Hayır, hiç de değil. :) Ama bu tabloyu doldurmak için bazı kontur linestrings ST_DumpPoints kullanacağım.
BenjaminGolder

Yanıtlar:


9

Hayır, aynı sonuçları vermiyorlar.

İkinci yöntemle, GEOMETRY_COLUMNS tablosuna yine de bir kayıt eklemeniz gerekir ve bunu bir INSERT ifadesiyle veya diğer yanıtta önerildiği gibi Populate_Geometry_Columns işlevini kullanarak yapmanız gerekir.

AddGeometryColumn bunu sizin için yapacaktır (dizin ve kısıtlamaları oluşturmakla birlikte).



7

İki yöntem de aynı sonuçları vermelidir. AddGeometryColumnsadece geometri alanını oluşturmakla kalmaz, aynı zamanda gerekli dizinleri de doğrular ve oluşturur. Tüm bunları elle yaptığınız sürece sonuç aynı olacaktır. Mevcut bir geometri sütununuz varsa, doğrulamak ve gerekli dizinleri oluşturmak için Populate_Geometry_Columnsişlevi kullanabilirsiniz .


Bu, iki yöntemin aynı sonucu üreteceği anlamına mı geliyor?
BenjaminGolder

Mevcut geometri_ sütunlarını kullandıysanız, dizinleri doğru bir şekilde doğrulayın ve oluşturun. Sen kontrol edebilir elsasoft.org/samples/postgre_postgis/...
Senthil

üzgünüm @Senthil, cümlenizi tam olarak anlamıyorum. "Mevcut geometri_ sütunlarını kullandıysanız, doğrulayın ve dizinleri doğru bir şekilde oluşturduysanız" derken ne demek istersiniz? Bu örneklerde eksik olan bir komut mu?
BenjaminGolder

@BenjaminGolder AddGeometryColumn'un bu bağlantıyla ne yaptığını görün: elsasoft.org/samples/postgre_postgis/… Sizin durumunuzda, zaten geometry_columns tablosunda wkb_geometry var ve manuel olarak dizin oluşturduğunuz sürece. Yani, iyi görünüyor. ancak yeni alanlar için AddGeometryColumn ile en kolay seçenek gitmek.
Senthil

Cevabınızı daha açık hale getirmek için düzenledim. Teşekkür ederim.
BenjaminGolder

5

PostGIS 2.0+ sürümünde, ortak veri tanımlama dilini kullanarak doğrudan geometri sütununu oluşturabilirsiniz.

Örneğin:

-- 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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.