Qt加载天地图离线api开发包/从官网趴地图js代码/费了九牛二虎之力终于搞定

news/2024/11/15 21:43:19/文章来源:https://www.cnblogs.com/feiyangqingyun/p/18417417

一、前言说明

网上关于如何趴天地图离线api文件的文章,只有少量的两三篇,而且几乎没有说全和说对,搞得评论也是一片懵逼,这里不行那你不行,思路可以借鉴就是。索性花了点时间,自己研究了如何从官网一步步趴下来js文件,最终所有离线能使用的功能全部搞定,也根本不会有http等访问的情况出现,彻底离线断网使用,加载本地瓦片速度超奇的快。

为啥要天地图离线?百度离线不可以吗?而且网上几乎流传的都是百度地图的离线开发包,有2.0和3.0版本的,但是里面其实也不全,还有不少http访问的代码没有去除。而且百度地图并不是国家标准坐标系火星坐标系,使用很多设备对接的时候,很不好处理,每次都需要经过坐标转换,而天地图使用的大地坐标系,和国际的地球坐标系几乎没有偏差,据说偏差在0.6m,这个相当于可以忽略了,民用级别完全是够了。本人亲自用手机开启走路轨迹,导出GPS坐标点,经常轨迹点回放测试,在天地图上验证几乎一致。

离线开发包制作说明:

  1. 下载地图核心文件 http://api.tianditu.gov.cn/api?v=4.0&tk=您的密钥 ,核心文件必须下载。
  2. 下载地图部件文件 http://api.tianditu.gov.cn/v4.0/components.js ,部件文件必须下载。
  3. 下载地图样式文件 http://api.tianditu.gov.cn/v4.0/css/tianditu4.0.css 。地图样式文件必须下载。
  4. 下载高级绘图文件 http://api.tianditu.gov.cn/v4.0/military.js 。非必须,一般用不上。
  5. 下载服务请求文件 http://api.tianditu.gov.cn/v4.0/service.js 。非必须,用于发送网络请求获取逆地址解析、路径规划查询等,既然都离线了,也用不了。
  6. 打开js文件和css文件,依次下载对应的图片,可以通过搜索 .png 查找对应的图片。
  7. 打开核心js文件搜索 T.DomainFun(),将下面的路径改成本地的。
E: "./",
e: "./image",
//E: T.Protocol.value + "api.tianditu." + T.Domain,
//e: T.Protocol.value + "api.tianditu." + T.Domain + "/v4.0/image",
  1. 在路径这个位置下面是各种瓦片地址的在线地址,代码都是 return T.Protocol.value... ,这里可以不用改,直接在最终调用的地方更改更妥。
  2. 最关键部分,将核心文件中的加载网络瓦片文件改成本地的,搜索 getTileUrl = function ,对应的函数就是返回的瓦片地址,里面总共定义了三种地图的瓦片,每一种地图都包含一个底图和一个叠加层。
