无法使用ST_GeomFromText在表之间插入

时间:2015-03-17 13:09:53

标签: postgresql postgis postgresql-9.1 postgresql-9.2

我正在尝试将点几何值和其他数据从一个表插入到另一个表中。

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

我做错了什么?

2 个答案:

答案 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;