postgresql自定义方法创建之坐标的自动转换

postgresql导入点类型的空间数据,一般会提供xy坐标(或者lon和lat)字段,一般的工具并没有提供转换为空间数据的功能。此时,我们需要提供一些方法或者触发器来实现空间字段的自动更新。而xy坐标在导入的时候也会存在两种情况,一种是以度分秒的字符串形式提供,一种是小数的方式提供。所以这里我们还要提供一个针对坐标的归一化函数。下面就是相关设计的方法方法代码。

1.坐标标准化处理函数

CREATE or replace FUNCTION public.translate_coor(tude varchar) RETURNS NUMERIC  AS $$
DECLARE data varchar[];
BEGIN
  if like(tude,'%°%') then 
		SELECT (regexp_split_to_array(tude, '[°′''"″]')) into data;
		return CAST(data[1] as numeric) + CAST(data[2] as numeric) / 60 + CAST(data[3] as numeric)/3600;
	else 
	  return cast(tude as numeric);
	end if;
END;
$$ LANGUAGE plpgsql;

在实际的数据中,度分秒有时候并不是,°′″,至于分有的数据为了方便输入采用单引号',秒采用双引号",所以这里通过正则表达式进行了不同情况的处理。另外,对于小数的形式数据直接返回。

2.更新geom空间函数

CREATE or replace function public.fill_geom(tbl varchar,x_field varchar,y_field varchar,srid int=4326) RETURNS int AS $$
BEGIN
  if(srid = 0) THEN
		srid = 4326;
	end if;
  EXECUTE format('update %s set geom=st_geomfromewkt(''srid='|| srid || ';point(''||translate_coor(%s)||'' '' || translate_coor(%s)|| '')'');', tbl,x_field,y_field);
	return 0;
END;
$$ LANGUAGE plpgsql;

注意:

  • tbl:表名
  • x_field:x坐标的字段名称
  • y_field:y坐标的字段名称
  • srid:默认为4326。

3.创建触发器函数

3.1 创建触发器对应函数

CREATE or replace FUNCTION public.fun_insert_meteorological() RETURNS "pg_catalog"."trigger"  AS $$
BEGIN
  if((new.lon ~ '^\d+°(\d+[′''](\d+(\.\d+)?[″"])?)?$' and new.lat ~ '^\d+°(\d+[′''](\d+(\.\d+)?[″"])?)?$') or ( new.lon ~ '^\d+(\.\d+)?$' and new.lat ~ '^\d+(\.\d+)?$')) then 
		new.geom=st_geomfromewkt('srid=4326;point(' || translate_coor(new.lon) || ' ' || translate_coor(new.lat) || ')');
	end if;
	return NEW;
END;
$$ LANGUAGE plpgsql;

这里对度分秒的格式通过正则表达式进行了验证。如果不满足,这里按照不执行更新操作。大家可以根据实际进行调整。

3.2 创建触发器

CREATE TRIGGER "meteorological_insert_update_trigger" BEFORE INSERT OR UPDATE ON "public"."meteorological"
FOR EACH ROW
EXECUTE PROCEDURE "public"."fun_insert_meteorological"();

http://www.niftyadmin.cn/n/4950437.html

相关文章

C语言之浮点数_数据存储篇(2)

目录 浮点数 什么是浮点数呢? 为什么叫浮点数? 浮点数家族 浮点数表示的范围? 浮点数存储的例子 浮点数的存储方式 写成规定形式是怎样的? 那SME在内存中如何分配的呢? 为什么要这样存储? 浮点…

耕地单目标语义分割实践——Pytorch网络过程实现理解

一、卷积操作 (一)普通卷积(Convolution) (二)空洞卷积(Atrous Convolution) 根据空洞卷积的定义,显然可以意识到空洞卷积可以提取到同一输入的不同尺度下的特征图&…

【Alibaba中间件技术系列】「RocketMQ技术专题」小白专区之领略一下RocketMQ基础之最!

应一些小伙伴们的私信,希望可以介绍一下RocketMQ的基础,那么我们现在就从0开始,进入RocketMQ的基础学习及概念介绍,为学习和使用RocketMQ打好基础! RocketMQ是一款快速地、可靠地、分布式、容易使用的消息中间件&#…

ATFX汇评:英国7月零售销售年率大降,GBPUSD仍未升破1.3000

ATFX汇评:7月季调后零售销售年率,最新值-3.2%,前值-1.6%,降幅扩大;7月季调后核心零售销售年率,最新值-3.4%,前值-1.6%,降幅扩大。零售销售综合衡量除服务业外包括所有主要从事零售业…

Java IO流(一)IO基础

概述 IO流本质 I/O表示Input/Output,即数据传输过程中的输入/输出,并且输入和输出都是相对于内存来讲Java IO(输入/输出)流是Java用于处理数据读取和写入的关键组件常见的I|O介质包括 文件(输入|输出)网络(输入|输出)键盘(输出)显示器(输出)使用场景 文件拷贝(File&…

[Unity]Lua本地时间、倒计时和正计时。

惯例,直接上代码: --正计时开始时的时间戳 self.begin_time os.time() --倒计时时长,01:30:00 self.countdown_time 5400 --是否开始计时 self.is_update_local_time true--Unity Update function time_transition:update_local_timer()i…

网格(mesh)点跟踪及在贴图中的应用

本文介绍网格跟踪的思路及其在贴图中的使用效果。网格跟踪即跟踪所有的网格点,然后根据网格点估算某一点的变形,相较于曲面跟踪可以在保证一定精度条件下大幅提高处理速度。这里介绍一种简单的网格跟踪思路,效果如下图所示: 创建网…

SpringBoot 微人事 职称管理模块(十三)

职称管理前端页面设计 在职称管理页面添加输入框 export default {name: "JobLevelMarna",data(){return{Jl:{name:""}}}}效果图 添加一个下拉框 v-model的值为当前被选中的el-option的 value 属性值 <el-select v-model"Jl.titlelevel" …