使用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 2011年

一点都不。:)但是我将在一些轮廓线串上使用ST_DumpPoints来填充此表。
BenjaminGolder

Answers:


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

抱歉@Senthil,我不太理解你的句子。当您说:“如果您使用现有的geometry_columns,请正确验证并创建索引”是什么意思?示例中缺少该命令吗?
BenjaminGolder

@BenjaminGolder看看AddGeometryColumn使用此链接做了什么:elsasoft.org/samples/postgre_postgis / ...在您的情况下,只要在geometry_columns表中已经存在wkb_geometry并手动创建索引。因此,看起来不错。但是,最简单的选择是将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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.