PostgreSQL(PostGIS)触发器+坐标转换案例

news2025/6/7 2:20:46

需求,只录入一份坐标参考为4326的数据,但是发布的数据要求坐标必须是3857

对这种需求可以利用数据库触发器实现数据的同步

步骤:

1. 使用ArcGIS Pro创建一个名字为testfc_4326的图层,坐标参考为4326

2. 使用Pro再创建一个名字为testfc_3857,坐标参考为3857

3. 对两个图层分别开启Global ID功能

4. 图层的字段如下:

lftest_postgis=# \d testfc_4326
                                                     Table "sde.testfc_4326"
      Column       |          Type          | Collation | Nullable |                           Default
-------------------+------------------------+-----------+----------+-------------------------------------------------------------
 objectid          | integer                |           | not null |
 gdb_geomattr_data | bytea                  |           |          |
 shape             | geometry               |           |          |
 field1            | character varying(255) |           |          |
 globalid          | character varying(38)  |           | not null | '{00000000-0000-0000-0000-000000000000}'::character varying
Indexes:
    "r387_sde_rowid_uk" UNIQUE, btree (objectid) WITH (fillfactor='75')
    "uuid_387" UNIQUE, btree (globalid) WITH (fillfactor='75')
    "a362_ix1" gist (shape)
Check constraints:
    "enforce_srid_shape" CHECK (st_srid(shape) = 4326)



lftest_postgis=# \d testfc_3857
                                                     Table "sde.testfc_3857"
      Column       |          Type          | Collation | Nullable |                           Default
-------------------+------------------------+-----------+----------+-------------------------------------------------------------
 objectid          | integer                |           | not null |
 gdb_geomattr_data | bytea                  |           |          |
 shape             | geometry               |           |          |
 field1            | character varying(255) |           |          |
 globalid          | character varying(38)  |           | not null | '{00000000-0000-0000-0000-000000000000}'::character varying
Indexes:
    "r388_sde_rowid_uk" UNIQUE, btree (objectid) WITH (fillfactor='75')
    "uuid_388" UNIQUE, btree (globalid) WITH (fillfactor='75')
    "a363_ix1" gist (shape)
Check constraints:
    "enforce_srid_shape" CHECK (st_srid(shape) = 3857)

  5. 同步触发器

CREATE OR REPLACE FUNCTION sync_4326_to_3857()

RETURNS TRIGGER AS $$

BEGIN

if pg_trigger_depth() < 2 then
IF TG_OP = 'INSERT' THEN

INSERT INTO testfc_3857(objectid, gdb_geomattr_data, field1,shape,globalid)

VALUES (sde.next_rowid('sde','testfc_3857'), NEW.gdb_geomattr_data, NEW.field1,st_transform(NEW.shape,3857),NEW.globalid);

RETURN NEW;

ELSIF TG_OP = 'UPDATE' THEN

update testfc_3857 set gdb_geomattr_data=NEW.gdb_geomattr_data,field1=NEW.field1,globalid=NEW.globalid,shape=st_transform(NEW.shape,3857) where globalid=NEW.globalid;

RETURN NEW;

ELSIF TG_OP = 'DELETE' THEN

delete from testfc_3857 where globalid=OLD.globalid;

RETURN OLD;

END IF;
END IF;

RETURN NULL; -- 通常不会执行到这里

END;

$$ LANGUAGE plpgsql;
;
CREATE TRIGGER trg_sync_4326_3857

AFTER INSERT OR UPDATE OR DELETE ON testfc_4326

FOR EACH ROW

EXECUTE FUNCTION sync_4326_to_3857();

CREATE OR REPLACE FUNCTION sync_3857_to_4326()

RETURNS TRIGGER AS $$

BEGIN

if pg_trigger_depth() < 2 then
IF TG_OP = 'INSERT' THEN

INSERT INTO testfc_4326(objectid, gdb_geomattr_data, field1,shape,globalid)

VALUES (sde.next_rowid('sde','testfc_4326'), NEW.gdb_geomattr_data, NEW.field1,st_transform(NEW.shape,4326),NEW.globalid);

RETURN NEW;

ELSIF TG_OP = 'UPDATE' THEN

update testfc_4326 set gdb_geomattr_data=NEW.gdb_geomattr_data,field1=NEW.field1,globalid=NEW.globalid,shape=st_transform(NEW.shape,4326) where globalid=NEW.globalid;

RETURN NEW;

ELSIF TG_OP = 'DELETE' THEN

delete from testfc_4326 where globalid=OLD.globalid;

RETURN OLD;

END IF;
END IF;

RETURN NULL; -- 通常不会执行到这里

END;

$$ LANGUAGE plpgsql;


CREATE TRIGGER trg_sync_3857_4326

AFTER INSERT OR UPDATE OR DELETE ON testfc_3857

FOR EACH ROW

