PostgreSQL(PostGIS)触发器+坐标转换案例
需求,只录入一份坐标参考为4326的数据,但是发布的数据要求坐标必须是3857
对这种需求可以利用数据库触发器实现数据的同步
步骤:
1. 使用ArcGIS Pro创建一个名字为testfc_4326的图层,坐标参考为4326
2. 使用Pro再创建一个名字为testfc_3857,坐标参考为3857
3. 对两个图层分别开启Global ID功能
4. 图层的字段如下:
lftest_postgis=# \d testfc_4326Table "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_3857Table "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 $$BEGINif pg_trigger_depth() < 2 then
IF TG_OP = 'INSERT' THENINSERT 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' THENupdate 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' THENdelete from testfc_3857 where globalid=OLD.globalid;RETURN OLD;END IF;
END IF;RETURN NULL; -- 通常不会执行到这里END;$$ LANGUAGE plpgsql;
;
CREATE TRIGGER trg_sync_4326_3857AFTER INSERT OR UPDATE OR DELETE ON testfc_4326FOR EACH ROWEXECUTE FUNCTION sync_4326_to_3857();CREATE OR REPLACE FUNCTION sync_3857_to_4326()RETURNS TRIGGER AS $$BEGINif pg_trigger_depth() < 2 then
IF TG_OP = 'INSERT' THENINSERT 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' THENupdate 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' THENdelete from testfc_4326 where globalid=OLD.globalid;RETURN OLD;END IF;
END IF;RETURN NULL; -- 通常不会执行到这里END;$$ LANGUAGE plpgsql;CREATE TRIGGER trg_sync_3857_4326AFTER INSERT OR UPDATE OR DELETE ON testfc_3857FOR EACH ROWEXECUTE 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函数。
相关文章:

PostgreSQL(PostGIS)触发器+坐标转换案例
需求,只录入一份坐标参考为4326的数据,但是发布的数据要求坐标必须是3857 对这种需求可以利用数据库触发器实现数据的同步 步骤: 1. 使用ArcGIS Pro创建一个名字为testfc_4326的图层,坐标参考为4326 2. 使用Pro再创建一个名字…...

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…...
基于windows系统的netcore架构与SqlServer数据库,实现双机热备。
以下是基于 SQL Server Always On 可用性组 和 故障转移群集 的详细配置步骤,用于实现双机热备。 步骤 1:准备环境 1.1 硬件和软件准备 两台服务器:分别作为主服务器和备用服务器。SQL Server版本:确保两台服务器上安装的SQL S…...
【转bin】EXCEL数据转bin
如果DEC2BIN函数的默认设置无法满足需求(它最多只能处理10位的二进制转换),可以通过VBA宏方法来处理较大数的二进制转换并提取特定位置的数字: 十进制转二进制(不限位宽) 1、打开VBA编辑器(Al…...

BERT:让AI真正“读懂”语言的革命
BERT:让AI真正“读懂”语言的革命 ——图解谷歌神作《BERT: Pre-training of Deep Bidirectional Transformers》 2018年,谷歌AI团队扔出一篇核弹级论文,引爆了整个NLP领域。这个叫BERT的模型在11项任务中屠榜,甚至超越人类表现…...
【计算机组成原理】SPOOLing技术
SPOOLing技术 关键点内容核心思想通过输入/输出井虚拟化独占设备,实现共享,即让多个作业共享一台独占设备依赖条件1. 外存(井文件)2. 多道程序设计虚拟实现多道程序技术磁盘缓冲数据流方向输入设备 → 输入井 → CPU → 输出井 →…...

冷雨泉教授团队:新型视觉驱动智能假肢手,拟人化抓握技术突破,助力截肢者重获生活自信
研究背景:日常生活中,健康人依靠手完成对物体的操作。对于手部截肢患者,手部的缺失导致他们难以有效地操作物体,进而影响正常的日常生活。拥有一个能够实现拟人地自然抓取多种日常物体的五指动力假手是手部截肢患者的夙愿…...
CanvasGroup篇
🎯 Unity UI 性能优化终极指南 — CanvasGroup篇 🧩 什么是 CanvasGroup? CanvasGroup 是UGUI的透明控制器,用于整体控制一组UI元素的: 可见性 (alpha)交互性 (interactable)射线检测 (blocksRaycasts) 🎯…...
[Java 基础]银行账户程序
编写一个 Java 控制台应用程序,模拟一个简单的银行账户。该程序应允许用户执行以下操作: 查询账户余额。 账户初始余额设置为 1000.0 元。向账户存入资金。 用户可以输入存款金额,程序应更新账户余额。存款金额必须为正数。从账户提取资金。…...
2025.6.4总结
工作:今天效率比较高,早上回归4个问题,下午找了3个bug,晚上二刷了科目一(贪吃蛇系统),写了四个点,唯一没达标的就是两自动化没完成。美中不足的是电脑上下载不了PC版的番茄工作软件。…...
将音频数据累积到缓冲区,达到阈值时触发处理
实现了音频处理中的 AEC(声学回声消除)和 AES(音频增强)功能,其核心功能是: 数据缓冲管理:将输入的麦克风和扬声器音频数据块累积到缓冲区中块处理机制:当缓冲区填满预设大小&#…...

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关)渗透集合&#x…...
5.Promise,async,await概念(1)
Promise 是 JavaScript 原生提供的异步处理机制,而 async 和 await 是基于 Promise 的语法糖,由 JavaScript 语言和其运行时环境(如浏览器、Node.js)支持,用于更清晰地编写异步代码,从而避免回调地狱。 Pr…...

