【Unity】坐标转换经纬度方法(应用篇)
【Unity】坐标转换经纬度方法(应用篇)
解决地图中经纬度坐标转换与unity坐标互转的问题。使用线性变换的方法,理论上可以解决小范围内所以坐标转换的问题。
之前有写过[Unity]坐标转换经纬度方法(原理篇),在实际使用中,由于步骤比较繁琐,基于之前的方法,详细说明使用方法。
案例资源下载地址
一、使用步骤
- 绑定脚本
- 建立控制原点和配准点
- 获得变换二项式
- 坐标互转方法
1.绑定脚本
导入资源包后可以看见一下目录结构

-
Examples下的坐标转换使用是演示demo
-
Transfromation下的是功能脚本
将ChangeMatrixMgr拖入场景中的任意一个GameObject下即可,演示demo中是放在空物体GameManager下。
2.建立控制原点和配准点
(1)建立控制原点
在目录中找到Prefab下的Piont拖入场景中,并摆放到一个比较特殊容易辨别的位置。(控制点尽量放在地图的中间区域)

随便在网上找到一个获取经纬度的网站,用于获取经纬度。
经纬度查询定位 拾取坐标系统
选择影像图,在地图中找到Piont摆放的位置

这里可以得到该点的经纬度。把经纬度填写到Piont下的组件ChangePoint里的LonLatPoint中,X填纬度,Y填经度

将控制原点Piont拖入ChangeMatrixMgr中的OriginPoint下(红框放入控制点)

