PostGISで空間テーブルを作成する


20

PostGISドキュメントでは、SQLで空間テーブルを作成するには2つのステップがあると書かれています。

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

これら2つの方法は同じ結果をもたらしますか?pgAdmin IIIに基づくバージョンは、より冗長で、AddGeometryColumnデフォルトで行うことを実行していますか?


ラスターのすべてのピクセルを
取得

いいえ、まったくありません。:)しかし、この表を埋めるために、いくつかの等高線ストリングでST_DumpPointsを使用します。
ベンジャミン

回答:


9

いいえ、彼らは同じ結果を生み出していません。

2番目の方法では、GEOMETRY_COLUMNSテーブルにレコードを追加する必要があり、INSERTステートメントを使用するか、他の回答で提案されているPopulate_Geometry_Columns関数を使用する必要があります。

AddGeometryColumnがこれを自動的に行います(インデックスと制約の作成と共に)。


2
将来の参照のために、これはもはや真実ではありません:postgis.net/docs/AddGeometryColumn.html
Janosimas

7

2つの方法で同じ結果が得られます。AddGeometryColumnジオメトリフィールドを作成するだけでなく、必要なインデックスも検証および作成します。これらすべてを手動で行う限り、結果は同じになります。既存のジオメトリ列がある場合は、Populate_Geometry_Columns関数を使用し て検証し、必要なインデックスを作成できます。


これは、2つの方法で同じ結果が得られるということですか?
ベンジャミン

既存のgeometry_columnsを使用し、インデックスを適切に検証および作成した場合、同じことが行われます。elsasoft.org/samples/postgre_postgis/…を
Senthil

@Senthilさん、ごめんなさい。あなたの文章はよくわかりません。「既存のgeometry_columnsを使用した場合、インデックスを適切に検証および作成した」と言うときはどういう意味ですか?それは例にないコマンドですか?
ベンジャミン

@BenjaminGolderこのリンクでAddGeometryColumnが何をしているのか見てみましょう:elsasoft.org/samples/postgre_postgis/…あなたの場合、wkb_geometryがgeometry_columnsテーブルに既にあり、インデックスを手動で作成している限り。だから、うまく見えます。ただし、最も簡単なオプションは、新しいフィールドにAddGeometryColumnを使用することです。
センチル

私はあなたの答えをより明確にするために編集しました。ありがとうございました。
ベンジャミン

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.