【Maxcompute】bd09、gcj02、wgs84经纬度坐标系转换udf函数

1.梳理、总结经纬度处理在Maxcompute平台上的实战应用,如bd09、gcj02、wgs84经纬度坐标系转换UDF函数注册与使用。
2.欢迎批评指正,跪谢一键三连!

文章目录

    • 1.参考代码

1.参考代码

  • 坐标系转换
    • bd09坐标系(百度坐标系)gcj02坐标系(中国国家测绘局(g表示guojia国家,c表示cehui测绘,j表示ju局)制订的地理信息系统的坐标系统)
    • gcj02坐标系(中国国家测绘局(g表示guojia国家,c表示cehui测绘,j表示ju局)制订的地理信息系统的坐标系统)转bd09坐标系(百度坐标系)
    • bd09坐标系(百度坐标系)地球坐标系(world geodetic system)
    • 地球坐标系(world geodetic system)gcj02坐标系(中国国家测绘局(g表示guojia国家,c表示cehui测绘,j表示ju局)制订的地理信息系统的坐标系统)
    • gcj02坐标系(中国国家测绘局(g表示guojia国家,c表示cehui测绘,j表示ju局)制订的地理信息系统的坐标系统)地球坐标系(world geodetic system)
    • 地球坐标系(world geodetic system)bd09坐标系(百度坐标系)
  • # coding:utf-8
    from odps.udf import annotate
    import math@annotate("double,double,string,string->string")
    class CoordTransform(object):'''function: 坐标系转换input:  lng,lat,src,destparms:  lng:经度 doublelat:纬度 doublesrc:输入坐标系 ['bd','gcj','wgs']dest:输出坐标系 ['bd','gcj','wgs']output:string: 'lng,lat''''def evaluate(self, lng, lat, src, dest):if src == 'bd' and dest == 'gcj':return ','.join([str(x) for x in GeoUtils.bd09togcj02(float(lng), lat)])elif src == 'bd' and dest == 'wgs':# return GeoUtils.bd09towgs84(lng,lat)return ','.join([str(x) for x in GeoUtils.bd09towgs84(lng, lat)])elif src == 'gcj' and dest == 'wgs':return ','.join([str(x) for x in GeoUtils.gcj02towgs84(lng, lat)])elif src == 'gcj' and dest == 'bd':return ','.join([str(x) for x in GeoUtils.gcj02tobd09(lng, lat)])elif src == 'wgs' and dest == 'bd':return ','.join([str(x) for x in GeoUtils.wgs84tobd09(lng, lat)])if src == 'wgs' and dest == 'gcj':return ','.join([str(x) for x in GeoUtils.wgs84togcj02(lng, lat)])class GeoUtils():PI = 3.1415926535897932384626a = 6378245.0ee = 0.00669342162296594323@staticmethoddef bd09togcj02(bd_lng, bd_lat):"""bd09坐标系(百度坐标系)转gcj02坐标系(中国国家测绘局(g表示guojia国家,c表示cehui测绘,j表示ju局)制订的地理信息系统的坐标系统)"""x = bd_lng - 0.0065y = bd_lat - 0.006z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * GeoUtils.PI)theta = math.atan2(y, x) - 0.000003 * math.cos(x * GeoUtils.PI)gcj_lng = z * math.cos(theta)gcj_lat = z * math.sin(theta)return [gcj_lng, gcj_lat]@staticmethoddef gcj02tobd09(gcj_lng, gcj_lat):"""gcj02坐标系(中国国家测绘局(g表示guojia国家,c表示cehui测绘,j表示ju局)制订的地理信息系统的坐标系统)转bd09坐标系(百度坐标系)"""z = math.sqrt(gcj_lng * gcj_lng + gcj_lat * gcj_lat) + 0.00002 * math.sin(gcj_lat * GeoUtils.PI)theta = math.atan2(gcj_lat, gcj_lng) + 0.000003 * math.cos(gcj_lng * GeoUtils.PI)bd_lng = z * math.cos(theta) + 0.0065bd_lat = z * math.sin(theta) + 0.006return [bd_lng, bd_lat]@staticmethoddef bd09towgs84(lng, lat):"""bd09坐标系(百度坐标系)转地球坐标系(world geodetic system)"""return GeoUtils.gcj02towgs84(*GeoUtils.bd09togcj02(lng, lat))@staticmethoddef wgs84togcj02(lng, lat):"""地球坐标系(world geodetic system)转gcj02坐标系(中国国家测绘局(g表示guojia国家,c表示cehui测绘,j表示ju局)制订的地理信息系统的坐标系统)"""dlat = GeoUtils.transformlat(lng - 105.0, lat - 35.0)dlng = GeoUtils.transformlng(lng - 105.0, lat - 35.0)radlat = lat / 180.0 * GeoUtils.PImagic = math.sin(radlat)magic = 1 - GeoUtils.ee * magic * magicsqrtmagic = math.sqrt(magic)dlat = (dlat * 180.0) / ((GeoUtils.a * (1 - GeoUtils.ee)) / (magic * sqrtmagic) * GeoUtils.PI)dlng = (dlng * 180.0) / (GeoUtils.a / sqrtmagic * math.cos(radlat) * GeoUtils.PI)mglat = lat + dlatmglng = lng + dlngreturn [mglng, mglat]@staticmethoddef gcj02towgs84(lng, lat):"""gcj02坐标系(中国国家测绘局(g表示guojia国家,c表示cehui测绘,j表示ju局)制订的地理信息系统的坐标系统)转地球坐标系(world geodetic system)"""dlat = GeoUtils.transformlat(lng - 105.0, lat - 35.0)dlng = GeoUtils.transformlng(lng - 105.0, lat - 35.0)radlat = lat / 180.0 * GeoUtils.PImagic = math.sin(radlat)magic = 1 - GeoUtils.ee * magic * magicsqrtmagic = math.sqrt(magic)dlat = (dlat * 180.0) / ((GeoUtils.a * (1 - GeoUtils.ee)) / (magic * sqrtmagic) * GeoUtils.PI)dlng = (dlng * 180.0) / (GeoUtils.a / sqrtmagic * math.cos(radlat) * GeoUtils.PI)mglat = lat + dlatmglng = lng + dlngreturn [lng * 2 - mglng, lat * 2 - mglat]@staticmethoddef wgs84tobd09(lng, lat):"""地球坐标系(world geodetic system)转bd09坐标系(百度坐标系)"""dlat = GeoUtils.transformlat(lng - 105.0, lat - 35.0)dlng = GeoUtils.transformlng(lng - 105.0, lat - 35.0)radlat = lat / 180.0 * GeoUtils.PImagic = math.sin(radlat)magic = 1 - GeoUtils.ee * magic * magicsqrtmagic = math.sqrt(magic)dlat = (dlat * 180.0) / ((GeoUtils.a * (1 - GeoUtils.ee)) / (magic * sqrtmagic) * GeoUtils.PI)dlng = (dlng * 180.0) / (GeoUtils.a / sqrtmagic * math.cos(radlat) * GeoUtils.PI)mglat = lat + dlatmglng = lng + dlngz = math.sqrt(mglng * mglng + mglat * mglat) + 0.00002 * math.sin(mglat * GeoUtils.PI)theta = math.atan2(mglat, mglng) + 0.000003 * math.cos(mglng * GeoUtils.PI)bd_lng = z * math.cos(theta) + 0.0065bd_lat = z * math.sin(theta) + 0.006return [bd_lng, bd_lat]@staticmethoddef transformlat(lng, lat):ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * math.sqrt(abs(lng))ret += (20.0 * math.sin(6.0 * lng * GeoUtils.PI) + 20.0 * math.sin(2.0 * lng * GeoUtils.PI)) * 2.0 / 3.0ret += (20.0 * math.sin(lat * GeoUtils.PI) + 40.0 * math.sin(lat / 3.0 * GeoUtils.PI)) * 2.0 / 3.0ret += (160.0 * math.sin(lat / 12.0 * GeoUtils.PI) + 320 * math.sin(lat * GeoUtils.PI / 30.0)) * 2.0 / 3.0return ret@staticmethoddef transformlng(lng, lat):ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * math.sqrt(abs(lng))ret += (20.0 * math.sin(6.0 * lng * GeoUtils.PI) + 20.0 * math.sin(2.0 * lng * GeoUtils.PI)) * 2.0 / 3.0ret += (20.0 * math.sin(lng * GeoUtils.PI) + 40.0 * math.sin(lng / 3.0 * GeoUtils.PI)) * 2.0 / 3.0ret += (150.0 * math.sin(lng / 12.0 * GeoUtils.PI) + 300.0 * math.sin(lng / 30.0 * GeoUtils.PI)) * 2.0 / 3.0return ret@staticmethoddef outofchina(lng, lat):"""判断是否在国内,不在国内不做处理,异常点位:param lng::param lat::return:"""return not (lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55)
    

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

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

