无法使用 ST_GeomFromText 在表之间插入

Unable to INSERT between tables using ST_GeomFromText

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

-- 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 字符串有什么问题。但是如果我插入行 'manually',我可以填充 table bh,例如:

INSERT INTO bh (name, bh_geom)
VALUES ('C5' ST_GeomFromText('POINT(542945.0 180846.0 3.947)', 27700));

我做错了什么?

您收到该错误是因为 CONCAT 函数的输出是文本,而您的 bh_geom 列是几何图形,因此您试图将文本插入到几何图形中。这将起作用:

INSERT INTO bh(name, bh_geom) SELECT 
    bh_name, 
    ST_GeomFromText('POINT(' 
        || easting|| ' ' 
        || Northing 
        || ' ' 
        || Ground_mOD 
        || ')', 27700)
FROM bh_tmp;

首先,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)

应该会更快。

  • Npgsql parameterized query output incompatible with PostGIS