postgis空间坐标系实践

postgis空间表达基础

  1. 激活postgis支持空间表达
sql 复制代码
create extension postgis;

postgis激活之后,postgresql就支持了相关的空间操作,在数据库中最直观的体现就是新增了一个sptatial_ref_sys表来存储相关的坐标系信息;新增了geometry_columsgeography_colums视图来提供了数据库中所有空间数据表的描述信息

  1. sptatial_ref_sys表: 需要添加自定坐标系按照表格内容填充信息即可

3. geometry_colums

4. 创建的带空间信息的表(feature_table)、geometry_colums表、sptatial_ref_sys表三者之间相互关联才能支持完整的地理空间信息表达

空间坐标系问题实践

  1. 如何更新错误的坐标信息(只涉及到元数据): 例如geom列已知是3857,但是导入时未选坐标系导致记录为0,在导入时选择了错误的坐标系

存在问题的修改方式

sql 复制代码
-- 先给旧数据补上正确的旧 SRID(如果原来是 0)
UPDATE your_table
SET geom = ST_SetSRID(geom, 4326)
WHERE ST_SRID(geom) = 0;

存在问题的原因,如果按上述方式修改,geometry_colums表中的srid列并不会自动更新为修改的值,还是为保留原有的值,因为其中的关联关系,后续可能会有问题

正确的修改方式

sql 复制代码
SELECT UpdateGeometrySRID('schame名称','表名','geom',3857);

-- UpdateGeometrySRID相当于做了如下操作:
BEGIN;
ALTER TABLE t ALTER COLUMN geom TYPE geometry(Geometry, NEW_SRID)
      USING ST_SetSRID(geom, NEW_SRID);
UPDATE geometry_columns
   SET srid = NEW_SRID
 WHERE f_table_schema = 'your_schema'
   AND f_table_name   = 'your_table'
   AND f_geometry_column = 'geom';
COMMIT;

注意事项:

不管是UpdateGeometrySRID还是ST_SRID都是修改元数据中描述空间信息的字段,不会更改几何数据的实际投影,简单来说就是原本是4326,几何坐标为(110, 20), 你用UpdateGeometrySRID更新为3857也只是把srid这个字段改为3867实际空间表达字段值还是(110, 20)

  1. 修改几何坐标

所谓的更改几何坐标就是投影或则将投影坐标改为地理坐标,使用st_trasform(geom, srid)即可,但是实际过程中可能会遇到通过如下sql更新数据时,报错:Geometry SRID (4326) does not match column SRID (3857)

ini 复制代码
UPDATE public."Roadway_Block"
SET geom = ST_Transform(geom, 4326);

原因分析:第一节讲了创建的带空间信息的表(feature_table)、geometry_colums表、sptatial_ref_sys表三者之间的关系,实际就是geometry_colums表限定了表的srid,正确代码如下:

sql 复制代码
ALTER TABLE public."Roadway_Block"
  ALTER COLUMN geom TYPE geometry(GeometryZ, 4326)   -- GeometryZ = 允许 Z
  USING ST_Transform(geom, 4326);
  
背后流程(数据库自动做):

1.  对每一行取旧 `geom` →
2.  调用 `ST_Transform(geom, 4326)` 得到新几何 →
3.  把新几何塞进新类型 `geometry(GeometryZ,4326)` →
4.  全部行处理完后,把列定义正式改成新类型并更新 `geometry_columns` 元数据。
相关推荐
希望永不加班6 分钟前
SpringBoot 整合 MongoDB
java·spring boot·后端·mongodb·spring
Lzh编程小栈28 分钟前
数据结构与算法之队列深度解析:循环队列+C 语言硬核实现 + 面试考点全梳理
c语言·开发语言·汇编·数据结构·后端·算法·面试
妙蛙种子31135 分钟前
【Java设计模式 | 创建者模式】工厂方法模式
java·后端·设计模式·工厂方法模式
freejackman3 小时前
Java从0到1---基础篇
java·开发语言·后端·idea
无心水3 小时前
20、Spring陷阱:Feign AOP切面为何失效?配置优先级如何“劫持”你的设置?
java·开发语言·后端·python·spring·java.time·java时间处理
0xDevNull3 小时前
Java 21 新特性概览与实战教程
java·开发语言·后端
Gse0a362g3 小时前
Go - Zerolog使用入门
开发语言·后端·golang
Renhao-Wan4 小时前
Docker 核心原理详解:镜像、容器、Namespace、Cgroups 与 UnionFS
java·后端·docker·容器
EFCY1MJ904 小时前
ASP.NET MVC 1.0 (五) ViewEngine 深入解析与应用实例
后端·asp.net·mvc
小江的记录本5 小时前
【RabbitMQ】RabbitMQ核心知识体系全解(5大核心模块:Exchange类型、消息确认机制、死信队列、延迟队列、镜像队列)
java·前端·分布式·后端·spring·rabbitmq·mvc