相关文章

【Node】Node的Buffer模块介绍和使用

目录 简言Buffer模块Buffer和字符编码Buffer和 TypedArrays 缓冲区和类数组视图Buffers 和 iteration 缓冲区和迭代(遍历)Class: Blobnew buffer.Blob([sources[, options]]) 创建blob实例blob.arrayBuffer() 转换成ArrayBufferblob.size 数据大小blob.slice([start[, end[, ty…

我更看好开源大模型的发展前景

目录 开源大模型与闭源大模型&#xff0c;你更看好哪一方&#xff1f; 方向一&#xff1a;数据隐私 开源大模型&#xff1a; 闭源大模型&#xff1a; 方向二&#xff1a;商业应用 开源大模型&#xff1a; 闭源大模型&#xff1a; 方向三&#xff1a;社区参与 开源大模…

常用开关电源拓扑演进

目录 常用开关电源拓扑演进 一、概述 二、升压变换器(buck)与降压变换器(boost)

Oracle查看执行计划的方法

使用 EXPLAIN PLAN 命令: 首先&#xff0c;你需要执行 EXPLAIN PLAN FOR 你的查询语句。例如&#xff1a;EXPLAIN PLAN FOR SELECT * FROM employees WHERE department_id 10;然后&#xff0c;从系统表 PLAN_TABLE 中查询执行计划详情&#xff1a;SELECT * FROM TABLE(dbms_xp…

AR眼镜定制开发_在AR眼镜中实现ChatGPT功能

AR眼镜定制方案中&#xff0c;需要考虑到强大的算力、轻巧的设计和更长的续航时间等基本要求。然而&#xff0c;AR眼镜的设计方案不仅仅需要在硬件和显示技术方面取得突破&#xff0c;还要在用户体验方面有所进展。 过去&#xff0c;由于造价较高&#xff0c;AR眼镜的普及和商业…

Android 编译文件简述(Makefile 2)

Android 编译文件简述(Makefile 2) 承接上一篇Android 编译文件简述(Makefile),继续讲解Make使用方法。本篇文章简述Makefile的编译和执行流程控制。 作者:炭烤毛蛋 ,点击博主了解更多。 提示:了解Makefile 规则,构建Makefile变得简单。 文章目录 Android 编译文件简述(M…

按钮组切换控制统计图显示【统计图切换渲染失败】

背景 需要实现点击左上角按钮组的按钮&#xff0c;切换对应的统计图 点击按钮1呈现的统计图。映射的实体类Vo1 点击按钮2呈现的统计图。映射的实体类Vo2 可能会出现的问题&#xff1a; &#xff08;1&#xff09; 空白&#xff1a;进入页面只渲染第一个统计图&#xff0c;点…

TypeScript核心类型概览与应用-1

文章目录 TypeScript入门1.TypeScript介绍2.编译并运行TS代码2.1.简化运行ts步骤 3.TS中的常用类型3.1.TS中的类型注解3.2.TS中的原始类型3.3.TS中的数组类型3.4.TS中的联合类型3.5.类型别名3.6.函数类型3.6.1.单独执行参数、返回值类型3.6.2.同时指定参数&#xff0c;返回值类…

OpenGL系列(四)Shader

通过VBO和VAO准备好数据后&#xff0c;接下来要指示GPU如何通过这些数据绘制图形。类似CPU可以通过执行程序来完成特定的任务&#xff0c;GPU也可以执行特定的程序来完成绘制任务&#xff0c;GPU执行的程序称为Shader&#xff0c;也叫着色器。 GPU绘制图形分为不同的处理阶段&a…

09-使用JavaScript处理长列表数据:惰性渲染、虚拟滚动与分批渲染

使用JavaScript处理长列表数据&#xff1a;惰性渲染、虚拟滚动与分批渲染 笔记分享 在前端开发中&#xff0c;处理长列表数据是一项常见且具有挑战性的任务。为了提升性能和用户体验&#xff0c;开发者可以采用多种技术和方法来优化渲染过程。本文将介绍如何使用原生JavaScrip…

数据库课程设计mysql

数据库课程设计&#xff1a;MySQL 一、引言 数据库设计是数据库技术的一个重要方面&#xff0c;它涉及到数据的组织、存储、检索和管理。MySQL作为目前流行的关系数据库管理系统之一&#xff0c;广泛应用于各种应用场景中。本课程设计旨在通过MySQL平台&#xff0c;让学生深入…

深入探讨Qt中的容器类:QList与QVector

深入探讨Qt中的容器类&#xff1a;QList与QVector 在C的Qt框架中&#xff0c;容器类的选择对性能和内存使用有着重要影响。QList和QVector是Qt中两个常用的容器类&#xff0c;它们虽然在某些方面非常相似&#xff0c;但在实现细节和适用场景上存在显著差异。本文将详细介绍这两…

【Zero to One系列】SpringCloud Gateway结合Nacos完成微服务的网关路由

前期回顾&#xff1a; 【Zero to One系列】springcloud微服务集成nacos&#xff0c;形成分布式系统 1、Gateway依赖配置 主要Maven依赖如下&#xff1a; <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>…

oracle date类型如何比较时间

在 Oracle 数据库中&#xff0c;如果你想要比较 DATE 类型的时间部分&#xff0c;你需要意识到 DATE 类型实际上包含日期和时间信息&#xff0c;精确到秒。但是&#xff0c;由于 DATE 类型没有单独的时间组件&#xff0c;你通常需要一些额外的逻辑来提取或比较时间部分。 以下…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑发用电相似性的海上风电中长期双边协商交易优化决策模》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

小鸡庄园智慧农场养殖游戏开发:科技与农业的完美结合

随着科技的进步&#xff0c;一种全新的游戏模式——智慧农场养殖游戏&#xff0c;正在逐渐崭露头角。本文将深入探讨小鸡庄园智慧农场养殖游戏的开发背景、特点、技术实现方式以及未来的发展趋势&#xff0c;以期为游戏产业创新和农业现代化提供新的思路和启示。 一、开发背景…

Rust 性能分析

都说Rust性能好,但是也得代码写得好,猜猜下面两个代码哪个快 . - 力扣&#xff08;LeetCode&#xff09; use std::collections::HashMap; use lazy_static::lazy_static;lazy_static! {static ref DIGIT: HashMap<char, usize> {let mut m HashMap::new();for c in …

【Nacos】docker-compose启动nacos v2.2.3,启动时修改默认密码不使用naocs

1. 背景 出于安全考虑&#xff0c;我司DevOps平台自动部署的容器化nacos密码不能是弱密码或默认值 但是nacos-v2.2.3官方镜像启动后会初始化nacos用户密码为nacos&#xff0c;修改启动时的变量并没有生效。 2. 部署验证 2.1 yml文件如下 注意将derby库的初始化文件挂载出来…

探索Linux中的fdisk命令:磁盘分区管理的利器

探索Linux中的fdisk命令&#xff1a;磁盘分区管理的利器 在Linux系统管理中&#xff0c;磁盘分区是一项非常重要的任务。它涉及到数据的存储、备份和恢复&#xff0c;以及系统的性能和稳定性。而fdisk&#xff0c;作为Linux下的一款经典磁盘分区工具&#xff0c;凭借其强大的功…

软件测试学习总结-侧开之路的起点

软件测试学习总结-侧开之路的起点 文章目录 一、软件测试的基础理论知识 1、软件测试初了解 2、阅读和梳理需求⽂档 3、测试用例编写 4、缺陷管理 二、Linux系统学习 1、Linux系统学习 三、MySQL数据库学习 1、MySQL数据库学习 四、MySQL数据库学习 1、MySQL数据库学习 …