Qt/C++地址转坐标/坐标转地址/逆地址解析/支持百度高德腾讯和天地图

news2024/11/16 0:47:00

一、前言说明

地址和经纬度坐标转换的功能必须在线使用,一般用在导航需求上,比如用户输入起点地址和终点地址,查询路线后,显示对应的路线,而实际上各大地图厂家默认支持的是给定经纬度坐标来查询(百度地图支持传入地址),但是你让用户输入经纬度坐标是不可能的,他肯定不可能知道怎么去拿到这个坐标,所以一般都是要求用户输入实际的地址,然后程序转换成经纬度坐标,再调用函数传入两个坐标取查询路径。

所有的地图都会提供这个功能,而且发现一个趋势,由于这种功能调用可能非常频繁,所以各大地图厂商目前都有做成服务的形式,也就是发送http请求拿结果,尤其是腾讯地图比较激进,直接地图的js中的对应逆地址解析接口都停用了,必须用http请求方式。其实就算是地图本身的js中内置的对象处理,估计后台也是自己去发送请求拿到的结果。于是需要单独写个js函数用于发送请求返回结果,在js中发送请求不要太简单,直接new一个XMLHttpRequest调用send方法即可,返回的结果直接在onreadystatechange事件通过responseText属性获取。

二、功能特点

  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,支持编译到安卓系统运行。

三、使用说明

  1. 在地址文本框中输入地址,单击地址转坐标,会查找到当前地址最近的经纬度坐标填入坐标文本框中。
  2. 在坐标文本框中输入坐标,单击坐标转地址,会查找坐标文本框中经纬度坐标最近的地址填入地址文本框中。

四、相关链接

  1. 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 名称:bin_map.zip
  2. 国内站点:https://gitee.com/feiyangqingyun
  3. 国际站点: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));
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

光纤FPV无人机技术详解

1. 技术基础与原理 光纤FPV&#xff08;First Person View&#xff0c;第一人称视角&#xff09;无人机技术&#xff0c;是将光纤通信技术与无人机技术相结合的一项创新技术。该技术通过光纤作为高速、低延迟的数据传输媒介&#xff0c;实现了无人机拍摄的高清视频信号实时回传…

P0.9/P1.25全倒装共阴节能COB超微小间距LED显示屏已抢占C位

COB&#xff08;Chip on Board&#xff09;技术最早发源于上世纪60年代&#xff0c;是将LED芯片直接封装在PCB电路板上&#xff0c;并用特种树脂做整体覆盖。COB实现“点” 光源到“面” 光源的转换。点间距有P0.3、P0.4、P0.5、P0.6、P0.7、P0.9、P1.25、P1.538、P1.5625、P1.…

带有WebUI的cron替代品Dagu

什么是 Dagu &#xff1f; Dagu 是一个强大的 Cron 替代品&#xff0c;它带有一个 Web UI。它允许你将命令之间的依赖关系定义为有向无环图(DAG)&#xff0c;使用声明式的 YAML 格式。Dagu 的设计易于使用、自包含且无需编码&#xff0c;非常适合小型项目。 安装 在群晖上以 D…

科技与文化的完美碰撞 德施曼玄武•紫禁城K80亮相成都车展

8月30日-9月8日&#xff0c;第二十七届成都国际汽车展览会将在中国西部国际博览城举行&#xff0c;德施曼将与海尔、美的、松下等知名品牌携旗下重磅产品集中参展。大会同期“京东MALL智享家生活”活动也将开启&#xff0c;行业首个与紫禁城IP联名的智能锁产品德施曼玄武•紫禁…

52基于SpringBoot+Vue+uniapp的旅游管理系统的的详细设计和实现(源码+lw+部署文档+讲解等)

文章目录 前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus 系统测试系统测试目的系统功能测试系统测试结论 为什么选择我代码参考数据库参考源码获取源码获取 前言 &#x1f31e;博主介绍 &#xff1a;✌全网粉丝15W,CSDN特邀作者、21…

【初阶C++篇】~ C++入门

C入门基础 前言8月语言排行 一 C书籍推荐二 C的第一个程序​三命名空间 namespace命名空间的使用 四C输入 输出五缺省参数六函数重载&#xff08;就是函数可以同名&#xff09;七引用引用和指针的关系 八 inline内联 前言 学完数据结构&#xff0c;那么C也就随之而来&#xff…

数据分析处理库(pandas)

目录 数据预处理 数据读取 DataFrame结构 数据索引 创建DataFrame Series操作 数据分析 统计分析 pivot数据透视表 groupby操作 常用函数操作 Merge操作 排序操作 缺失值处理 apply自定义函数 时间操作 绘图操作 大数据处理技巧 数值类型转换 属性类型转换…

FPGA学习笔记

FLASH: 掉电程序不丢失&#xff0c;属于ROM. 是的&#xff0c;Flash 存储器属于 ROM&#xff08;只读存储器&#xff09;的范畴&#xff0c;但它与传统的 ROM&#xff08;如 PROM、EPROM&#xff09;有一些区别。 Flash 与 ROM 的关系 ROM&#xff08;Read-Only Memory&#…

