在 PostGIS / PostgreSQL 中使用 st_transform 从质心坐标创建新列

Posted

技术标签:

【中文标题】在 PostGIS / PostgreSQL 中使用 st_transform 从质心坐标创建新列【英文标题】:Create new column with coordinates from centroids using st_transform in PostGIS / PostgreSQL 【发布时间】:2019-12-29 10:33:05 【问题描述】:

我有几何数据,我正在尝试将其转换为 lon lat 并存储在新列中。我创建了一个名为“坐标”的新列并编写了以下查询:

UPDATE places_centroids
SET coordinates = st_y(st_transform(new_centroid, 4326)) AS lat,
st_x(st_transform(new_centroid, 4326)) AS lon;

但它返回:ERROR: ERROR: syntax error at or near 第 2 行:...坐标 = st_y(st_transform(new_centroid, 4326)) AS lat,

但是,当我使用 select 语句编写查询时,它可以正常工作:

SELECT st_y(st_transform(new_centroid, 4326)) AS lat,
         st_x(st_transform(new_centroid, 4326)) AS lon
FROM places_centroids;

谁能看到我的查询出了什么问题?

【问题讨论】:

坐标是什么列类型? 去掉as ..部分,它们在SET子句中无效 双精度。好的,但是没有'as'我该怎么做呢? 如何将两个值存储到一个double precision 列中? 那是真正的 wildplasser.. 但是如果我创建两列,一列包含 lat,一列包含 lon? 【参考方案1】:

您可以创建两列,例如双精度类型的 lat 和 lng,然后执行以下操作:

UPDATE places_centroids 
SET lat = st_y(st_transform(new_centroid, 4326)),
lng= st_x(st_transform(new_centroid, 4326));

或将坐标定义为原生点类型:

UPDATE places_centroids
SET coordinates = point(st_y(st_transform(new_centroid, 4326)),
st_x(st_transform(new_centroid, 4326)));

我个人更喜欢存储在两列中。

最好的问候, 比亚尼

【讨论】:

为什么更喜欢两列中的点坐标? PostGIS 函数不是为几何类型的列设计的吗? 我使用 Postgis,而不是原生 Postgres 几何类型和函数。大多数数据,例如公共数据,都使用 lat 和 lng,因此使用它们很方便。我通常也有 Postgis 类型几何点的第三列。它与原生点类型不同。 不需要使用原生的point,因为OP表中已经有new_centroid几何列了

以上是关于在 PostGIS / PostgreSQL 中使用 st_transform 从质心坐标创建新列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 docker 中为 postgresql 创建 postgis 扩展?

rails3、postgresql 和 postGIS:在迁移中冻结

如何将 PostGIS 添加到 PostgreSQL pgAdmin?

ubuntu 安装 postgresql 和 postgis

带有 Postgis Geodjango 安装的 Postgresql

postgresql 和postgis区别是啥?