Qt/C++地址转坐标/坐标转地址/逆地址解析/支持百度高德腾讯和天地图
一、前言说明
地址和经纬度坐标转换的功能必须在线使用,一般用在导航需求上,比如用户输入起点地址和终点地址,查询路线后,显示对应的路线,而实际上各大地图厂家默认支持的是给定经纬度坐标来查询(百度地图支持传入地址),但是你让用户输入经纬度坐标是不可能的,他肯定不可能知道怎么去拿到这个坐标,所以一般都是要求用户输入实际的地址,然后程序转换成经纬度坐标,再调用函数传入两个坐标取查询路径。
所有的地图都会提供这个功能,而且发现一个趋势,由于这种功能调用可能非常频繁,所以各大地图厂商目前都有做成服务的形式,也就是发送http请求拿结果,尤其是腾讯地图比较激进,直接地图的js中的对应逆地址解析接口都停用了,必须用http请求方式。其实就算是地图本身的js中内置的对象处理,估计后台也是自己去发送请求拿到的结果。于是需要单独写个js函数用于发送请求返回结果,在js中发送请求不要太简单,直接new一个XMLHttpRequest调用send方法即可,返回的结果直接在onreadystatechange事件通过responseText属性获取。
二、功能特点
- 支持多种地图内核,默认采用百度地图,可选高德地图、天地图、腾讯地图、谷歌地图等。
- 同时支持在线地图和离线地图两种模式,离线地图方便在不联网的场景中使用。
- 支持各种地图控件的启用,比如地图导航、地图类型、缩略图、比例尺、全景导航、实时路况、绘图工具、结果面板等。
- 支持多种地图功能的动态启用禁用,比如地图拖曳、键盘操作、滚轮缩放、双击放大、连续缩放、地图测距等。
- 提供众多js函数接口用于交互,参数极其丰富,能够想到的应用场景需求都有。
- 统一的信号槽机制,地图中的结果统一信号发送出去,收到后根据type类型区分。
- 支持地图交互,比如鼠标按下获取对应位置的经纬度。单击标注点弹出对应点的信息。
- 支持添加标注、删除标注、移动标注、清空标注。
- 标注点可以指定图标图片和尺寸,支持gif动图,支持指定以图片中心对齐还是底部中心对齐。可以设置旋转角度,带富文本提示信息。
- 标注点事件支持单击发信号通知和自己弹框显示信息。
- 提供地址转坐标和坐标转地址接口。
- 支持各种图形绘制,包括折线图、多边形、矩形、圆形、弧线等。
- 可显示悬浮的绘图工具栏,直接在地图上划线、标注点、矩形、圆形等。
- 支持各种区域搜索,比如矩形区域、圆形区域,可以按照关键字匹配将搜索结果显示在地图中。
- 可动态添加离线的行政区边界点数据。可以搜索行政区划并获取该区域的边界点数据。数据可以保存到文件以便离线使用。
- 支持点聚合功能,多个小标注点合并到一个大标注点,防止点密集导致交互不友好。
- 可以添加海量点,每个点都可以单击获取对应坐标和信息。
- 所有的覆盖物信息比如标注点、矩形、多边形、折线图等,都可以主动获取对应的信息比如坐标点和路径等。
- 支持路径规划,支持公交路线、自驾路线、步行路线、骑行路线,不同查询支持不同策略,可选最少时间、最少换乘、不走高架等。
- 路径规划结果可以显示在地图中,也可以获取到路径点坐标集合。这个数据可以保存到文件,以便发给机器人或者无人机做导航用来轨迹移动。
- 可以设置不同的地图视图比如街道图、卫星图、混合图。
- 可以设置不同的样式,比如午夜蓝、青草绿等样式风格。
- 可以设置地图的旋转角度和倾斜角度。
- 提供经纬度坐标纠偏转换功能,比如传入的GPS坐标需要转换到百度地图坐标或者高德地图坐标。各种坐标系转换全部离线函数,支持地球坐标系WGS-84、火星坐标系GCJ-02、百度坐标系BD-09之间的互相转换,涵盖了各种地图的坐标系。
- 提供动态轨迹点移动功能,按照给定的经纬度坐标集合平滑移动。
- 同时支持qwidget和qml,支持编译到安卓系统运行。
三、使用说明
- 在地址文本框中输入地址,单击地址转坐标,会查找到当前地址最近的经纬度坐标填入坐标文本框中。
- 在坐标文本框中输入坐标,单击坐标转地址,会查找坐标文本框中经纬度坐标最近的地址填入地址文本框中。
四、相关链接
- 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 名称:bin_map.zip
- 国内站点:https://gitee.com/feiyangqingyun
- 国际站点:https://github.com/feiyangqingyun
五、效果图