var i = new T.TileLayer("", {minZoom: 1,maxZoom: 18
});
i.getTileUrl = function(t) {return "tiles_vec_w/" + t.z + "/" + t.x + "/" + t.y + ".png"//return 0 == T.gq.EW ? T.w.t() + "TILECOL=" + t.x + "&TILEROW=" + t.y + "&TILEMATRIX=" + t.z : T.w.r() + "TILECOL=" + t.x + "&TILEROW=" + t.y + "&TILEMATRIX=" + t.z
};
var n = new T.TileLayer("", {minZoom: 1,maxZoom: 18
});
n.getTileUrl = function(t) {return "tiles_cva_w/" + t.z + "/" + t.x + "/" + t.y + ".png"//return 0 == T.gq.EW ? T.w.Y() + "TILECOL=" + t.x + "&TILEROW=" + t.y + "&TILEMATRIX=" + t.z : T.w.T() + "TILECOL=" + t.x + "&TILEROW=" + t.y + "&TILEMATRIX=" + t.z
},
TMAP_NORMAL_MAP = new T.MapType([i, n], "TMAP_NORMAL_MAP", {a: 1
});
var e = new T.TileLayer("", {minZoom: 1,maxZoom: 18
});
e.getTileUrl = function(t) {return "tiles_img_w/" + t.z + "/" + t.x + "/" + t.y + ".jpg"//return 0 == T.gq.EW ? T.w.I() + "TILECOL=" + t.x + "&TILEROW=" + t.y + "&TILEMATRIX=" + t.z : T.w.U() + "TILECOL=" + t.x + "&TILEROW=" + t.y + "&TILEMATRIX=" + t.z
};
var o = new T.TileLayer("", {minZoom: 1,maxZoom: 18
});
o.getTileUrl = function(t) {return "tiles_cia_w/" + t.z + "/" + t.x + "/" + t.y + ".png"//return 0 == T.gq.EW ? T.w.i() + "TILECOL=" + t.x + "&TILEROW=" + t.y + "&TILEMATRIX=" + t.z : T.w.u() + "TILECOL=" + t.x + "&TILEROW=" + t.y + "&TILEMATRIX=" + t.z
},
TMAP_SATELLITE_MAP = new T.MapType([e], "TMAP_SATELLITE_MAP"),
TMAP_HYBRID_MAP = new T.MapType([e, o], "TMAP_HYBRID_MAP");
var s = new T.TileLayer("", {minZoom: 1,maxZoom: 18
});
s.getTileUrl = function(t) {return "tiles_ter_w/" + t.z + "/" + t.x + "/" + t.y + ".jpg"//return 0 == T.gq.EW ? T.w.P() + "TILECOL=" + t.x + "&TILEROW=" + t.y + "&TILEMATRIX=" + t.z : T.w.O() + "TILECOL=" + t.x + "&TILEROW=" + t.y + "&TILEMATRIX=" + t.z
};
var r = new T.TileLayer("", {minZoom: 1,maxZoom: 18
});
r.getTileUrl = function(t) {return "tiles_cta_w/" + t.z + "/" + t.x + "/" + t.y + ".png"//return 0 == T.gq.EW ? T.w.p() + "TILECOL=" + t.x + "&TILEROW=" + t.y + "&TILEMATRIX=" + t.z : T.w.o() + "TILECOL=" + t.x + "&TILEROW=" + t.y + "&TILEMATRIX=" + t.z
},
TMAP_TERRAIN_MAP = new T.MapType([s], "TMAP_TERRAIN_MAP"),
TMAP_TERRAIN_HYBRID_MAP = new T.MapType([s, r], "TMAP_TERRAIN_HYBRID_MAP")
  1. 核心文件拉到末尾,注释三行代码,这三行用来网络请求获取子js文件和css样式等。不注释可能导致其他的问题。
//for (var n = 0; n < T.w.a.length; n++) T.lR.MR("TDT_style" + n, T.w.E + T.w.a[n]);
//for (var m = 0; m < T.w.A.length; m++) T.lR.nR("TDT_components" + m, T.w.E + T.w.A[m]);
//T.lR.bR(T.w.E + "/qv?tk=" + T.w.TMAP_AUTHKEY + "&t=" + Math.random() + "&callback=T.qv");
  1. 代码中引入js和css文件。
<script type="text/javascript" src="tianditu.js"></script>
<script type="text/javascript" src="components.js"></script>
<link rel="stylesheet" type="text/css" href="tianditu4.0.css"/>;
  1. 天地图官方提供的瓦片每一种类型都分经纬度投影和球面墨卡托投影 http://lbs.tianditu.gov.cn/server/MapService.html ,我们平时一般用的是球面墨卡托投影,主流也是球面墨卡托投影。

天地图离线开发包下载地址:https://download.csdn.net/download/feiyangqingyun/89722847

二、功能特点

