• Qt quick-QML地图引擎之v3版本(新增高德/谷歌在线/离线预览/多线程离线裁剪下载/区域查询/位置搜索/路径规划)


    在上个版本64.qt quick-qml使用高德地图插件实现V2版本(新增:位置搜索、路径规划、轨迹编辑等)_诺谦的博客-CSDN博客_qt高德地图插件基础下新增以下功能:
    1、支持多线程请求、超时重试、软件重启续传功能、支持多个任务并行下载
    2、自己实现的裁剪算法,实现地图任意多边形及任意顺时针逆时针裁剪、
    3、离线加载地图并预览、并支持在原来支持的图层上再次放大
    4、实现多个图层下载融合(比如高德卫星+标记)
    5、实现区域查询,区域下载
    6、自定义皮肤
    7、跨平台、支持 Windows(mingw, msvc) Linux(桌面、嵌入式 ) 安卓等,不仅支持QML加载、也支持QWidget加载

    v4版本:Qt Quick-QML地图引擎之v4版本(新增3D模型/抗锯齿任意多边形下载)_诺谦的博客-CSDN博客

    体验地址

    链接:https://pan.baidu.com/s/1bQ57QYz6oaVGr01qhDSypw?pwd=1234 
    文件名:诺谦-地图引擎下载器v3试用版(支持跨平台,离线,在线,多任务下载,轨迹,标记等)
    提取码:1234

    b站演示传送门

    Qt quick-QML地图引擎之v3版本(新增高德/谷歌在线/离线预览/多线程离线裁剪下载/区域查询/位置搜索/路径规划)_哔哩哔哩_bilibili

    整体界面如下所示:

    支持以下在线地图:

     支持不同皮肤样式:

     支持任意裁剪(五角星当时多放了一个点,没对称):

    网速好情况下,下载速度可以到8MB每秒:

    1.支持跨平台

    如下图所示,以linux为例,同一套代码直接就编译完成!,为跨平台节省了一大半时间,只要下载管理写的好,就一切没问题

    2.离线地图支持再次任意放大

    如下图所示,原本下载的20级谷歌地图可以放大到22:

    3.裁剪实现

    使用接口方式,子类实现了两套不同算法提供给父类调用,矩形裁剪由于是对称的,所以效率最快,而多边形裁剪需要计算每个边.

    1. // 多边形剪切 存储
    2. class MapTileSaveTaskPolygonTailor : public MapTileSaveTask
    3. {
    4. protected:
    5. SolveType solve() override;
    6. void paint(QPainter *p) override;
    7. public:
    8. MapTileSaveTaskPolygonTailor(const QList& data,const QString& outputDir,
    9. const TileSpec& tile, const bool& isClip, const QVector& polygon
    10. )
    11. :MapTileSaveTask(PolygonTailor, data, outputDir, tile, isClip)
    12. {
    13. if(_isClip) {
    14. _tailorPolygon.resize(polygon.size());
    15. for(int i = 0 ; i < _tailorPolygon.length(); ++i) {
    16. _tailorPolygon[i].rx() = polygon[i].x() - tile.offsetX * 256;
    17. _tailorPolygon[i].ry() = polygon[i].y() - tile.offsetY * 256;
    18. // 目前算法实现边检测,未实现裁剪区域顶点与瓦片边缘重合情况(相对效率提高)
    19. if((_tailorPolygon[i].ry() == 0 || _tailorPolygon[i].ry() == 256)
    20. && _tailorPolygon[i].rx() >= 0 && _tailorPolygon[i].rx() <=256 ) {
    21. _tailorPolygon[i].ry() -=1;
    22. }
    23. if((_tailorPolygon[i].rx() == 0 || _tailorPolygon[i].rx() == 256)
    24. && _tailorPolygon[i].ry() >= -1 && _tailorPolygon[i].ry() <=256 ) {
    25. _tailorPolygon[i].rx() -=1;
    26. }
    27. }
    28. // 精度丢失,避免重复点
    29. for(int i = 1 ; i < _tailorPolygon.length(); ) {
    30. if(_tailorPolygon[i-1] == _tailorPolygon[i]) {
    31. _tailorPolygon.remove(i);
    32. } else {
    33. i++;
    34. }
    35. }
    36. }
    37. }
    38. private:
    39. QVector _tailorPolygon;
    40. QVector> _result;
    41. };
    42. // 矩形剪切 存储
    43. class MapTileSaveTaskRectangeTailor : public MapTileSaveTask
    44. {
    45. protected:
    46. SolveType solve() override;
    47. void paint(QPainter *p) override;
    48. public:
    49. MapTileSaveTaskRectangeTailor(const QList& data ,const QString& outputDir,
    50. const TileSpec& tile, const bool& isClip, const QRect& tailorRect
    51. )
    52. :MapTileSaveTask(RectangeTailor, data, outputDir, tile, isClip)
    53. {
    54. if(_isClip) {
    55. _tailorRect = QRect(tailorRect.x() - tile.offsetX * 256, tailorRect.y() - tile.offsetY * 256, tailorRect.width(), tailorRect.height());
    56. }
    57. }
    58. private:
    59. QRect _tailorRect;
    60. QRect _result;
    61. };

    4.多边形裁剪流程如下所示

     找到所有交点,下图所示:

    通过规律可以看出如果主多边形与裁剪多边形有交点,交点成对出现,然后我们可以将相交点规定为进点和出点(enter和exit)、然后找到所有的近点和出点相交点.如下图所示:

    制作两个列表:

    一个是裁剪多边形(VWXYZ),一个主多边形(ABCD):

    找到第一个进点:

    从裁剪多边形的列表(VWXYZ)开始,找到第一个进点为i1,然后我们就可以开始在ABCD区域绘制子方形,直到遇到第一个出点i2(出点代表另一个列表的入点).然后再次在ABCD列表中从i2开始,直到绘制到开始点i1为止(避免被漏掉).

    然后继续往后遍历,得到:

    最后将获取到的裁剪区域对瓦片进行裁剪即可~

    最新更新(多折线/区域下载 支持添加额外点):

    数据点支持一键导出功能:

    增加标记、增加导入国内国外坐标转换、标记坐标值支持复制到剪贴板:

    2023/03/02增加测距功能

    通过"经度,纬度"定位地图中心点 :

     地图瓦片支持加解密,避免非法利用:

     

  • 相关阅读:
    Stream入门
    80端口被占用问题根源解决 HTTP Error 404. The requested resource is not found.
    解决 kubernetes(k8s)创建Dashboard失败,Dashboard的pod状态为CrashLoopBackOff
    Kamiya丨Kamiya艾美捷小鼠脱细胞素ELISA说明书
    k8s发布eureka集群,创建微服务项目
    大模型真的会让软件测试人员下岗吗?
    Linux基本指令(上)
    解决mac 下 docker-compose 不是命令
    Python+Pycharm如何安装第三方库及为何pip安装的包在Pycharm中不能使用的解决方式
    Java核心篇,二十三种设计模式(十五),行为型——解析器模式
  • 原文地址:https://blog.csdn.net/qq_37997682/article/details/126595662