我正在尝试将点几何值和其他数据从一个表插入到另一个表中。
-- create tables
create table bh_tmp (bh_id integer, bh_name varchar
, easting decimal, northing decimal, ground_mod decimal);
create table bh (name varchar);
SELECT AddGeometryColumn('bh', 'bh_geom', 27700, 'POINT',3);
-- popualte bh_tmp
insert into bh_tmp values
(1,'C5',542945.0,180846.0,3.947),
(3,'B24',542850.0,180850.0,4.020),
(4,'B26',543020.0,180850.0,4.020);
-- populate bh from bh_tmp
insert into bh(name, bh_geom) SELECT
bh_name,
CONCAT($$ST_GeomFromText('POINT($$, Easting, ' ', Northing, ' '
, Ground_mOD, $$)', 27700)$$);
FROM bh_tmp;
给出了这个错误:
ERROR: parse error - invalid geometry SQL state: XX000 Hint: "ST" <-- parse error at position 2 within geometry
我看不出我指定的ST_GeomFromText
字符串有什么问题。但是如果我“手动”插入行,我可以填充表bh
,例如:
INSERT INTO bh (name, bh_geom)
VALUES ('C5' ST_GeomFromText('POINT(542945.0 180846.0 3.947)', 27700));
我做错了什么?
答案 0 :(得分:4)
首先,在CONCAT(...)
;
之后有一个错误的分号
并且您无法将函数名称本身连接到字符串中:
INSERT INTO bh(name, bh_geom)
SELECT bh_name
, ST_GeomFromText('POINT(' || concat_ws(' ', easting, northing, ground_mod) || ')'
, 27700)
FROM bh_tmp;
或者,由于您已有值(不是text
),因此可以使用ST_MakePoint()
和ST_SetSRID()
:
ST_SetSRID(ST_MakePoint(easting, northing, ground_mod), 27700)
应该更快。
答案 1 :(得分:1)
您收到该错误是因为CONCAT函数的输出是文本,而您的bh_geom列是几何体,因此您尝试将文本插入几何体。这将有效:
INSERT INTO bh(name, bh_geom) SELECT
bh_name,
ST_GeomFromText('POINT('
|| easting|| ' '
|| Northing
|| ' '
|| Ground_mOD
|| ')', 27700)
FROM bh_tmp;