企业级Mysql 集群技术部署

目录 1.1部署mysql 1.1.1 安装依赖性&#xff1a; 1.1.2 下载并解压源码包 1.1.3 源码编译安装mysql 1.1.4 部署mysql 2.mysql的主从复制 2.1 配置masters 2.2配置slave 2.3 延迟复制 2.4 慢查询日志 2.5并行复制 2.6 原理刨析 2. 7架构缺陷 3.半同步模式 3.1半同…

智能导诊系统:帮助患者找医院、找科室、找医生,解决“知症不知病”“知病不知科”“挂错号”问题

方案概述 智能导诊是基于医疗大模型、知识图谱、人机交互&#xff0c;帮助患者找医院、找科室、找医生&#xff0c;解决“知症不知病”“知病不知科”“挂错号”问题&#xff0c;根据病情分级导流&#xff0c;助力分级诊疗。支持通过语音、文字、点选、图片等多种方式与患者沟…

macbook怎么换自定义壁纸?Mac怎么设置壁纸 macOS中如何轻松删除不需要的壁纸?

自定义壁纸&#xff0c;不仅是为了优化桌面外观&#xff0c;还能在很大程度上影响用户情绪。一张好看的壁纸&#xff0c;可以显著提升用户的使用体验。因此&#xff0c;掌握更换和删除壁纸的操作技巧&#xff0c;就显得十分重要。下面详细解读如何在Mac上设置壁纸&#xff0c;以…

利用Leaflet.js创建交互式地图:绘制多个多边形和点位

引言 在地理信息系统&#xff08;GIS&#xff09;和地图可视化领域&#xff0c;Leaflet.js是一个轻量级但功能强大的JavaScript库&#xff0c;它提供了丰富的API来创建交互式地图。本文将通过一个实际的Vue组件示例&#xff0c;展示如何使用Leaflet.js在地图上绘制多边形和点位…

用「图灵测试」检验AI尤其是大语言模型,真的科学吗?

当前的大型语言模型似乎能够通过一些公开的图灵测试。我们该如何衡量它们是否像人一样聪明呢&#xff1f; 在发布后的近两年时间里&#xff0c;ChatGPT 表现出了一些非常类似人类的行为&#xff0c;比如通过律师资格考试。这让一些人怀疑&#xff0c;计算机的智力水平是否正在接…

c++习题28-计算2的N次方

目录 一&#xff0c;题目 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;题目 描述 任意给定一个正整数N(N<100)&#xff0c;计算2的n次方的值。 输入描述 输入一个正整数N。 输出描述 输出2的N次方的值。 用例输入 1 5 用例输出 1 32 二&#xff0…

【python入门到精通专题】1.知识与环境准备

小节目标: 计算机基础知识了解编程语言python安装与卸载pycharm安装与卸载终端的使用 一.计算机基础 程序员要想让计算机工作&#xff0c;必须知道计算机能干什么&#xff0c;怎么干的&#xff0c;这也就是我们必须学习计算机基础的原因 1.硬件系统 理解方式: 你通过耳朵和…

英文文献翻译工具推荐哪个?高效学习新选择

在学习英语的旅途中&#xff0c;我们难免会遇到难以理解的词汇、句子或整篇文章。 这时&#xff0c;一款优秀的英文文献翻译软件就显得尤为重要。它不仅能助你一臂之力&#xff0c;还能让你的学习过程更加高效。 本文将为你推荐五款英文文献翻译软件免费版&#xff0c;它们将…

【十滴水 / 4】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 3e510; unordered_map<int, int> mp; int c, m, n; int res; struct grid{int l;int r;int pos;int val;bool explode;bool const operator < (const grid& a){return pos < a.pos…

【JDBC】DAO和增删改查通用方法 | 案例

九、DAO和增删改查通用方法 DAO&#xff1a;Data Access Object访问数据信息的类和接口&#xff0c;包括了对数据的CRUD&#xff08;Create、Retrival、Update、Delete&#xff09;&#xff0c;而不包含任何业务相关的信息 作用&#xff1a;为了实现功能的模块化&#xff0c;…

【推荐100个unity插件之30】只需拖放即可实现Unity UI动画——AnimationUI插件的视野

地址 github&#xff1a;https://github.com/DhafinFawwaz/Unity-AnimationUI gitee&#xff1a;https://gitee.com/xiangyuphp/Unity-AnimationUI 介绍 AnimationUI是一个统一的工具&#xff0c;可以轻松创建UI动画&#xff0c;无需代码。您可以简单地拖放来创建一些平滑的…

鸿蒙开发5.0【基于Swiper的页面布局】

场景一&#xff1a;Swiper页面支持自定义动画 方案&#xff1a; 给Swiper组件设置.nextMargin(50).prevMargin(50)属性。 给Swiper组件添加onChange事件&#xff0c;设置当前this.currentIndexindex&#xff0c;当currentIndex为首页或者尾页时&#xff0c;设置上一张以及下一…