【问题标题】:How to insert to Postgresql geometry column如何插入到 Postgresql 几何列
【发布时间】:2016-03-13 15:06:30
【问题描述】:

我有一个看起来像这样的 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);

那么,我怎样才能插入我的数据(数据库的两个点)?例如,我不确定是否应该将点的坐标转换为经纬度。此外,我不确定是否应该插入 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))

【问题讨论】:

  • 您应该使用 SRID 3857。

标签: postgresql postgis


【解决方案1】:

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

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

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

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(&lt;your WKT&gt;, 3857)),但这不太直观且更容易出错。

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

您从使用ST_Point() 得到的错误是因为您的几何有一个 NULL SRID。您应该使用 ST_SetSRID() 明确设置它(我对 PostGIS 的一大烦恼......)。

【讨论】:

  • 谢谢您,先生!我会在一秒钟内检查它!
  • 请您提供一些真实数据而不是&lt;your WKT&gt;。我不确定它在我的数据上下文中应该是什么样子
  • 您只需将&lt;your WKT&gt; 替换为您拥有的字符串。 WKT 只是一种字符串格式,易于使用但效率不高,因此被转换。
  • 哦,我设法插入了。正如你所建议的,我刚刚用 3857 替换了 4326。但有趣的是,数据被添加到父表中。可以吗?我认为父表只是一个抽象表。
  • 当你插入父表时,数据只在那里可见。反之,插入子表时,可以看到父表的继承列中的数据。但是,您重复子表中的所有列,从而有效地阻止父表的列。您的点表应具有geom 列,然后从父表继承其他列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多