如何插入Postgresql几何列

时间:2016-03-13 15:06:30

标签: postgresql postgis

我有一个类似的WKT数据:

GEOMETRYCOLLECTION(
POINT(-1763555.1165955865 310640.0829509564),
POINT(-1421117.229877997 -300856.1433304538)
)

默认预测为'EPSG:3857'。在postgresql中,我创建了一个父表,其中包含通用几何列和几个具有特定几何类型列的子表。架构如下:

# parent table with generic geometry column "geom"
CREATE TABLE "public"."layer_261_" (
"id" int4 DEFAULT nextval('layer_261__id_seq'::regclass) NOT NULL,
"feature_id" int4 DEFAULT 0 NOT NULL,
"feature_name" varchar(200),
"feature_type" varchar(50),
"geom" "public"."geometry",
"object_id" int4 DEFAULT 0 NOT NULL,
"row_id" int4 DEFAULT 0 NOT NULL
) 
WITH (OIDS=FALSE);
ALTER TABLE "public"."layer_261_" ADD CHECK (st_srid(geom) = 3857);
ALTER TABLE "public"."layer_261_" ADD CHECK (st_ndims(geom) = 2);
ALTER TABLE "public"."layer_261_" ADD PRIMARY KEY ("id");

# child table which is supposed to contain only POINT data type
CREATE TABLE "public"."layer_261_points" (
"id" int4 DEFAULT nextval('layer_261__id_seq'::regclass) NOT NULL,
"feature_id" int4 DEFAULT 0 NOT NULL,
"feature_name" varchar(200),
"feature_type" varchar(50),
"geom" "public"."geometry",
"object_id" int4 DEFAULT 0 NOT NULL,
"row_id" int4 DEFAULT 0 NOT NULL
)
INHERITS ("public"."layer_261_") 
WITH (OIDS=FALSE);
ALTER TABLE "public"."layer_261_points" ADD CHECK (st_ndims(geom) = 2);
ALTER TABLE "public"."layer_261_points" ADD CHECK (geometrytype(geom) = 'POINT'::text);
ALTER TABLE "public"."layer_261_points" ADD CHECK (st_srid(geom) = 3857);

那么,如何插入我的数据(两点到数据库)?例如,我不确定是否应该将点的坐标转换为lat-lon。此外,我不确定是否应该逐个插入GEOMETRYCOLLECTION或所有点。

修改

我刚刚尝试使用真实数据点执行查询:

INSERT INTO layer_261_ (geom) VALUES (ST_Point(105177.3509204, -85609.471679397))

但结果我得到了这条错误消息:

  

关系“layer_261_”的新行违反了检查约束   “enforce_srid_geom”

有人知道如何解决它吗?

修改

此查询会导致出现同样的错误消息:

INSERT INTO layer_261_ (geom) VALUES (ST_SetSRID(ST_Point(105177.3509204, -85609.471679397), 
4326))

1 个答案:

答案 0 :(得分:2)

您只能将WKT插入父表,因为点表不会接受GEOMETRYCOLLECTION

INSERT INTO "public"."layer_261_" ("geom", <other columns>)
VALUES (ST_GeomFromText(<your WKT>, 3857), <other values>);

在父表中获得数据后,您可以使用GEOMETRYCOLLECTION轻松地从POINT转换为单独的ST_Dump(),并将其插入点表中:

INSERT INTO "public"."layer_261_points" ("geom", <other columns>)
  SELECT p.geom, <other columns>
  FROM "public"."layer_261_" m, ST_Dump("geom") p
  WHERE ...;

您当然也可以忘记第一步,并在第二步中执行ST_Dump(ST_GeomFromText(<your WKT>, 3857)),但这不太直观,更容易出错。

请注意ST_Dump()table function,因此应该在FROM子句中使用它。然后,它可以使用函数前指定的表中的列。

使用ST_Point()获得的错误是因为几何体具有NULL SRID。你应该用ST_SetSRID()明确地设置它(我对PostGIS的一个很大的烦恼......)。