六、相关代码
void MapObjBaiDu::addGeocoder()
{
//初始化解析对象
html << QString(" var geocoder;");
html << QString(" function initGeocoder() {");
html << QString(" if (geocoder) {return}");
html << QString(" geocoder = new BMap.Geocoder();");
html << QString(" }");
//地址解析成坐标
html << QString(" function getPointByAddr(flag, addr) {");
html << QString(" initGeocoder();");
html << QString(" geocoder.getPoint(addr, function(result) {");
html << QString(" if (result) {");
html << QString(" var point = getPointString(result);");
html << QString(" receiveData('geocoderresult', flag + '|' + point);");
html << QString(" }");
html << QString(" });");
html << QString(" }");
//坐标解析成地址
html << QString(" function getAddrByPoint(flag, point) {");
html << QString(" initGeocoder();");
html << QString(" geocoder.getLocation(getPoint(point), function(result) {");
html << QString(" if (result) {");
html << QString(" var address = result.address;");
html << QString(" receiveData('geocoderresult', flag + '|' + address);");
html << QString(" }");
html << QString(" });");
html << QString(" }");
}
void MapObjTian::addGeocoder()
{
//初始化解析对象
html << QString(" var geocoder;");
html << QString(" function initGeocoder() {");
html << QString(" if (geocoder) {return}");
html << QString(" geocoder = new T.Geocoder();");
html << QString(" }");
//地址解析成坐标
html << QString(" function getPointByAddr(flag, addr) {");
html << QString(" initGeocoder();");
html << QString(" geocoder.getPoint(addr, function(result) {");
html << QString(" if (result.getStatus() == 0) {");
html << QString(" var point = result.getLocationPoint();");
html << QString(" point = getPointString(point);");
html << QString(" receiveData('geocoderresult', flag + '|' + point);");
html << QString(" }");
html << QString(" });");
html << QString(" }");
//坐标解析成地址
html << QString(" function getAddrByPoint(flag, point) {");
html << QString(" initGeocoder();");
html << QString(" geocoder.getLocation(getPoint(point), function(result) {");
html << QString(" if (result.getStatus() == 0) {");
html << QString(" var address = result.getAddress();");
html << QString(" receiveData('geocoderresult', flag + '|' + address);");
html << QString(" }");
html << QString(" });");
html << QString(" }");
}
void frmMapDemoMarker::on_btnAddrToPoint_clicked()
{
QString addr = ui->txtAddr->text().trimmed();
emit runJs(QString("getPointByAddr('AddrToPoint', '%1')").arg(addr));
}
void frmMapDemoMarker::on_btnPointToAddr_clicked()
{
QString point = ui->txtPoint->text().trimmed();
emit runJs(QString("getAddrByPoint('PointToAddr', '%1')").arg(point));
}
Qt/C++地址转坐标/坐标转地址/逆地址解析/支持百度高德腾讯和天地图的更多相关文章
- 百度和谷歌的逆地址解析及GPS、谷歌地图和百度地图坐标之间的转换(python版)
#!/usr/bin/env python # coding:utf-8 # @author: KaiVen """ GPS坐标转换: WGS-84:是国际标准,GPS坐 ...
- 根据高德API知道坐标获取详细地址信息
/** * 根据坐标获取具体地址 * @param coor 坐标字符串 * @return */ public static String getAdd(String coor){ String u ...
- 转: PE rva to raw 虚拟偏移地址和文件物理偏移地址
+---------+---------+---------+---------+---------+---------+| 段名称 虚拟地址 虚拟大小 物理地址 物理大小 标志 |+-------- ...
- 安装Oracle11g时,检测到系统的主 IP 地址是 DHCP 分配的地址
检查完成.此次检查的总体结果为: 失败 <<<< 问题: 安装检测到系统的主 IP 地址是 DHCP 分配的地址. 建议案: Oracle 支持在具有 DHCP 分配的 IP ...
- 获取Mac、CPUID、硬盘序列号、本地IP地址、外网IP地址OCX控件
提供获取Mac.CPUID.硬盘序列号.本地IP地址.外网IP地址OCX控件 开发语言:vc++ 可应用与WEB程序开发应用 <HTML><HEAD><TITLE> ...
- Java根据ip地址获取Mac地址,Java获取Mac地址
Java根据ip地址获取Mac地址,Java获取Mac地址 >>>>>>>>>>>>>>>>>&g ...
- API之IP地址查询---权威的IP地址查询接口集合
原文地址:http://yushine.iteye.com/blog/1717586 推荐实用IP138 http://www.baidu.com/s?wd=IP&rsv_spt=1& ...
- 一个域名最多能对应几个IP地址?,一个IP地址可以绑定几个域名?
一个域名最多能对应几个IP地址?,一个IP地址可以绑定几个域名?谢谢 xikeboy | 浏览 31055 次 推荐于2016-04-24 14:21:14 最佳答案 1.也就是说通常情况下一个域名同 ...
- tcp/ip 卷一 读书笔记(3)为什么既要有IP地址又要有MAC地址
网络层 首先明确一点,并不是所有的网络之间传输数据都需要mac地址和ip地址,比如说点对点线路之间的通信就没有MAC地址,网络层使用ipx协议时就没有ip地址,但是在当前的主流网络中,我们都使用ip地 ...
- 修改MAC地址的方法 破解MAC地址绑定(抄)
修改MAC地址的方法 破解MAC地址绑定 网卡的MAC地址是固化在网上EPROM中的物理地址,是一块网卡的“身份证”,通常为48位.在平常的应用中,有很多方面与MAC地址相关,如有些软件是和MAC ...
随机推荐
- Android复习(二)应用资源——>菜单
菜单资源定义可通过 MenuInflater 进行扩充的应用菜单,包括选项菜单.上下文菜单和子菜单. 有关使用菜单的指南,请参阅菜单开发者指南. 文件位置: res/menu/filename.xml ...
- Linux环境下的mysql安装
MySQL8.0.26-Linux版安装 1.准备一台Linux服务器 云服务器或者虚拟机都可以; Linux的版本为 Centos7; 2.下载Linux版MySQL安装包 https://down ...
- KubeSphere 接入外部 Elasticsearch 最佳实践
作者:张坚,科大讯飞开发工程师,云原生爱好者. 大家好,我是张坚.今天来聊聊如何在 KubeSphere 中集成外置的 ES 组件. KubeSphere 在安装完成时候可以启用日志组件,这样会安装 ...
- KubeSphere 3.3.0 发布:全面拥抱 GitOps
2022 年 6 月 27 日,KubeSphere 开源社区激动地向大家宣布,KubeSphere 3.3.0 正式发布! CNCF 发布的 2021 年度调查报告指出,容器和 K8s 的事实地位已 ...
- 如何优雅地将AI人工智能在线客服嵌入企业网站
随着人工智能(AI)技术的飞速发展,越来越多的企业意识到,将AI客服嵌入企业网站是提升客户体验.提高工作效率的重要手段.相比于传统的人工客服,AI客服可以24/7全天候服务,不仅能有效处理大部分用户问 ...
- git知识点,常用命令
git理论知识 git的服务器端(remote)端包含多个repository,每个repository可以理解为一个项目. 而每个repository下有多个branch."origin& ...
- Next.js 实战开发入门 1 开发环境部署 - 曲速引擎 Warp Drive
开发目标 我们将构建一个简化版本的财务仪表板,其内容包括:公共主页.登录页面.受身份验证保护的仪表板页面.用户可以添加.编辑和删除发票 开发环境配置 开发客户端 Windows 10 (不限系统,兼容 ...
- C# 串口读取并转换字符串
public string ReadString() { ASCIIEncoding ascii = new ASCIIEncoding(); byte[] readBuffer = new byte ...
- 干货分享:Air700ECQ的硬件设计,第二部分
接下来分享第二部分. 3.10. 功能管脚 3.10.1. MAIN_RI 管脚名 类型 序号 电压域 作用 MAIN_RI DO 5 LDOAON 振铃信号,唤醒输出管脚,用于唤醒AP 表格 1 ...
- Mobexterm 串口换行错误
问题描述 使用 Mobexterm 连接串口时,在回显中存在换行错误问题,严重影响阅读串口数据. 解决方法 在左侧操作窗口中右击发生 换行错误问题 的窗口,比如我需要右击 COM9 右击后,在下拉列表 ...