解决地图中经纬度坐标转换与unity坐标互转的问题。使用线性变换的方法,理论上可以解决小范围内所以坐标转换的问题。
之前有写过[Unity]坐标转换经纬度方法(原理篇),在实际使用中,由于步骤比较繁琐,基于之前的方法,详细说明使用方法。
案例资源下载地址
导入资源包后可以看见一下目录结构
Examples下的坐标转换使用是演示demo
Transfromation下的是功能脚本
将ChangeMatrixMgr拖入场景中的任意一个GameObject下即可,演示demo中是放在空物体GameManager下。
(1)建立控制原点
在目录中找到Prefab下的Piont拖入场景中,并摆放到一个比较特殊容易辨别的位置。(控制点尽量放在地图的中间区域)
随便在网上找到一个获取经纬度的网站,用于获取经纬度。
经纬度查询定位 拾取坐标系统
选择影像图,在地图中找到Piont摆放的位置
这里可以得到该点的经纬度。把经纬度填写到Piont下的组件ChangePoint里的LonLatPoint中,X填纬度,Y填经度
将控制原点Piont拖入ChangeMatrixMgr中的OriginPoint下(红框放入控制点)
(2)建立配准点
配准点的建立和控制点一样,建立后放如GruberPoints数值中。
注意:配准点至少建立两个
配准点和控制原点建立好后,便可以创建变换的二项式
读取配准点对应的经纬度坐标和本地坐标到数组
List LonLatPoints;//经纬度坐标点数组
List LocalPoints;//本地坐标点数组
void ExtractionCoordinate()
{
LonLatPoints = new List();
LocalPoints = new List();
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两个方法可以不调用。
二项式只要有值,重新运行也不影响。
///
/// 变换坐标
///
/// 要转换的坐标
/// 变换行列式
/// 变换后原点坐标
/// 要转换的原点坐标
///
public static DoubleVector2 GetChangeVector(DoubleVector2 Vector, DoubleVector4 ChangeMatrix, DoubleVector2 BZero, DoubleVector2 FZero)
demo
DoubleVector2 lonLatPoint= DoubleVector2.GetChangeVector(test.LocalPoint, ToLonLatMatrix, OriginPoint.LonLatPoint, OriginPoint.LocalPoint);
经纬度转本地
第一个参数传入经纬度坐标;
第二个参数传入转本地坐标的二项式;
第三个参数传入本地坐标的控制原点;
第四个参数传入经纬度坐标控制原点
本地转经纬度
第一个参数传入本地坐标;
第二个参数传入转经纬度坐标的二项式;
第三个参数传入经纬度坐标控制原点;
第四个参数传入本地坐标的控制原点
地球是不规则的球体,将球体投影到平面上是不能正交投影的,必然出现变形导致位置的偏移,投影方式的不同就会产生不同的投影坐标系,比如高斯投影、墨卡托投影、UTM投影 等平面坐标系。
我们获取的也有可能是大地坐标系的经纬度坐标(比如 WGS_84、西安80、GCJ-02),大地坐标系是抽象的空间坐标系,由于参考的椭球不同,同样的经纬度在不同的大地坐标系下位置也是不一样的,而且差距很大。
如果我们是基于大地坐标系进行配准的,由于我们的场景是平面的,二大地坐标系的立体的,造成随着范围距离的变大,误差就会随之变大。
当配准点过多时,配准点的位置和出现错误,或者配准点的坐标系不一致,会导致二项式无法求出。
解决方法: