在PostGIS文档中,它说使用SQL创建空间表有两个步骤:



创建普通的非空间表。
添加空间列使用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会执行的操作?

评论

希望您不要抓取栅格的每个像素并将其存储为点:)

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

#1 楼

不,它们不会产生相同的结果。

使用第二种方法,您仍然需要在GEOMETRY_COLUMNS表中添加一条记录,并且您需要使用INSERT语句或使用Populate_Geometry_Columns的功能如另一个答案中所建议。

AddGeometryColumn将为您执行此操作(以及创建索引和约束)。

评论


供以后参考,这不再是正确的:postgis.net/docs/AddGeometryColumn.html

–Janosimas
17年7月7日13:21

#2 楼

两种方法应产生相同的结果。 AddGeometryColumn不仅会创建几何字段,还将验证并创建必要的索引。只要您手动执行所有这些操作,结果将是相同的。
如果现有几何列,则可以使用Populate_Geometry_Columns函数进行验证并创建必要的索引。

评论


这是否意味着两种方法将产生相同的结果?

– BenjaminGolder
11年4月18日在23:01

如果您使用现有的geometry_columns,则将执行相同的操作,并正确验证和创建索引。您可以检查elsasoft.org/samples/postgre_postgis/…

– Senthil
2011年4月18日在23:10

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

– BenjaminGolder
2011年4月18日在23:42

@BenjaminGolder看看AddGeometryColumn使用此链接做了什么:elsasoft.org/samples/postgre_postgis / ...在您的情况下,只要在geometry_columns表中已经存在wkb_geometry并手动创建索引。因此,看起来不错。但是,最简单的选择是将AddGeometryColumn用于新字段。

– Senthil
2011-4-18 23:54



我修改了您的答案,使其更清晰。谢谢。

– BenjaminGolder
2011年4月19日在0:49

#3 楼

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