การสร้างตารางเชิงพื้นที่ด้วย 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 ในการตกแต่งรูปร่างเพื่อเติมตารางนี้
BenjaminGolder

คำตอบ:


9

ไม่พวกเขาไม่ได้ให้ผลลัพธ์ที่เหมือนกัน

ด้วยวิธีที่สองคุณจะต้องเพิ่มระเบียนในตาราง GEOMETRY_COLUMNS และคุณจะต้องทำมันด้วยคำสั่ง INSERT หรือใช้ฟังก์ชัน Populate_Geometry_Columns ตามที่แนะนำในคำตอบอื่น ๆ

AddGeometryColumn จะดูแลการทำสิ่งนี้ให้คุณ (รวมถึงการสร้างดัชนีและข้อ จำกัด )


2
สำหรับการอ้างอิงในอนาคตนี่จะไม่เป็นจริงอีกต่อไป: postgis.net/docs/AddGeometryColumn.html
Janosimas

7

ทั้งสองวิธีควรให้ผลลัพธ์ที่เหมือนกัน AddGeometryColumnจะไม่เพียง แต่สร้างฟิลด์รูปทรงเรขาคณิต แต่จะตรวจสอบและสร้างดัชนีที่จำเป็นด้วย ตราบใดที่คุณทำสิ่งเหล่านี้ด้วยตนเองผลลัพธ์ก็จะเหมือนเดิม หากคุณมีคอลัมน์รูปทรงเรขาคณิตที่มีอยู่คุณสามารถใช้ Populate_Geometry_Columnsฟังก์ชันเพื่อตรวจสอบความถูกต้องและสร้างดัชนีที่จำเป็น


นี่หมายความว่าทั้งสองวิธีจะให้ผลลัพธ์เดียวกันหรือไม่
BenjaminGolder

มันจะทำเช่นเดียวกันถ้าคุณใช้ geometry_columns ที่มีอยู่ให้ตรวจสอบและสร้างดัชนีอย่างถูกต้อง คุณสามารถตรวจสอบelsasoft.org/samples/postgre_postgis/ …
Senthil

ขอโทษด้วยที่ฉันไม่เข้าใจประโยคของคุณ คุณหมายถึงอะไรเมื่อคุณพูดว่า: "ถ้าคุณใช้ geometry_columns ที่มีอยู่ให้ตรวจสอบและสร้างดัชนีอย่างถูกต้อง"? นั่นเป็นคำสั่งที่หายไปจากตัวอย่างหรือไม่?
BenjaminGolder

@BenjaminGolder ดูว่า AddGeometryColumn ทำอะไรกับลิงค์นี้: elsasoft.org/samples/postgre_postgis/ ......ในกรณีของคุณตราบใดที่ wkb_geometry มีอยู่แล้วในตาราง geometry_columns และคุณสร้างดัชนีด้วยตนเอง ดังนั้นดูดี แต่ตัวเลือกที่ง่ายที่สุดจะไปกับ AddGeometryColumn สำหรับเขตข้อมูลใหม่
Senthil

ฉันแก้ไขคำตอบของคุณเพื่อให้ชัดเจนยิ่งขึ้น ขอขอบคุณ.
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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.