Visual Studio C# 编写加密火星坐标转换

news2024/12/24 11:41:40

Visual Studio C# 编写加密火星坐标转换

  • 1、WGS84坐标转GCJ02火星坐标
  • 2、GCJ02火星坐标转WGS84坐标(回归计算)
  • 3、GCJ02火星坐标转BD09百度坐标
  • 4、BD09百度坐标转GCJ02火星坐标(回归计算)
  • 5、坐标公共转换类
  • 6、地图显示
  • 7、程序简单界面
  • 8、完整源代码工程

1、WGS84坐标转GCJ02火星坐标

        /// <summary>WGS84坐标转GCJ02火星坐标</summary>
        /// <param name="Position">坐标结构体</param>
        /// <returns>返回GCJ02火星坐标</returns>
        public coord WGS84ToGCJ02(coord Position)
        {
            Double lon = Position.lon;
            Double lat = Position.lat;

            if (!isInChina(lon, lat)) return Position;

            coord Pos = offset(lon, lat);

            Pos.lon = lon + Pos.lon;
            Pos.lat = lat + Pos.lat;
            return Pos;
        }

2、GCJ02火星坐标转WGS84坐标(回归计算)

   /// <summary>GCJ02火星坐标转WGS84坐标</summary>
        /// <param name="Position">坐标结构体</param>
        /// <returns>返回WGS84火星坐标</returns>
        public coord GCJ02ToWGS84(coord Position)
        {
            Double lon = Position.lon;
            Double lat = Position.lat;

            if (!isInChina(lon, lat)) return Position;

            coord Pos = Position;

            coord tempPoint = WGS84ToGCJ02(Pos);

            Double dx = tempPoint.lon - lon;
            Double dy = tempPoint.lat - lat;

            while (Math.Abs(dx) > 1e-14 || Math.Abs(dy) > 1e-14)//回归
            {
                Pos.lon -= dx;
                Pos.lat -= dy;

                tempPoint = WGS84ToGCJ02(Pos);

                dx = tempPoint.lon - lon;
                dy = tempPoint.lat - lat;
            }

            return Pos;
        }

3、GCJ02火星坐标转BD09百度坐标

        /// <summary>GCJ02火星坐标转BD09百度坐标</summary>
        /// <param name="Position">坐标结构体</param>
        /// <returns>返回BD09百度坐标</returns>
        public coord GCJ02ToBD09(coord Position)
        {
            Double lon = Position.lon;
            Double lat = Position.lat;

            Double x = lon;
            Double y = lat;
            Double z = Math.Sqrt(x * x + y * y) + 0.00002 * Math.Sin(y * baiduFactor);
            Double theta = Math.Atan2(y, x) + 0.000003 * Math.Cos(x * baiduFactor);

            coord outPos;
            outPos.lon = z * Math.Cos(theta) + 0.0065;
            outPos.lat = z * Math.Sin(theta) + 0.006;

            return outPos;
        }

4、BD09百度坐标转GCJ02火星坐标(回归计算)

        /// <summary>BD09百度坐标转GCJ02火星坐标</summary>
        /// <param name="Position">坐标结构体</param>
        /// <returns>返回GCJ02火星坐标</returns>
        public coord BD09ToGCJ02(coord Position)
        {
            Double lon = Position.lon;
            Double lat = Position.lat;

            Double x = lon - 0.0065;
            Double y = lat - 0.006;

            coord Pos;

            Pos.lon = x;
            Pos.lat = y;

            coord tempPoint = GCJ02ToBD09(Pos);

            Double dx = tempPoint.lon - lon;
            Double dy = tempPoint.lat - lat;

            while (Math.Abs(dx) > 1e-14 || Math.Abs(dy) > 1e-14)//回归
            {
                Pos.lon -= dx;
                Pos.lat -= dy;

                tempPoint = GCJ02ToBD09(Pos);

                dx = tempPoint.lon - lon;
                dy = tempPoint.lat - lat;
            }
            return Pos;
        }

