【YashanDB知识库】为什么YashanDB只有Geometry类型,没有Geogrephy类型

简介: 【YashanDB知识库】为什么YashanDB只有Geometry类型,没有Geogrephy类型

背景:

● Geometry:投影坐标系,平面坐标系,笛卡尔坐标系,Srid默认2369,基于平面直角坐标系,在该坐标系内计算出的最短路径是一条直线,计算简单,执行起来更快,但是相对于地球球体表面的数据不准确。

● Geogrephy:地理坐标系,大地坐标系,经纬坐标系,球面坐标系,Srid默认4326(服务端存储一般用4326),基于球面坐标系,在该坐标系内计算出的最短路径是一段圆弧,该数据类型的计算考虑了地球是一个球型,计算复杂,执行时间相对慢,但是计算结果相对精确。

● Srid:全称Spatial Reference System Identifier,定义了地球海平面,球心位置,球心偏移,地球形状等信息,不指定SRID默认为0。

● PostGis的地理数据类型:Geometry和Geogrephy

● YashanDB的地理数据类型:Geometry,但是兼顾PostGis两种坐标系,通过指定Srid来实现两种数据类型的转换

yasd**b**兼容示例:

在**yasdb中没有函st_geogfromtextpostGisst_geogfromtext函数yasdb可通st_geomfromtext函数指SRID**的方式兼容

● PostGis:st_geogfromtext('POLYGON ((114.01758862581613 22.626209213735862, 114.01758862581613 22.622079565683535, 114.02268482294346 22.622079565683535, 114.02268482294346 22.626209213735862, 114.01758862581613 22.626209213735862))')

● YashanDB:st_geomfromtext('POLYGON ((114.01758862581613 22.626209213735862, 114.01758862581613 22.622079565683535, 114.02268482294346 22.622079565683535, 114.02268482294346 22.626209213735862, 114.01758862581613 22.626209213735862))',4326)

PostGi**sST_Distance(geometry A, geometry B)**ST_DistanceSphere(geometry A, geometry B)

● PostGis的ST_Distance函数返回的是笛卡尔坐标系的直线距离,ST_DistanceSphere返回的是球面坐标系的圆弧距离

● YashanDB目前支持ST_Distance函数,暂不支持ST_DistanceSphere函数,但是YashanDB的ST_Distance函数可以根据SRID自动识别需要计算的是笛卡尔坐标系下的距离,还是基于地理坐标系的圆弧距离,在YashanDB下计算圆弧距离用的是椭球坐标系而不是球面坐标系,在相对带来一些性能损失的情况下,比postGis的球面坐标系的计算方式更精确。

在使**st_distance函数计算两个地理位置距离的操作中,同一sql语句pgsqlyasdb上计算的结果不一致:**

YashanD**B**:

image2024-4-24_10-9-50

PostGi**s**:

image2024-4-24_10-6-26

主要原因:

pgsql不根据SRID来区分经纬度还是投影坐标,需要用对应的函数显式声明,GeomFromText生成的就是geometry,GeogFromText生成的就是geography,否则pgsql会按照投影坐标系来计算两地之间的直线距离,而不是弧度距离,而yasdb是根据SRID来区分是geometry还是geography的。

改写方式:

pgsql需要显式使用geogfromtext函数来申明是一个球面坐标参数。

select st\_distance(st\_geogfromtext('POLYGON ((113.92505953616575 22.574317714342442, 113.89123260989561 22.574317714342442, 113.89123260989561 22.55111425204862, 113.92505953616575 22.55111425204862, 113.92505953616575 22.574317714342442))'), st\_geogfromtext('POLYGON ((113.87828681559085 22.55245916933376, 113.87828681559085 22.54723397504624, 113.88905632391055 22.54723397504624, 113.88905632391055 22.55245916933376, 113.87828681559085 22.55245916933376))')) as dual;
AI 代码解读

改写后:

image2024-4-24_10-6-47

目录
打赏
0
0
0
0
98
分享
相关文章
【YashanDB知识库】服务器重启后启动yasom和yasagent进程时有告警
【YashanDB知识库】服务器重启后启动yasom和yasagent进程时有告警
【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法
【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】服务器重启后启动yasom和yasagent进程时有告警
本文介绍了YashanDB在特定场景下的问题分析与解决方法。当使用yasboot重启数据库后,yasom和yasagent进程虽启动成功但出现告警,原因是缺少libnsl.so.1库文件或环境变量配置错误。解决步骤包括:检查系统中是否存在该库文件,若不存在则根据操作系统类型安装(有外网时通过yum或apt,无外网时创建符号链接),若存在则调整环境变量配置,并重新启动相关进程验证问题是否解决。
【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法
本文介绍了MySQL中`CONTINUE HANDLER FOR NOT FOUND`的用法及其在YashanDB中的改写方法。通过一个示例存储过程,展示了如何使用游标和异常处理机制来应对“未找到数据”的情况。在MySQL中,`CONTINUE HANDLER`用于捕获此类异常;而在YashanDB中,则需改用游标的`%NOTFOUND`属性和`NO_DATA_FOUND`异常处理。文章对比了两者的执行效果,帮助用户顺利完成从MySQL到YashanDB的业务迁移。
【YashanDB知识库】共享超过32000字节字符串插入CLOB类型方案
本文来自YashanDB官网,介绍了解决向崖山数据库CLOB类型字段插入超过32000字节字符串时出现的YAS-04107错误的方法。通过JDBC动态变量绑定技术,实现对不同表的超长字符串插入支持。方案基于YashanDB JDBC和Druid组件,动态解析SQL语句并绑定变量,提供通用性。文章包含关键代码示例及程序使用说明,需JDK 1.8环境运行,并提供附件下载以辅助实施。
【YashanDB知识库】MySQL和YashanDB 隐式转换不一致引起的报错
本文分析了在YashanDB中执行特定SQL语句时出现的类型转换错误问题,并对比了YashanDB、Oracle和MySQL 5.7的行为差异。问题源于隐式类型转换,当数值字段与非法数字字符串(如'1,2')进行比较时,YashanDB和Oracle会报错,而MySQL 5.7虽不报错但会引发警告。通过调整SQL语句,避免数值与字符串直接比较,可有效解决问题。文章还详细解析了不同值表现不一致的原因,涉及执行计划和过滤条件的实际运行细节。
【YashanDB知识库】数据库升级后用yasboot在线扩充备节点出现报错
本文来自YashanDB官网,讨论从22.2.4.1升级至23.2.2.100过程中遇到的在线扩容问题。使用yasboot增加备节点时出现“no replication addr in node 1-1”错误,尽管数据库中存在相关配置。原因是早期托管功能未支持扩容,导致OM无法获取新库配置。提供两种规避方法:一是手动修改`cod_domor.db`信息并调整配置文件;二是手动安装YashanDB并配置备机。最终已向研发反馈,将在扩容时优化配置检查逻辑。
【YashanDB 知识库】从 PostgreSQL 迁移到 YashanDB 如何进行数据行数比对
【YashanDB 知识库】从 PostgreSQL 迁移到 YashanDB 如何进行数据行数比对

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等