李沐-动手学深度学习: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:每个小批量中子序列样本的数目,num_steps:每个子序列中预定义的时间步数 #loa…...
Windows系统下npm报错node-gyp configure got “gyp ERR“解决方法
感谢原博主,此文参考网址:https://zhuanlan.zhihu.com/p/398279220 确保已经安装node.js (官方网址:https://nodejs.org/zh-cn/download) 首先在命令窗口执行命令安装windows-build-tools: npm install -…...
Elasticsearch中的文档(Document)介绍
在Elasticsearch(ES)中,文档(Document)是最基本的数据单元,类似于关系型数据库中的“行”。它以JSON格式存储,包含多个字段(Field),每个字段可以是不同类型(如文本、数值、日期等)。文档是索引(Index)的组成部分,通过唯一ID标识,并支持动态映射(Dynamic Mappi…...
15个基于场景的 DevOps 面试问题及答案
第一部分:持续集成和部署 (CI/CD) 场景 1:构建中断 “您的 CI 流水线突然出现‘找不到依赖项’的错误。您会如何处理这个问题?” 回答:首先,我会检查是否有新的依赖项被添加到需求文件中,但这些依赖项并未包含在需求文件中。我还会验证构建服务器是否可以访问互联网来下…...
今日主题二分查找(寻找峰值 力扣162)
峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] nums[n] -∞ 。 你必须实现时间复杂度为 O(…...

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

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

AAAI 2025论文分享│STD-PLM:基于预训练语言模型的时空数据预测与补全方法
本文详细介绍了一篇发表于人工智能顶级会议AAAI 2025的论文《STD-PLM: Understanding Both Spatial and Temporal Properties of Spatial-Temporal Data with PLM》。该论文提出了一种基于预训练语言模型(Pre-trained Language Model,PLM)的…...

Ethernet/IP转DeviceNet网关:驱动大型矿山自动化升级的核心纽带
在大型矿山自动化系统中,如何高效整合新老设备、打通数据孤岛、实现统一控制,是提升效率与安全的关键挑战。JH-EIP-DVN疆鸿智能EtherNet/IP转DeviceNet网关,正是解决这一难题的核心桥梁,为矿山各环节注入强劲连接力: …...
Android 11以上App主动连接WIFI的完整方案
早期Android版本App内连接指定的WIFI还是比较简单的,但是随着Android版本的提升,限制也越来越多。以下是一套完整的Android 11以上的WIFI应用内主动连接方案。 第一步:添加到建议连接: val wifiManager getSystemService(WIFI_…...

[蓝桥杯]模型染色
模型染色 题目描述 在电影《超能陆战队》中,小宏可以使用他的微型机器人组合成各种各样的形状。 现在他用他的微型机器人拼成了一个大玩具给小朋友们玩。为了更加美观,他决定给玩具染色。 小宏的玩具由 nn 个球型的端点和 mm 段连接这些端点之间的边…...
力扣上C语言编程题
一. 简介 本文简单记录一下力扣上 C语言编程题。作为自己做题笔记。 二. 力扣上 C 语言编程题 1. 从数组中找到两个元素之和,等于一个 target目标值 具体题目说明:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为…...

卡西欧模拟器:Windows端功能强大的计算器
引言 大家还记得初中高中时期用的计算器吗?今天给大家分享的就是一款windows端的卡西欧计算器。 软件介绍 大家好,我是逍遥小欢。 CASIO fx-9860G是一款功能强大的图形计算器,适用于数学、科学和工程计算。以下是其主要功能和特点的详细介…...
鸿蒙OSUniApp结合机器学习打造智能图像分类应用:HarmonyOS实践指南#三方框架 #Uniapp
UniApp结合机器学习打造智能图像分类应用:HarmonyOS实践指南 引言 在移动应用开发领域,图像分类是一个既经典又充满挑战的任务。随着机器学习技术的发展,我们现在可以在移动端实现高效的图像分类功能。本文将详细介绍如何使用UniApp结合Ten…...

机器学习基础(三) 逻辑回归
目录 逻辑回归的概念核心思想 Sigmoid 函数 逻辑回归的原理和底层优化手段伯努利分布最大似然估计 Maximum Likelihood Estimation (MLE)伯努利分布的似然函数交叉熵损失函数(Cross-Entropy Loss),也称为 对数损失&…...
系统调试——ADB 工具
ADB 工具 1.1 概述 ADB(Android Debug Bridge) 是 Android SDK 里的一个工具, 用这个工具可以操作管理Android 模拟器或真实的 Android 设备。 主要功能有: 运行设备的 shell(命令行)管理模拟器或设备的端…...

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