5、坐标公共转换类

        /// <summary>长半轴</summary>
        public const Double a = 6378245.0;
        /// <summary>第一偏心率</summary>
        public const Double ee = 0.00669342162296594322796213968775;

        /// <summary>百度坐标转换因子</summary>
        public const Double baiduFactor = (Math.PI * 3000.0) / 180.0;

        // 定义坐标结构体
        public struct coord
        {
            public Double lon;
            public Double lat;
        };

        /// <summary>是否中国坐标</summary>
        /// <param name="lon">经度</param>
        /// <param name="lat">纬度</param>
        /// <returns>返回布尔值</returns>
        public Boolean isInChina(Double lon, Double lat)
        {
            return lon >= 72.004 && lon <= 137.8347 && lat >= 0.8293 && lat <= 55.8271;
        }

        /// <summary>偏移量</summary>
        /// <param name="lon">经度</param>
        /// <param name="lat">纬度</param>
        /// <returns></returns>
        public coord offset(Double lon, Double lat)
        {
            Double dLon = transformLon(lon - 105.0, lat - 35.0);
            Double dLat = transformLat(lon - 105.0, lat - 35.0);

            Double radLat = (lat / 180.0) * Math.PI;
            Double magic = Math.Sin(radLat);

            magic = 1 - ee * magic * magic;

            Double sqrtMagic = Math.Sqrt(magic);

            coord outPos;

            outPos.lon = (dLon * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * Math.PI);
            outPos.lat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * Math.PI);

            return outPos;
        }

        /// <summary>纬度偏移量</summary>
        /// <param name="lon">经度</param>
        /// <param name="lat">纬度</param>
        /// <returns>返回纬度</returns>
        public Double transformLat(Double lon, Double lat)
        {
            Double ret = -100.0 + 2.0 * lon + 3.0 * lat + 0.2 * lat * lat + 0.1 * lon * lat + 0.2 * Math.Sqrt(Math.Abs(lon));
            ret += ((20.0 * Math.Sin(6.0 * lon * Math.PI) + 20.0 * Math.Sin(2.0 * lon * Math.PI)) * 2.0) / 3.0;
            ret += ((20.0 * Math.Sin(lat * Math.PI) + 40.0 * Math.Sin((lat / 3.0) * Math.PI)) * 2.0) / 3.0;
            ret += ((160.0 * Math.Sin((lat / 12.0) * Math.PI) + 320.0 * Math.Sin((lat * Math.PI) / 30.0)) * 2.0) / 3.0;
            return ret;
        }

        /// <summary>经度偏移量</summary>
        /// <param name="lon">经度</param>
        /// <param name="lat">纬度</param>
        /// <returns>返回经度</returns>
        public Double transformLon(Double lon, Double lat)
        {
            Double ret = 300.0 + lon + 2.0 * lat + 0.1 * lon * lon + 0.1 * lon * lat + 0.1 * Math.Sqrt(Math.Abs(lon));
            ret += ((20.0 * Math.Sin(6.0 * lon * Math.PI) + 20.0 * Math.Sin(2.0 * lon * Math.PI)) * 2.0) / 3.0;
            ret += ((20.0 * Math.Sin(lon * Math.PI) + 40.0 * Math.Sin((lon / 3.0) * Math.PI)) * 2.0) / 3.0;
            ret += ((150.0 * Math.Sin((lon / 12.0) * Math.PI) + 300.0 * Math.Sin((lon / 30.0) * Math.PI)) * 2.0) / 3.0;
            return ret;
        }

6、地图显示

        /// <summary>坐标值改变,地图改变</summary>
        private void ChangeVal()
        {
            Double longitude = 0;
            Double latitude = 0;
            switch (comboBox1.SelectedIndex)
            {
                case 0://高德
                    if (string.IsNullOrEmpty(textBox3.Text) || string.IsNullOrEmpty(textBox4.Text))
                    {
                        longitude = 112.960235035495;
                        latitude = 28.1661659723607;
                    }
                    else
                    {
                        longitude = Convert.ToDouble(textBox4.Text);
                        latitude = Convert.ToDouble(textBox3.Text);
                    }
                    //string amapUrl = "http://ditu.amap.com/?longitude=" + longitude + "&latitude=" + latitude;
                    string amapUrl = "http://ditu.amap.com";// "http://map.gaode.com/";
                    webBrowser1.Navigate(amapUrl);
                    break;
                case 1://百度
                    if (string.IsNullOrEmpty(textBox5.Text) || string.IsNullOrEmpty(textBox6.Text))
                    {
                        longitude = 112.966759165825;
                        latitude = 28.1719881916543;
                    }
                    else
                    {
                        longitude = Convert.ToDouble(textBox6.Text);
                        latitude = Convert.ToDouble(textBox5.Text);
                    }

                    //string url = "http://map.baidu.com/";
                    string url = "http://api.map.baidu.com/marker?location=" + latitude + "," + longitude + "&title=&content=我在这里&output=html";
                    webBrowser1.Navigate(url);

                    break;
                case 2://腾讯
                    if (string.IsNullOrEmpty(textBox3.Text) || string.IsNullOrEmpty(textBox4.Text))
                    {
                        longitude = 112.960235035495;
                        latitude = 28.1661659723607;
                    }
                    else
                    {
                        longitude = Convert.ToDouble(textBox4.Text);
                        latitude = Convert.ToDouble(textBox3.Text);
                    }

                    // string qqMapUrl= "http://map.qq.com/?referer=ts.qq.com&type=ms&lat=" + latitude + "&lng=" +longitude;
                    string qqMapUrl = "http://map.qq.com/";
                    webBrowser1.Navigate(qqMapUrl);

                    break;
            }

        }

