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

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

体验地址

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

b站演示传送门

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

整体界面如下所示:

支持以下在线地图:

 支持不同皮肤样式:

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

扫描二维码关注公众号,回复: 14675138 查看本文章

1.支持跨平台

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

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

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

3.裁剪实现

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

// 多边形剪切 存储
class MapTileSaveTaskPolygonTailor : public MapTileSaveTask
{
protected:
    SolveType solve() override;
    void paint(QPainter *p) override;

public:

    MapTileSaveTaskPolygonTailor(const QList<QByteArray>& data,const QString& outputDir,
                   const TileSpec& tile, const bool& isClip, const QVector<QPoint>&  polygon
                    )
      :MapTileSaveTask(PolygonTailor, data, outputDir, tile, isClip)
    {
        if(_isClip) {
            _tailorPolygon.resize(polygon.size());
            for(int i = 0 ; i < _tailorPolygon.length(); ++i) {
                _tailorPolygon[i].rx() = polygon[i].x() - tile.offsetX * 256;
                _tailorPolygon[i].ry() = polygon[i].y() - tile.offsetY * 256;

                // 目前算法实现边检测,未实现裁剪区域顶点与瓦片边缘重合情况(相对效率提高)
                if((_tailorPolygon[i].ry() == 0  || _tailorPolygon[i].ry() == 256)
                        && _tailorPolygon[i].rx() >= 0 &&  _tailorPolygon[i].rx()  <=256 ) {
                    _tailorPolygon[i].ry() -=1;
                }
                if((_tailorPolygon[i].rx() == 0  || _tailorPolygon[i].rx() == 256)
                          && _tailorPolygon[i].ry() >= -1 &&  _tailorPolygon[i].ry()  <=256 ) {
                      _tailorPolygon[i].rx() -=1;
                }
            }

            // 精度丢失,避免重复点
            for(int i = 1 ; i < _tailorPolygon.length(); ) {
                if(_tailorPolygon[i-1] == _tailorPolygon[i]) {
                    _tailorPolygon.remove(i);
                } else {
                    i++;
                }
            }
        }

    }

private:
    QVector<QPoint>                 _tailorPolygon;
    QVector<QVector<QPoint>>        _result;

};


// 矩形剪切 存储
class MapTileSaveTaskRectangeTailor : public MapTileSaveTask
{
protected:
    SolveType solve() override;
    void paint(QPainter *p) override;

public:

    MapTileSaveTaskRectangeTailor(const QList<QByteArray>& data ,const QString& outputDir,
                    const TileSpec& tile, const bool& isClip,  const QRect& tailorRect
                    )
      :MapTileSaveTask(RectangeTailor, data, outputDir, tile, isClip)
    {
        if(_isClip) {
            _tailorRect = QRect(tailorRect.x() - tile.offsetX * 256, tailorRect.y() - tile.offsetY * 256, tailorRect.width(), tailorRect.height());

        }
    }

private:
    QRect                _tailorRect;
    QRect                _result;
};

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

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

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

制作两个列表:

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

找到第一个进点:

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

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

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

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

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

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

2023/03/02增加测距功能

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

​​​​​​​

猜你喜欢

转载自blog.csdn.net/qq_37997682/article/details/126595662