2.1 地图功能

  1. 支持多种地图内核,默认采用百度地图,可选高德地图、天地图、腾讯地图、谷歌地图等。
  2. 同时支持在线地图和离线地图两种模式,离线地图方便在不联网的场景中使用。
  3. 支持各种地图控件的启用,比如地图导航、地图类型、缩略图、比例尺、全景导航、实时路况、绘图工具、结果面板等。
  4. 支持多种地图功能的动态启用禁用,比如地图拖曳、键盘操作、滚轮缩放、双击放大、连续缩放、地图测距等。
  5. 提供众多js函数接口用于交互,参数极其丰富,能够想到的应用场景需求都有。
  6. 统一的信号槽机制,地图中的结果统一信号发送出去,收到后根据type类型区分。
  7. 支持地图交互,比如鼠标按下获取对应位置的经纬度。单击标注点弹出对应点的信息。
  8. 支持添加标注、删除标注、移动标注、清空标注。
  9. 标注点可以指定图标图片和尺寸,支持gif动图,支持指定以图片中心对齐还是底部中心对齐。可以设置旋转角度,带富文本提示信息。
  10. 标注点事件支持单击发信号通知和自己弹框显示信息。
  11. 提供地址转坐标和坐标转地址接口。
  12. 支持各种图形绘制,包括折线图、多边形、矩形、圆形、弧线等。
  13. 可显示悬浮的绘图工具栏,直接在地图上划线、标注点、矩形、圆形等。
  14. 支持各种区域搜索,比如矩形区域、圆形区域,可以按照关键字匹配将搜索结果显示在地图中。
  15. 可动态添加离线的行政区边界点数据。可以搜索行政区划并获取该区域的边界点数据。数据可以保存到文件以便离线使用。
  16. 支持点聚合功能,多个小标注点合并到一个大标注点,防止点密集导致交互不友好。
  17. 可以添加海量点,每个点都可以单击获取对应坐标和信息。
  18. 所有的覆盖物信息比如标注点、矩形、多边形、折线图等,都可以主动获取对应的信息比如坐标点和路径等。
  19. 支持路径规划,支持公交路线、自驾路线、步行路线、骑行路线,不同查询支持不同策略,可选最少时间、最少换乘、不走高架等。
  20. 路径规划结果可以显示在地图中,也可以获取到路径点坐标集合。这个数据可以保存到文件,以便发给机器人或者无人机做导航用来轨迹移动。
  21. 可以设置不同的地图视图比如街道图、卫星图、混合图。
  22. 可以设置不同的样式,比如午夜蓝、青草绿等样式风格。
  23. 可以设置地图的旋转角度和倾斜角度。
  24. 提供经纬度坐标纠偏转换功能,比如传入的GPS坐标需要转换到百度地图坐标或者高德地图坐标。各种坐标系转换全部离线函数,支持地球坐标系WGS-84、火星坐标系GCJ-02、百度坐标系BD-09之间的互相转换,涵盖了各种地图的坐标系。
  25. 提供动态轨迹点移动功能,按照给定的经纬度坐标集合平滑移动。
  26. 同时支持qwidget和qml,支持编译到安卓系统运行。

2.2 其他功能

  1. 提供离线地图下载模块,可以选择不同的地图内核比如百度地图或者谷歌地图,不同的地图类型比如下载街道图还是卫星图,不同的地图层级,多线程极速下载。
  2. 表格行实时显示对应的瓦片下载进度,有下载超时时间,重试次数,每个瓦片下载完成都发送信号通知,参数包括下载用时。
  3. 提供省市轮廓图下载模块,自动下载各个地区的轮廓图,保存到脚本文件或者文本文件。
  4. 支持手动调整不同区域的轮廓边界,调整后可以主动获取调整后的边界点集合。
  5. 提供动态点位示例,手动在地图上选点并添加标注,附带自定义的信息比如速度和时间等。
  6. 提供海量点位示例,批量添加标注点、点聚合、海量点。用于测试环境中支持的最大点位性能。
  7. 提供动态轨迹示例,在地图上鼠标按下选择起点和终点后,查询路线,获取路径轨迹点,模拟轨迹平滑移动。可以筛选数据将过多的路径点筛选到设定的点数。
  8. 提供轨迹回放示例,按照指定的轨迹点列表回放,也可以导入轨迹点数据进行回放。同时支持在街道图、卫星图、混合图中回放轨迹。
  9. 提供省市区域地图示例,采用echart组件,同时支持闪烁点图、迁徙图、区域地图、世界地图、仪表盘等。可以设置标题、提示信息、背景颜色、文字颜色、线条颜色、区域颜色等各种颜色。
  10. 省市区域地图示例,内置世界地图、全国地图、省份地图、地区地图,可以精确到县,所有地图全部离线使用。可设置城市的名称、值、经纬度集合。
  11. 内置通用浏览器组件,同时支持webkit/webengine/miniblink等内核。提供网页控件示例,演示打开网页和本地网页文件。
  12. 支持任意Qt版本、任意系统、任意编译器。

三、相关链接

  1. 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_map.zip
  2. 国内站点:https://gitee.com/feiyangqingyun
  3. 国际站点:https://github.com/feiyangqingyun

四、效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/798740.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一键生成!轻量级 AI 证件照制作工具!

HivisionIDPhotos —— 一个轻量级的 AI 证件照制作工具,利用一套完善的模型工作流程,实现对多种用户拍照场景的识别、抠图与证件照生成。大家好,我是 Java陈序员。 在日常生活中,我们需要各式各样的证件照。有时候需要不同的尺寸,一寸、两寸、小二寸...而有的时候需要不同…