7、程序简单界面

在这里插入图片描述

8、完整源代码工程

CSDN 资源下载地址:

https://download.csdn.net/download/zyyujq/89823267

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

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

相关文章

Databend 实现高效实时查询:深入解读 Dictionary 功能

作者&#xff1a;洪文丽 开源之夏2024“支持 External Dictionaries”项目参与者 东北大学软件工程专业云计算方向大二在读&#xff0c;喜欢挑战自我&#xff0c;尝试新鲜事物 背景介绍 在大型系统中&#xff0c;数据通常存储在多个不同的数据源中&#xff0c;例如 PostgreSQL…

【设计模式-职责链】

定义 职责链模式是一种行为设计模式&#xff0c;**它通过将请求发送给链上的多个处理者来避免请求发送者与处理者之间的紧密耦合。每个处理者可以选择处理请求或将其传递给链中的下一个处理者。**这样&#xff0c;可以将处理请求的责任链式组织&#xff0c;从而实现更灵活的请…

LeetCode 面试经典150题 66.加一

题目&#xff1a;给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 思路&#xff1a; 代码&…

winform 中 panel 中添加可视对象错位问题

今天在写程序的时候&#xff0c;发现动态添加到panel_wokrarea中的按钮&#xff0c;同样是posx0&#xff0c;有时并不能对齐&#xff0c;会和当前窗口中panel_wokrarea在屏幕上的显示区域的最左边&#xff08;panel_wokrarea很宽&#xff09; 经分析&#xff0c;是因为panel 在…

828华为云征文 | 华为云Flexus X实例在混合云环境中的应用与实践

目录 前言 1. 混合云环境的优势与挑战 1.1 混合云的优势 1.2 混合云的挑战 2. Flexus X实例的配置与集成 2.1 Flexus X实例简介 2.2 Flexus X实例的混合云部署 2.3 配置步骤与措施 3. 数据迁移与同步策略 3.1 数据迁移方案 3.2 数据同步措施 4. 安全性与合规性管理…

我们用等距投影制作了一个动画视频

一家国际网络安全公司委托我们制作一部关于其网络安全产品的解释性视频。为了有效传达产品的价值给潜在客户和利益相关者&#xff0c;我们决定采用等距投影技术制作动画视频。等距投影是一种复杂的视觉呈现方式&#xff0c;它能够让人物和物体看起来具有三维效果&#xff0c;而…

FileLink跨网文件交换|解决网络隔离导致的文件共享难题

在现代企业的运营中&#xff0c;跨网文件交换已经成为一个重要的需求。然而&#xff0c;网络隔离和安全政策往往使得文件共享变得困难。FileLink作为一种创新的解决方案&#xff0c;旨在有效应对这些挑战&#xff0c;提升文件共享效率。 一、网络隔离的挑战 网络隔离常常是出于…

基于ESP8266—AT指令连接阿里云+MQTT透传数据(2)

MQTT_TX设备为发送数据的Topic&#xff0c;使用MQTT-fx软件实现 MQTT_RX设备为接收(订阅)数据的Topic&#xff0c;使用ESP8266通过AT指令实现 一、使用MQTT-fx实现发送数据 首先进入控制台&#xff0c;获取发送设备 “ MQTT_TX ” 的MQTT连接参数&#xff0c;具体具体操作如…

NineData云原生智能数据管理平台新功能发布|2024年9月版

本月发布 3 项更新&#xff0c;其中重点发布 3 项。 重点发布 数据复制 - 新增 Oracle 到 Kafka 复制链路 数据复制功能新增支持将 Oracle 中的数据复制到 Kafka&#xff0c;实现数据的实时流转和分发&#xff0c;支持全量和增量。 数据复制 - 新增库表分组复制 创建复制任务…

电信杯扬帆起航 灵途科技携手中国地质大学推动产学协同创新