(2)建立配准点
配准点的建立和控制点一样,建立后放如GruberPoints数值中。
注意:配准点至少建立两个
3.获得变换二项式
配准点和控制原点建立好后,便可以创建变换的二项式
读取配准点对应的经纬度坐标和本地坐标到数组
List<DoubleVector2> LonLatPoints;//经纬度坐标点数组List<DoubleVector2> LocalPoints;//本地坐标点数组
void ExtractionCoordinate(){LonLatPoints = new List<DoubleVector2>();LocalPoints = new List<DoubleVector2>();int length = GruberPoints.Length;for (int i = 0; i < length; i++){LonLatPoints.Add(GruberPoints[i].LonLatPoint - OriginPoint.LonLatPoint);LocalPoints.Add(GruberPoints[i].LocalPoint - OriginPoint.LocalPoint);}}
创建二项式
public DoubleVector4 ToLonLatMatrix;//转经纬度二项式public DoubleVector4 ToLocalMatrix;//转本地坐标二项式void CreateMatrix(){ExtractionCoordinate();changeMatrixUtil = new ChangeMatrixUtil(LonLatPoints, LocalPoints, errorValue);ToLonLatMatrix = changeMatrixUtil.ToLonLatMatrix;ToLocalMatrix = changeMatrixUtil.ToLocalMatrix;}
二项式的值只需要创建一次,后面可以复用。
可以单独复制赋值,赋值后可以移除配准点,上面的ExtractionCoordinate和CreateMatrix两个方法可以不调用。
二项式只要有值,重新运行也不影响。
4.坐标互转方法
/// <summary>/// 变换坐标/// </summary>/// <param name="Vector">要转换的坐标</param>/// <param name="ChangeMatrix">变换行列式</param>/// <param name="BZero">变换后原点坐标</param>/// <param name="FZero">要转换的原点坐标</param>/// <returns></returns>public static DoubleVector2 GetChangeVector(DoubleVector2 Vector, DoubleVector4 ChangeMatrix, DoubleVector2 BZero, DoubleVector2 FZero)
demo
DoubleVector2 lonLatPoint= DoubleVector2.GetChangeVector(test.LocalPoint, ToLonLatMatrix, OriginPoint.LonLatPoint, OriginPoint.LocalPoint);
经纬度转本地
第一个参数传入经纬度坐标;
第二个参数传入转本地坐标的二项式;
第三个参数传入本地坐标的控制原点;
第四个参数传入经纬度坐标控制原点
本地转经纬度
第一个参数传入本地坐标;
第二个参数传入转经纬度坐标的二项式;
第三个参数传入经纬度坐标控制原点;
第四个参数传入本地坐标的控制原点
二、扩展
1.产生误差的原因
地球是不规则的球体,将球体投影到平面上是不能正交投影的,必然出现位置的偏移,投影方式的不同就会产生不同的坐标系,比如WGS84,GCJ-02等,同样的经纬度在不同的坐标系下位置是不一样的,而且差距很大。
2.报NaN计算出错的原因
当配准点过多时,配准点的位置和出现错误,或者配准点的坐标系不一致,会导致二项式无法求出。
解决方法:
- 减少配准点数量
- 修改ChangeMatrixMgr下的ErrorValue参数
- 检查配准点
置是不一样的,而且差距很大。
2.报NaN计算出错的原因
当配准点过多时,配准点的位置和出现错误,或者配准点的坐标系不一致,会导致二项式无法求出。
解决方法:
- 减少配准点数量
- 修改ChangeMatrixMgr下的ErrorValue参数
- 检查配准点
相关文章:
【Unity】坐标转换经纬度方法(应用篇)
【Unity】坐标转换经纬度方法(应用篇) 解决地图中经纬度坐标转换与unity坐标互转的问题。使用线性变换的方法,理论上可以解决小范围内所以坐标转换的问题。 之前有写过[Unity]坐标转换经纬度方法(原理篇),在实际使用中,…...
element时间选择器el-date-picter使用disabledDate指定禁用的日期
需要的效果 <el-date-pickerclass"selectstyle"v-model"year"value-format"yyyy"type"year":picker-options"disabledCli"placeholder"选择年"> </el-date-picker>data() {return {disabledCli: {/…...
出学校干了 5 年外包,已经废了
如果不是女朋友和我提分手,我估计现在还没醒悟 本科大专,17年通过校招进入某软件公司做测试,干了接近5年的功能。 今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经…...
day-23 代码随想录算法训练营(19)part09
669.修剪二叉搜索树 思路一:根据二叉搜索树的特性进行中间值与去区间值判断,有三种情况:1.在区间中,所以左右子树都可能在区间中; 2.在区间外面的左侧,必然只有右子树可能存在区间中;3.在区间外…...
JVM编译优化
即时编译器 HotSpot虚拟机中内置了两个即时编译器,分别称为Client Compiler和Server Compiler,或者简称为C1编译器和C2编译器。Java8默认开启Server模式。用户可以使用“-client”或“-server”参数去指定编译模式。 C1编译器启动速度快,关注局部简单可靠的优化,比如方法…...
vue浏览器插件安装-各种问题
方法1:vue.js devtolls插件下载 https://blog.csdn.net/qq_55640378/article/details/131553642 下载地址: Tags vuejs/devtools GitHub npm install 或是 cnpm install 遇到的报错 设置淘宝镜像源(推荐使用nrm,这一步是为…...
maven工具-maven的使用-镜像仓库、本地仓、IDEA使用maven
Maven 一、为什么使用maven 添加第三方jar包jar包之间的依赖关系处理jar包之间的冲突获取第三方jar包将项目拆分成多个工程模块实现项目的分布式部署 二、maven简介 Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的…...
Mac鼠标增强工具Smooze Pro
Smooze Pro是一款Mac上的鼠标手势增强工具,可以让用户使用鼠标手势来控制应用程序和系统功能。 它支持多种手势操作,包括单指、双指、三指和四指手势,并且可以自定义每种手势的功能。例如,您可以使用单指向下滑动手势来启动Expos视…...
数据结构-单链表(C语言简单实现)
简介 以顺序结构进行数据存储时,它的特点就是可以用一组任意的存储单元存储数据元素,这组存储单元可以是连续的,也可以是不连续的,这些数据可以存在内存未被占用的任意位置。它也是有缺点的,就是在插入和删除时需要移…...
.netcore grpc身份验证和授权
一、鉴权和授权(grpc专栏结束后会开启鉴权授权专栏欢迎大家关注) 权限认证这里使用IdentityServer4配合JWT进行认证通过AddAuthentication和AddAuthorization方法进行鉴权授权注入;通过UseAuthentication和UseAuthorization启用鉴权授权增加…...
分布式 - 服务器Nginx:一小时入门系列之负载均衡
文章目录 1. 负载均衡2. 负载均衡策略1. 轮询策略2. 最小连接策略3. IP 哈希策略4. 哈希策略5. 加权轮询策略 1. 负载均衡 跨多个应用程序实例的负载平衡是一种常用技术,用于优化资源利用率、最大化吞吐量、减少延迟和确保容错配置。使用 nginx 作为非常有效的HT…...
Linux学习之基本指令二
-----紧接上文 在了解cat指令之前,我们首先要了解到Linux下一切皆文件,在学习c语言时我们就已经了解到了 对文件输入以及读入的操作(向显示器打印,从键盘读取数据),对于Linux下文件的操作,也是…...
神经网络基础-神经网络补充概念-41-梯度的数值逼近
概念 梯度的数值逼近是一种用于验证梯度计算正确性的方法,它通过近似计算梯度来与解析计算的梯度进行比较。虽然数值逼近在实际训练中不常用,但它可以用来检查手动或自动求导的实现是否正确。 代码实现 import numpy as np# 定义函数 f(x) x^2 def f…...
tornado在模板中遍历二维数组
要在Tornado模板中遍历一个二维数组,你可以使用Tornado的模板语法来实现迭代和显示数组中的每个元素。 以下是一个示例,演示如何在Tornado模板中遍历和显示二维数组的内容: template.html: <!DOCTYPE html> <html> <head&g…...
前端-初始化Vue3+TypeScript
如果使用如下命令初始化项目,项目很干净,很适合了解项目的各个结构。 npm init vitelatest如果使用如下命令初始化项目,是可以选择你需要的组件 npm init vuelatest...
龙蜥社区安全联盟(OASA)正式成立,启明星辰、绿盟、360 等 23 家厂商重磅加入
7 月 28 日,由启明星辰、绿盟、360、阿里云、统信软件、浪潮信息、中兴通讯|中兴新支点、Intel、中科院软件所等 23 家单位共同发起的龙蜥社区安全联盟(OASA,OpenAnolisSecurityAlliance)(以下简称“安全联…...
Flask-SQLAlchemy
认识Flask-SQLAlchemy Flask-SQLAlchemy 是一个为 Flask 应用增加 SQLAlchemy 支持的扩展。它致力于简化在 Flask 中 SQLAlchemy 的使用。SQLAlchemy 是目前python中最强大的 ORM框架, 功能全面, 使用简单。 ORM优缺点 优点 有语法提示, 省去自己拼写SQL,保证SQL…...
大数据bug-sqoop(二:sqoop同步mysql数据到hive进行字段限制。)
一:sqoop脚本解析。 #!/bin/sh mysqlHost$1 mysqlUserName$2 mysqlUserPass$3 mysqlDbName$4 sql$5 split$6 target$7 hiveDbName$8 hiveTbName$9 partFieldName${10} inputDate${11}echo ${mysqlHost} echo ${mysqlUserName} echo ${mysqlUserPass} ec…...
Windows小记
一、域控制器升级的先决条件验证失败。 新建域时,本地 Administrator 帐户将成为域 Administrator 帐户。无法新建域,因为本地 Administrator 帐户密码不符合要求。 目前,本地 Administrator 帐户不需要密码。我们建议你使用网络用户命令行工…...
centos安装elasticsearch7.9
安装es 下载elasticsearch安装包解压安装包,并修改配置文件解压进入目录修改配置文件 添加用户,并修改所有者切换用户,运行es如何迁移旧版本的数据 下载elasticsearch安装包 下载地址如下,版本号可以替换成自己想要的。 这里需要注意一点&am…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