EXECUTE FUNCTION sync_3857_to_4326();


6.使用Pro在testfc_4326插入一条记录后,使用sql查询如下,确实同步过来了


lftest_postgis=# select st_astext(shape) from testfc_3857;
                                                                                        st_astext

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------
 POLYGON((1810836.61422326 1835666.21123957,5215209.44908767 -2293311.99894363,1593536.22052983 -6351863.96575071,-4418441.33887841 -5205160.20034392,1810836.61422326 1835666.2
1123957))
(1 row)

lftest_postgis=# select st_astext(shape) from testfc_4326;
                                                                    st_astext
-------------------------------------------------------------------------------------------------------------------------------------------------
 POLYGON((16.267022076 16.267022076,46.84902358 -20.171107375,14.314979427 -49.451747112,-39.691533867 -42.294257399,16.267022076 16.267022076))

7. 使用pro编辑和删除数据后,都会同步过去。

8. 同理pro编辑testfc_3857也会同步到testfc_4326中。

8. 注意

我测试数据为4326到3857互转换,该转换为公开算法,因此可以使用postgis自带的st_transform实现,但是很多时候进行转换的都是cgcs2000到地方坐标,只有甲方有相关算法,并且再使用国产数据库的时候,st_transform的代码在数据库厂商手中,因此需要甲方和数据库厂商配合,甲方提供转换的函数或者动态库给数据库厂商来修改st_transform函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2400937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Constraints and Triggers

目录 Kinds of Constraints Single-Attribute Keys Multiattribute Key Foreign Keys Expressing Foreign Keys Enforcing Foreign-Key Constraints Actions Taken Attribute-Based Checks Timing of Checks Tuple-Based Checks Assertions Timing of Assertion Ch…

BERT:让AI真正“读懂”语言的革命

BERT&#xff1a;让AI真正“读懂”语言的革命 ——图解谷歌神作《BERT: Pre-training of Deep Bidirectional Transformers》 2018年&#xff0c;谷歌AI团队扔出一篇核弹级论文&#xff0c;引爆了整个NLP领域。这个叫BERT的模型在11项任务中屠榜&#xff0c;甚至超越人类表现…

冷雨泉教授团队:新型视觉驱动智能假肢手,拟人化抓握技术突破,助力截肢者重获生活自信

研究背景&#xff1a;日常生活中&#xff0c;健康人依靠手完成对物体的操作。对于手部截肢患者&#xff0c;手部的缺失导致他们难以有效地操作物体&#xff0c;进而影响正常的日常生活。拥有一个能够实现拟人地自然抓取多种日常物体的五指动力假手是手部截肢患者的夙愿&#xf…

pikachu靶场通关笔记14 XSS关卡10-XSS之js输出(五种方法渗透)

目录 一、源码分析 1、进入靶场 2、代码审计 二、渗透实战 1、根据提示输入tmac 2、XSS探测 3、注入Payload1 4、注入Payload2 5、注入Payload3 6、注入Payload4 7、注入Payload5 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关&#xff09;渗透集合&#x…

李沐-动手学深度学习:RNN

1.RNN从零开始实现 import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l#8.3.4节 #batch_size&#xff1a;每个小批量中子序列样本的数目&#xff0c;num_steps&#xff1a;每个子序列中预定义的时间步数 #loa…

【教学类-36-10】20250531蝴蝶图案描边,最适合大小(一页1图1图、2图图案不同、2图图案相同对称)

背景说明: 之前做了动物头像扇子(描边20),并制作成一页一套图案对称两张 【教学类-36-09】20250526动物头像扇子的描边(通义万相)对称图40张,根据图片长宽,自动旋转图片,最大化图片-CSDN博客文章浏览阅读1k次,点赞37次,收藏6次。【教学类-36-09】20250526动物头像…

高效DBA的日常运维主题沙龙

2024年11月10日&#xff0c;在宁波组织了高效DBA的日常运维沙龙活动&#xff0c;大概有20人左右现场参加。会议的主题为&#xff1a; 目标&#xff1a; 1、识别高频低效操作并制定自动化方案 2、建立关键运维指标健康度体系 3、输出可立即落地的优化清单 会议议程 一、效能瓶…

AAAI 2025论文分享│STD-PLM:基于预训练语言模型的时空数据预测与补全方法

本文详细介绍了一篇发表于人工智能顶级会议AAAI 2025的论文《STD-PLM: Understanding Both Spatial and Temporal Properties of Spatial-Temporal Data with PLM》。该论文提出了一种基于预训练语言模型&#xff08;Pre-trained Language Model‌&#xff0c;PLM&#xff09;的…

Ethernet/IP转DeviceNet网关:驱动大型矿山自动化升级的核心纽带

