无人机海图调用
年前工作最后一天,把之前整过的一些东西总结一下!
通常情况下无人机地面站都是调用Google地图、百度地图、高德地图等等,这种地图在陆地上的精度可以接受,地物描述也比较详细,但海上部分就稀疏的多啦,无人机如果采用这些地图在海上飞行,是不太可能的。
无人机地面站海图调用:通过先有地图显示功能,设置相关地图切换按钮,海上飞行切换为海图;
需要配置:海图服务器,如想离线操作还需在地面站上进行配置;
算法:无人机常规的地面站地图和海图在投影方面都是应用墨卡托投影,但所采用的坐标系统不同,例如谷歌为EPSG:900913,而海图则是采用EPSG:3395,关于坐标系统在此就不多做介绍,不是一句两句可以说清楚的,后续有时间可以写点相关原理的文章。
一、海图调用说明:
1、海图瓦片:
海图范围:、经度在[-180,180],纬度在 [-80, 80]
海图图片大小:256*256
图片格式:png[无损、透明]
2、瓦片调用
1)将WGS84经纬度转换EPSG3395投影(简称3395),在通过3395投影坐标计算瓦片坐标(海图瓦片投影采用3395投影坐标系)。
2)瓦片的显示:
横轴:X(右侧为正方向)
纵轴:Y(下为正方向)
瓦片所在的层数:Z(海图瓦片支持1~17层)
瓦片相关资料可以参考:http://blog.csdn.net/youngkingyj/article/details/23365849
3)瓦片调用地址:
URL地址:
"http://localhost:9999/landsea/tile/TMS/getTile/cmap/full/s_z/s_x/s_y.png";
s_z,s_x,s_y为瓦片坐标
4)瓦片转换为经纬度
瓦片坐标计算的经纬度是左上角点的经纬度,可以根据这个规律计算瓦片的四个角点的经纬度(如果需要计算的话)。
二、坐标转换算法
1. 算法介绍
墨卡托范围:
public static double XMIN = -20037508.34;//20026376.39;20037508.34278925
private static double XMAX = 20037508.34;
public static double XLength = XMAX - XMIN;
public static double YMIN = -15496570.74;// -15496570.74;
private static double YMAX = 18764656.23; //15496570.74;// //
public static double YLength = YMAX - YMIN;
输入经纬度坐标(lon,lat)层数z
首先将经纬度转墨卡托坐标,设为(x,y)。
***********这里要用EPSG:4326转EPSG:3395。为了准确用pro4j来做*************
stepLength=Xrange/pow(2,z)
i=( x-Mxmin)/ stepLength 解释:x-Mxmin是计算点距离左边界的墨卡托距离。
这里细说一下i的处理当整除的时候不用处理,不整除的时候要取上整,如0.1,0.99都取1.那么x方向瓦片编号就是i-1。
接下来我们再来算y方向瓦片编号
j=(y-Mymin)/ stepLength (stepLength就是上面的)j的处理和上面i的处理一样
同样的y方向瓦片编号就是j-1。
至此经纬度坐标所在外片编号已经算出来(i-1,j-1)
接下来我们算点在瓦片内哪个像素点上
Xremainder=x%stepLength (模运算)
设x方向像素点坐标为Xpixel
stepLength/256= Xremainder/Xpixel
解方程可得Xpixel值
Y方向也是类似的,注意stepLength使用之前用的那个值。
其实基本思路就是,墨卡托坐标和屏幕坐标是成比例的。只要转化成墨卡托坐标,然后就能知道像素坐标。还有瓦片切割的规则是,在墨卡托坐标系内,将x方向平分成pow(2,z)份,这也是上面stepLength一直用x算的原因。之后让y和x相等,切到最后y会不够整个瓦片,使用透明色补齐。这里的规则和google切瓦片的规则类似。区别就是我们的上下边界是80,-80,谷歌的不是,所以你直接用谷歌的算法能把瓦片拼起来,但是往上画点就全部是错的。
2. Demo实现
坐标转换:
TransformTileWorld 类
lonLatToMercator经纬度转投影(4326为WGS84坐标)
MercatorTolonLat投影转经纬度
CalculationNum经纬度计算瓦片坐标
CalculationLon瓦片坐标计算经纬度
SridReader类
提取SRid.csv中的参数。
海图显示
ReadWMSMap2函数
此处注意海图显示位置排列。
UdpReciveThread为接收无人机数据,并在海图相应位置显示。
详见最新DEMO。
注释:本文中采用的是projNet进行不同系统间坐标的转换。
后边会介绍算法和相关源码