近期遇到实际的开发需求,对实际获取到的经纬度信息进行映射,但是实际的需求就只是针对局部的坐标进行映射,比如北京市一个城市范围的坐标,所以根本不需要全局的经纬度设定,最后裁定的方案是对经纬度坐标进行一个比值转换的计算处理。
实现的步骤大值分为三步:
1、经纬度的坐标区域划分:
如果只是一个区域的经纬度信息,就直接选取到整个区域的经纬度信息,比如福建省的经纬度信息,这里我选取的经纬度信息是左上角(114.4,28.6)、左下角(114.4,23.2)、右上角(121.57,28.6)、右下角(121.57,23.2)四个顶点,四个顶点划分成一个区域。
2、经纬度信息比值获取
经纬度划分出之后进行经纬度的比值计算,计算的流程步骤为,将获取到的经纬度信息按原点为0的方式做比值的转换,以上述获取的划分的经纬度区间信息为例,假如此刻需要定位的地点的经纬度为(118,25),实际的经纬度比值转换为x轴比值:比值 = (118 - 左上角顶点经度) / (右下角经度 - 左下角 经度),y轴比值:比值 = (25 - 左下角纬度) / (右下角经度 - 左下角纬度)。得出比值之后再针对Unity内的坐标系做比值的运算得到Unity内的世界或者局部坐标系坐标。
3、经纬度比值与Unity坐标的转换
转换的计算公式和获取比值时一样,首先创建四个空物体,将空物体布置在Unity中需要进行经纬度定位区域的四个边界顶点上,即左上角,左下角,右上角,右下角四个位置,此时转化后的横纵坐标为:x坐标 = (右下角空物体x坐标 - 左下角空物体x坐标) * x轴比值 + 左下角空物体x坐标,y坐标 = (左上角空物体y坐标 - 左下角空物体y坐标) * y轴比值 + 左下角空物体y坐标。得到的坐标就是Unity内进行映射的坐标位置,如果是3D的场景空间,可先将旋转角度和Z坐标缓存记录,然后归零,设置完横纵坐标后再重新赋值。核心逻辑代码如下。
private Vector2 GetPos(float x, float y,float z)
{
//108.92,34.42/ 108.92,18.5/ 125.5,34.42/ 125.5,18.5
//计算公式
//以左下角为坐标原点(org)
//--- tarX(目标位置x坐标)
//--- tarY(目标位置y坐标)
//--- orgX(坐标原点X坐标)
//--- orgY(目标位置y坐标)
//--- maxY(边界点y)
//--- maxX(边界点x)
//(tarX - orgX) /(maxX - orgX)--- 映射后x轴的坐标比例
//(tarY - orgY) /(maxY - orgY)--- 映射后y轴的坐标比例
//tar_pos为顶点空物体的缓存数组
Vector3 pos = Vector3.one;
float rateX = (x - left_bottom.x) / (right_bottom.x - left_bottom.x);
float rateY = (y - left_bottom.y) / (left_top.y - left_bottom.y);
pos.x = (tar_pos[2].position.x - tar_pos[0].position.x) * rateX + tar_pos[0].position.x;
pos.y = (tar_pos[1].position.y - tar_pos[0].position.y) * rateY + tar_pos[0].position.y;
pos.z = z;
return pos;
}
实际效果如下,将获取的到经纬度点转化后通过实例化预设展示出转化后的点,因为选取经纬度时数据会有偏差,实际点的位置会有轻微的偏移,不过点的位置基本是准确的。