MySQL中St_AsText(point(longitude,latitude))的PostgreSQL等效写法是什么
问题根因
报错触发原因是ST_AsText为PostGIS扩展提供的函数,仅支持PostGIS的geometry类型入参。你使用PostgreSQL原生point(longitude, latitude)构造的是数据库内置基础point类型,不属于PostGIS的geometry类型,无法匹配函数参数要求。
同时原SQL为MySQL语法,存在多处需要适配PostgreSQL/PostGIS生态的调整点。
前置检查
确保数据库已启用PostGIS扩展,未启用可执行以下语句开启:
CREATE EXTENSION IF NOT EXISTS postgis;
等效查询语句
SELECT ogc_fid, name, CONCAT( 'GEOMETRYCOLLECTION(', string_agg(ST_AsText(ST_SetSRID(ST_MakePoint(longitude, latitude), 4326)), ','), ',', ST_AsText(geometry), ')' ) AS shape FROM locationshape WHERE locationshape.location_id IS NULL AND ST_Contains(geometry, ST_SetSRID(ST_MakePoint(longitude, latitude), 4326)) GROUP BY ogc_fid, name;
改动说明
- 用PostGIS提供的
ST_MakePoint(longitude, latitude)替代原生point()构造点,生成符合PostGIS规范的geometry类型点,兼容PostGIS全量空间函数 - 新增
ST_SetSRID(..., 4326)为构造的点设置空间参考系,可根据实际业务使用的坐标系修改SRID值,避免空间计算出现隐式转换异常 - 用PostgreSQL原生的
string_agg()替代MySQL的group_concat()实现分组字符串拼接,同时因使用聚合函数,需在GROUP BY子句中指定非聚合字段ogc_fid、name - 调整字符串拼接逻辑,直接用
CONCAT即可实现GEOMETRYCOLLECTION的格式拼接,无需使用CONCAT_WS
内容的提问来源于stack exchange,提问作者Chof63
相关产品推荐
相关产品推荐