[问题排查]CPU占用过高

查看占用cpu高的进程 top 按P 如下图:可看出PID为7149的java进程占用cpu最高,达到了98%查看进程中最耗cpu的子线程 top -Hp 7149 如下图:可看出PID为7166的线程占用cpu最高,达到了97.7%将最耗cpu的线程id转换为16进制输出 perl printf "%x \n" 7166 查询具体出现…

白云龙期货投资-第八讲

假突破的深度分析 一 高低点 平台之假突破深度分析 二 趋势线假突破之深度分析 三 假突破实盘应变操作法 假突破之飘旗确认法 在上沿做旗形整理,假突破假突破之空间确认法盘久必跌 趋势线假突破之深度分析假突破实盘应变方法 一 任何突破后不要急于进场,要看下一步行情的反应…

章13——包装类——StringBuilder类

StringBuilder介绍其继承关系和 StringBuffer 是一样的。同 StringBuffer 一样,是在堆中(value[])而非在常量池中。 三种 String 的对比有关复用率高的解读:String 的内容在常量池中,相同内容的对象(或其在堆中的东西)都可以指向常量池中的同一个位置 效率问题:StringB…

章13——常用类——StringBuffer类

基本介绍即 StringBuffer 是存在堆中的而非常量池中的。(value 数组存放字符串内容) 与 String 的对比StringBuffer:不用每次更新地址,但当数组空间不够时,会扩大并且更新地址。 构造器StringBuffer stringBuffer = new StringBuffer();StringBuffer stringBuffer1 = new …

Windows的树形目录结构

一、文件、文件夹(目录)、逻辑盘、路径的概念文件:是操作系统用来存储和管理信息的基本单位文件夹也叫目录:是文件的集合体,文件夹中可包含多个文件,也可包含多个子文件夹。每个文件夹都有一个唯一的名称,用于在文件系统中标识和访问。逻辑盘,计算机的外存储器一…

高等数学 2.5 函数的微分

目录一、微分的定义二、微分的几何意义三、微分运算1、函数和、差、积、商的微分法则2、复合函数的微分法则四、微分在近似计算中的应用 一、微分的定义定义 设函数 \(y = f(x)\) 在某区间内有定义,\(x_0\) 及 \(x_0 + \Delta x\) 在这区间内,如果函数的增量 \[\Delta y = f(…

信息学奥赛初赛天天练-91-CSP-S2023基础题3-编译命令、树的重心、拓扑排序、进制转换、R进制转十进制、十进制转R进制

PDF文档公众号回复关键字:202409172023 CSP-S 选择题 1单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项) 11 以下哪个命令,能将一个名为 main.cpp 的 C++ 源文件,编译并生成一个名为 main 的可执行文件?( ) A g++ -o main main.cpp B g++ -o main.…

匀变速直线运动的规律

匀变速直线运动的规律 一、定义:匀变速直线运动为沿一条直线且加速度恒定不变的运动,在 \((v-t)\) 图中,其表示为一条倾斜的直线。二、关于字母的解释:\(v_0\) 表示初始速度,\(v_t\) 表示末速度,\(t\) 表示时间,\(a\) 表示加速度,\(s\) 代表位移。 三、关于匀变速直线运…

Java 性能调优:优化 GC 线程设置

垃圾回收器使用一组称为 GC 线程的线程来执行回收工作。有时 JVM 可能会分配过多或过少的 GC 线程。本文将讨论 JVM 为什么会出现这种情况、其影响以及可能的解决方案。 1 咋查找应用程序的 GC 线程数量 进行线程转储分析来确定应用程序的 GC 线程数量:从生产服务器捕获thread…

微信授权登录接口开发

微信登陆过程 在项目开发中,难免会遇到微信授权登录这一操作,本讲来讲一下微信登陆是如何实现的? 关于校验登录,有诸多方法,记录方法如下:使用Spring MVC提供的拦截器 网关服务全局过滤器 使用AOP面向横切面实现对于使用Spring MVC提供的拦截器来实现,其大致的思路如下:注…

1 计算机系统

计算机系统抽象层次6 用户 可执行程序5 高级语言 C++ Java4 汇编语言 汇编代码3 系统软件 操作系统 /库代码2 机器 指令集架构(ISA)1 控制(控制怎么执行) 微代码 /硬连线0 数字逻辑(执行) 电路、门等Language Processor: 语言处理器 语言处理器的两个阶段:分析源程序 合成目…