Qt电子地图叠加海图/全世界海图叠加到天地图图层/1-18级海图实时查看

发布时间:2026/6/30 16:21:15

Qt电子地图叠加海图/全世界海图叠加到天地图图层/1-18级海图实时查看 一、前言说明之前已经花了巨大的精力把纯qwidget采用painter绘制的电子地图控件写完已经支持了多级图层叠加最上层一般是图形绘制层可以绘制折线、多边形、矩形、圆形等覆盖物底图一般是瓦片电子地图可以是天地图高德地图等前几年就已经有不少人问过是否支持海图近期有空刚好可以把这块研究起来核心关键就是要拿到海图的瓦片地址最好是在线的类似天地图这样的最好是免费的百度地图吃相就很难看现在估计绝大部分人都转移到天地图上面来了不仅标准的gps坐标系而且卫星图还支持到18级既免费又真香瓦片下载下来后还可以离线使用。为了支持在线海图的瓦片之前的电子地图控件做了一些改动比如需要支持经纬度投影之前默认按照默卡托投影来的而不少厂商提供的是经纬度投影现在需要改成每个控件对象都能设置投影系类型。经过测试发现还需要支持512像素的瓦片之前默认按照256像素的瓦片实现的因为市面上绝大部分的都是256像素的而目前找的海图的瓦片很可能是512像素的。经过不断的重组和调整重构目前已经能够支持默认在天地图上叠加海图当然也支持任意地图作为底图而且支持任意多个底图比如最底层是矢量底图、然后是海图、最上层是矢量标记图也可以叫路网图这样才是最完整的叠加顺序。二、效果图三、相关代码#includemapadapter.h#includemapprojection.h#includetilehelper.hMapAdapter::MapAdapter(intmin_zoom,intmax_zoom,QObject*parent):QObject(parent),m_min_zoom(min_zoom),m_max_zoom(max_zoom){}MapAdapter::~MapAdapter(){}QStringMapAdapter::url()const{returnm_url;}voidMapAdapter::setUrl(constQStringurl){m_urlurl;m_ids.clear();this-replaceKey(m_url,true);this-replaceId(m_url,m_ids);}QStringListMapAdapter::ids()const{returnm_ids;}voidMapAdapter::setIds(constQStringListids){m_idsids;}boolMapAdapter::isTileValid(intx,inty,intz)const{intzoomz;boolsuccessfalse;if(m_min_zoomm_max_zoom(zoomm_min_zoom||zoomm_max_zoom)){}elseif(m_min_zoomm_max_zoom(zoomm_max_zoom||zoomm_min_zoom)){}elseif(x0xMapProjection::tileX(z)y0yMapProjection::tileY(z)){successtrue;}returnsuccess;}QUrlMapAdapter::tileQuery(intx,inty,intz)const{QString urlm_url;//替换特殊地址this-replaceUrl(url,z);//替换地图秘钥this-replaceKey(url,false);//替换主机编号intsizem_ids.size();if(size0url.contains({n})){url.replace({n},m_ids.at(rand()%size));}//反转TMS坐标系if(url.contains({-y})){y(1z)-1-y;url.replace({-y},{y});}//替换微软地图if(url.contains({x}{y}{z})){QString xyzthis-xyzToQuadKey(x,y,z);url.replace({x}{y}{z},xyz);}//替换腾讯地图//这种地址需要替换xy http://p0.map.gtimg.com/sateTiles/z/x/y/x_y.png//这种地址只需要替换y http://rt0.map.gtimg.com/tile?styleid1z10x861y417if(url.contains(map.gtimg.com)){y(1z)-1-y;if(url.contains({x}_{y})){url.replace({x/16},QString::number(x/16));url.replace({y/16},QString::number(y/16));}}//替换瓦片地址url.replace({x},QString::number(x));url.replace({y},QString::number(y));url.replace({z},QString::number(z));returnQUrl(url);}voidMapAdapter::replaceUrl(QStringurl,intzoom){if(url.contains(onechart.cn)){if(zoom10){url.replace(WMTS_1_18,WMTS_globe_1_10);}else{url.replace(WMTS_globe_1_10,WMTS_1_18);}}}voidMapAdapter::replaceKey(QStringurl,boolreplace){//如果只有一个秘钥则直接替换掉占位符if(url.contains({key})){QStringList keys;if(url.contains(tianditu.gov.cn)){keysTileHelper::tianKeys;}intsizekeys.size();if(size0){QString keykeys.at(rand()%size);if(!replace||size1){url.replace({key},key);}}}}voidMapAdapter::replaceId(QStringurl,QStringListids){//如果带了指定主机编号的范围/先取出来/{n-0-5-n}/处理后恢复占位符intindex1url.indexOf({n-);intindex2url.indexOf(-n});if(index10index20){QString rangeurl.mid(index13,index2-index1-3);if(range.contains(-)){QChar minrange.at(0);QChar maxrange.at(2);for(QChar cmin;cmax;cQChar(c.unicode()1)){idsQString(c);}url.replace(QString({n-%1-n}).arg(range),{n});}}}QStringMapAdapter::xyzToQuadKey(intx,inty,intz){QString quadKey;for(intiz;i0;i--){chardigit0;intmask1(i-1);if((xmask)!0){if((ymask)!0){digit3;}else{digit1;}}else{if((ymask)!0){digit2;}else{digit0;}}quadKey.append(digit);}returnquadKey;}四、相关地址国内站点https://gitee.com/feiyangqingyun国际站点https://github.com/feiyangqingyun个人作品https://blog.csdn.net/feiyangqingyun/article/details/97565652文件地址https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码o05q 文件名bin_mapwidget.zip五、功能特点支持各种地图源包括天地图、高德地图、腾讯地图、谷歌地图、微软地图等。标准WGS-84地球坐标系采用默卡托投影可以拓展其他坐标系和投影规则。支持在线和离线两种场景需求可以自定义在线瓦片地址格式和离线瓦片地址格式。多线程下载和加载瓦片图片文件多线程绘制自动缓存瓦片文件。在线模式下可以开启是否缓存文件指定缓存路径将下载的瓦片文件存放到本地默认优先从缓存文件查找如果存在缓存文件则加载缓存文件不存在则联网下载。可以拖动地图鼠标滚轮放大和缩小地图以鼠标所在位置作为缩放中心点提供缩放控件手动单击进行操作。多图层机制支持多个瓦片叠加图层和图形绘制图层全部采用双缓冲技术所有的图形和瓦片全部绘制到一个图片文件上最终再将图片文件绘制到地图控件。不可见区域的图层包括覆盖物不会触发绘制降低CPU占用。预加载机制默认绘制的图层大小以当前区域往四周放大两倍这样在鼠标拖动和缩放的时候不会看到明显的加载过程体验更佳。内置了多种图形覆盖物包括坐标点、文本、标注点、折线、多边形、矩形、圆形等可以设置边框颜色粗细、填充颜色和透明度等参数。标注点支持旋转角度和提示文本其中提示文本可以设置在标注点的相对位置标注点图片支持gif动图可以动态切换静态图和动图。标注点和提示文本可以设置相对位置位置包括左侧、右侧、上侧、下侧、中间、左上角、右上角、左下角、右下角。标注点默认按照底部居中对齐一般圆形图标可以设置中心点对齐。标注点提示文本可设置背景颜色透明度、颜色边框和粗细支持换行和多行文字。所有的图形可以动态更新前景色、颜色粗细、背景颜色、颜色透明度等。支持删除单个图形、删除一种类型的图形、删除所有图形、隐藏单个或者所有图形等。支持动态绘制各种图形开启后直接在地图上鼠标按下绘制鼠标右键结束绘制非常方便快捷。在对应图形区域鼠标按下发出图形单击信号精准识别单击区域比如折线以鼠标在折线条上作为判断依据多边形区域以鼠标在整个多边形区域内为准而不是以矩形区域包括圆形也是以圆形内部为准。可以动态启动禁用比例尺、十字线、缩放控件、地图拖曳、键盘操作、滚轮缩放、双击放大、鼠标追踪等特性。可以任意指定经纬度区域进行瓦片拼接保存成图片文件也可以直接对整个可视区域或者缓存区域的地图图片文件保存。支持任意多边形轮廓保存成图片比如某个行政区的瓦片保存。图形可以动态设置zindex层叠顺序值越大越显示在前面内部维护着一个zindex表默认按照添加的先后顺序增加后面添加的显示在前面主动设置后按照设置的zindex来绘制。支持将QWidget对象作为覆盖物添加到地图控件中跟随地图移动位置极大提高灵活性比如可以将自定义控件直接作为地图控件的子对象加入进去。内置MarkerMove轨迹移动类支持历史轨迹数据回放和实时轨迹移动可设置图标、轨迹线的颜色和粗细、移动速度、移动间隔、平滑移动等支持多条轨迹线条同时移动。内置MarkerLine航迹规划类支持动态添加航迹点显示对应箭头可以动态拖曳调整航迹点的位置选中点高亮显示。大量使用按需绘制机制包括内部提供合理的默认值来触发绘制也可以手动传入参数指定是否需要立即绘制比如删除了某个覆盖物有些频繁的操作可以不指定立即绘制等操作完成后再统一一起绘制效率更高。默认开启缓存瓦片机制所有加载过的瓦片文件都存储在内存中下次再次绘制直接从内存取出来绘制既不需要从联网获取也不需要从缓存文件获取直接内存取出来绘制响应迅速效率最高体验最佳。支持批量添加覆盖物比如几万个标注点和圆形都是瞬间完成绘制相比web网页的方式性能提升百倍以上。支持街道图、卫星图、混合图、路网图等各种图层可以任意叠加N个图层甚至杂交不同地图厂家的瓦片文件。纯QWidget绘制非qml也非web不依赖qml或者浏览器控件支持极低性能的嵌入式环境。原创轻量级5000行代码架构漂亮注释详细拓展方便容易学习适合各种初学者和进阶者方便二次开发。支持任意Qt版本、任意系统、任意编译器包括嵌入式linux和各种国产电脑环境。古法编程不含任何AI代码品质保证。

相关新闻