在上个版本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
整体界面如下所示:
支持以下在线地图:
支持不同皮肤样式:
支持任意裁剪(五角星当时多放了一个点,没对称):
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增加测距功能
通过"经度,纬度"定位地图中心点 :