近日&#xff0c;由中国地质大学机械与电子信息学院主办的“电信杯”正式启动。作为该校电子信息领域的一项特色创新赛事&#xff0c;此次活动由中国地质大学电子信息工程研创会主办&#xff0c;武汉灵途传感科技有限公司、中建三局智能技术有限公司和武汉盛帆电子股份有限公司…

手把手教你用Python进行Web抓取(附代码)

本教程以在Fast Track上收集百强公司的数据为例&#xff0c;教你抓取网页信息。 作为一名数据科学家&#xff0c;我在工作中所做的第一件事就是网络数据采集。使用代码从网站收集数据&#xff0c;当时对我来说是一个完全陌生的概念&#xff0c;但它是最合理、最容易获取的数据来…

CAN总线的错误类型

前言 CAN总线的错误类型主要包括&#xff1a;位错误、填充错误、格式错误、ACK错误和CRC错误。这里一定要做好CAN总线的错误类型、错误帧类型、节点状态之间的区别。 错误类型是帧传输出错的原因类型&#xff1b;错误帧类型&#xff08;主动错误帧、被动错误帧&#xff09;是帧…

实习问题(配置文件获取参数)

Java中用SpringBoot框架&#xff0c;当我们要获取配置文件yml里的参数时&#xff0c;用Value注解获取 如果配置文件中没有srvSealUploadPath这个参数的话&#xff0c;可以用Value("${srvSealUploadPath:data/idoc/temp}")&#xff0c;这个的意思是&#xff0c;如果配…

【Python入门】20个Python自动化脚本,解放双手、事半功倍

如果你正在学习Python&#xff0c;那么你需要的话可以&#xff0c;点击这里&#x1f449;Python重磅福利&#xff1a;入门&进阶全套学习资料、电子书、软件包、项目源码等等免费分享&#xff01; 在当今的快节奏工作环境中&#xff0c;自动化不再是一种奢侈&#xff0c;而是…

谷歌浏览器完美清除缓存

1.在页面上按下键盘的F12&#xff0c;打开控制台。 2.鼠标放到刷新图标上&#xff0c;点击鼠标右键&#xff0c;选择‘清空缓存并硬性重新加载’。 这样浏览器对网站页面的缓存就彻底被清理干净了。 目前支持该操作方式的浏览器有谷歌和Edge浏览器。 有的浏览器不支持该方式操…

线上热迁移数据库

1、背景 在线平台用的是公司自己的服务器上面搭建的 MongoDB&#xff0c;测试那边反馈珊瑚海平台 MongoDB 有时会掉线&#xff0c;于是计划将本地数据库迁移到云平台。 2、问题所在 1、因为平台测试的同事还在正在使用平台进行测试工作&#xff0c;所以不可能把平台停掉&…

Web认识 -- 第一课

文章目录 前言一、HTML是什么&#xff1f;二、了解Web1. 基本概念2.Web标准3. Web构成1.前端1. HTML2.CSS3. javaScript4.常见浏览器介绍 2.Web标签构成1.结构标准2.表现标准 -- css3. 行为标准 -- javaScript 总结 前言 这里是我们进入前端学习的开端,在本次更新之后我会陆续…

VUE前后端分离毕业设计题目项目有哪些,VUE程序开发常见毕业论文设计推荐

目录 0 为什么选择Vue.js 1 Vue.js 的主要特点 2 前后端分离毕业设计项目推荐 3 后端推荐 4 总结 0 为什么选择Vue.js 使用Vue.js开发计算机毕业设计是一个很好的选择&#xff0c;因为它不仅具有现代前端框架的所有优点&#xff0c;还能让你专注于构建高性能、高可用性的W…

【C++】map和set的介绍和使用

1.序列式容器与关联式容器 序列式容器&#xff1a; 底层为线性序列的数据结构&#xff0c; 里面存储的是元素本身 。如vector/list/string/deque/forward_list。 关联式容器&#xff1a; 也是用来存储数据的&#xff0c;于序列式容器不同的是&#xff0c; 里面存储的是<key&…

一文详解WebRTC、RTSP、RTMP、SRT

背景 好多开发者&#xff0c;希望对WebRTC、RTSP、RTMP、SRT有个初步的了解&#xff0c;知道什么场景该做怎样的方案选择&#xff0c;本文就四者区别做个大概的介绍。 WebRTC 提到WebRTC&#xff0c;相信好多开发者第一件事想到的就是低延迟&#xff0c;WebRTC&#xff08;W…