离线地图显示
瓦片地图是一种将大地图切割成若干个小的矩形图块(瓦片)的技术,每个瓦片代表地图的一部分,通常具有固定的大小(256x256像素)。瓦片地图技术广泛应用于网络地图和地理信息系统(GIS)中,主要目的是提升地图的加载速度和用户体验,在没有网络的情况下实现定位。
瓦片地图下载
使用离线地图下载工具(管理员身份运行)可以进行瓦片下载。
x、y、z表示了瓦片所位置。
建议最小从3开始,最大到18即可,右侧的是选择图片保存的目录结构:
选择路径后开始下载:
下载完成后再下载路径中按缩放等级保存了瓦片图片:
图片按层级保存,对应关系如下:
坐标计算办法
每个瓦片的像素是256*256像素:
接下来最关键的是了解如何将像素点转换为经纬度坐标点,具体转换算法如下:
#define M_PI 3.14159265358979323846/************************************************************************
限制n在min和max之间
************************************************************************/
double clip(double n, double min, double max)
{n = n<min?min:n;n = n>max?max:n;return n;
}/***********************************************************************
px:x坐标像素点
py:y坐标像素点
level:缩放等级
lon:计算的经度结果
lat:计算的纬度结果
墨卡托投影:y * 2 * M_PI:将归一化的 y 值映射到 [-π, π] 范围。qExp(-y * 2 * M_PI):计算 e 的指数。 Qt数学函数qAtan(...):计算反正切值。 Qt数学函数最后通过 90 - (360 * ... / M_PI) 将结果转换为纬度值
***********************************************************************/
void pixelXYToLonLat(int px, int py, int level, double *lon, double *lat)
{unsigned int size;unsigned int w = 256;size = w << level; // 缩放等级*256double x = (clip(px, 0, size - 1) / size) - 0.5; // px归一到(-0.5~0.5)double y = 0.5 - (clip(py, 0, size - 1) / size); // py归一到(-0.5~0.5)*lon = x * 360;*lat = 90 - (360 * qAtan(qExp(-y * 2 * M_PI)) / M_PI);
}
以这张图为例:
使用高德平台抓取的左上角坐标大致是(104.06,30.67):
抓取的右下角坐标大致是(104.11,30.64):
也就是说这张图大致经度范围是(104.06,104.11),纬度范围大致是(30.67,30.64)。使用如上算法在Qt中验证一下:
可以看到计算结果基本一致,要在图片中标记点位的话就相当于将GPS模块反馈的经纬度按坐标位置换算成像素点后在图片上画点即可。