在大型矿山自动化系统中&#xff0c;如何高效整合新老设备、打通数据孤岛、实现统一控制&#xff0c;是提升效率与安全的关键挑战。JH-EIP-DVN疆鸿智能EtherNet/IP转DeviceNet网关&#xff0c;正是解决这一难题的核心桥梁&#xff0c;为矿山各环节注入强劲连接力&#xff1a; …

[蓝桥杯]模型染色

模型染色 题目描述 在电影《超能陆战队》中&#xff0c;小宏可以使用他的微型机器人组合成各种各样的形状。 现在他用他的微型机器人拼成了一个大玩具给小朋友们玩。为了更加美观&#xff0c;他决定给玩具染色。 小宏的玩具由 nn 个球型的端点和 mm 段连接这些端点之间的边…

卡西欧模拟器:Windows端功能强大的计算器

引言 大家还记得初中高中时期用的计算器吗&#xff1f;今天给大家分享的就是一款windows端的卡西欧计算器。 软件介绍 大家好&#xff0c;我是逍遥小欢。 CASIO fx-9860G是一款功能强大的图形计算器&#xff0c;适用于数学、科学和工程计算。以下是其主要功能和特点的详细介…

机器学习基础(三) 逻辑回归

目录 逻辑回归的概念核心思想 Sigmoid 函数 逻辑回归的原理和底层优化手段伯努利分布最大似然估计 Maximum Likelihood Estimation &#xff08;MLE&#xff09;伯努利分布的似然函数交叉熵损失函数&#xff08;Cross-Entropy Loss&#xff09;&#xff0c;也称为 对数损失&…

Qwen-3 微调实战:用 Python 和 Unsloth 打造专属 AI 模型

虽然大家都忙着在 DeepSeek 上构建应用&#xff0c;但那些聪明的开发者们却悄悄发现了 Qwen-3 的微调功能&#xff0c;这可是一个隐藏的宝藏&#xff0c;能把通用型 AI 变成你的专属数字专家。 通过这篇文章&#xff0c;你将学到如何针对特定用途微调最新的 Qwen-3 模型。无论…

微软Build 2025:Copilot Studio升级,解锁多智能体协作未来

微软Build 2025大会圆满落幕&#xff0c;作为年度科技盛会&#xff0c;它一直是开发与AI技术突破性创新的重要展示平台。对于工程师、创作者和领域专家来说&#xff0c;这是了解微软生态未来动向的关键时刻。今年&#xff0c;Microsoft Copilot Studio推出了一系列新功能&#…

设计模式——系统数据建模设计

摘要 本文主要介绍了UML在软件系统分析和设计中的应用&#xff0c;详细阐述了六大类关系&#xff08;泛化、实现、依赖、关联、聚合、组合&#xff09;及其在UML类图中的表示方法&#xff0c;并通过具体例子说明了这些关系在实际编程中的应用。同时&#xff0c;文章还概述了UM…

解决docker运行zentao 报错:ln: failed to create symbolic link ‘/opt/zbox/tmp/mysq

1 背景描述 禅道使用docker部署运行过一段&#xff0c;服务正常。 后因服务器断电重启&#xff0c;禅道服务也随docker一起启动&#xff0c;但是服务却无法访问。如下如&#xff1a; 2 查看日志&#xff0c;定位原因 查看禅道日志&#xff1a; # docker logs zentao容器di…

OA工程自动化办公系统 – 免费Java源码

概述 功能完备的OA工程自动化办公系统Java源码&#xff0c;采用主流技术栈开发&#xff0c;无论是学习SpringBoot框架还是开发企业级应用&#xff0c;都是不可多得的优质资源。 主要内容 技术架构 ​​后端技术栈​​&#xff1a; 核心框架&#xff1a;SpringBoot 2.xORM框…

Apache IoTDB V2.0.3 发布|新增元数据导入导出脚本适配表模型功能

Release Announcement Version 2.0.3 Apache IoTDB V2.0.3 已经发布&#xff01; V2.0.3 作为树表双模型正式版本&#xff0c;主要新增元数据导入导出脚本适配表模型、Spark 生态集成&#xff08;表模型&#xff09;、AINode 返回结果新增时间戳&#xff0c;表模型新增部分聚…

某校体育场馆结构自动化监测

1. 项目简介 某小学学校成立于2020年&#xff0c;是一所公办小学&#xff0c;以高起点定位为该区优质教育新增长极&#xff0c;依托当地学院及教师进修学院附属小学资源&#xff0c;注重学生综合素质培养&#xff0c;近年来&#xff0c;该小学聚焦“五育” 领域&#xff0c;不…

Android 3D球形水平圆形旋转,旋转动态更换图片

看效果图 1、事件监听类 OnItemClickListener&#xff1a;3D旋转视图项点击监听器接口 public interface OnItemClickListener {/*** 当旋转视图中的项被点击时调用** param view 被点击的视图对象* param position 被点击项在旋转视图中的位置索引&#xff08;从0开始&a…