QT编写地图实现获取区域边界

 更新时间:2022年02月10日 16:28:23   作者:feiyangqingyun  
区域边界是一些坐标点集合,而且不同的行政区划得到的区域边界点数组集合个数不同。本文将具体介绍QT在编写地图时如何实现获取区域边界,需要的可以参考一下

一、前言

区域边界也是一些坐标点集合,而且不同的行政区划得到的区域边界点数组集合个数不同,觉得部分都是一个集合,少部分有一些飞地之类的,需要多个闭合区域,所以会得到多个数组集合,绘制的时候都要分别取出来绘制就行。

获取边界点一般和行政区划搭配起来使用,比如用户输入一个省市的名称,然后自动定位到该省市,然后对该轮廓获取所有边界点集合输出到js文件,最后供离线使用,获取边界点还有一个功能就是获取当前区域内的左下角右上角等经纬度坐标,这个主要是供离线地图下载使用的,百度地图很好的提供了bdary.get(cityname, function(rs)的函数来获取行政区划的边界点集合,其中rs.boundaries就是所有的边界点集合,估计他是服务器上存储好的每个区域的集合,查询到了立即返回,可能早期也是人工的一点点圈起来连线好存到到数据库的,按照此方式其实可以搞一个程序自动将全国的所有省市边界点集合数据全部扒下来,给离线地图使用,测试了下貌似只支持到县城级别,不支持具体到乡镇。

二、功能特点

定时器排队下载省市轮廓图点坐标集合存储到JS文件。

支持一个行政区域多个不规则区域下载。

自动计算行政区域的下载轮廓数量。

可精确选择省份、市区、县城,也可直接输入行政区域的名称。

可以设置下载间隔、随时开始下载和停止下载。

提供编辑边界功能,可以直接在地图上编辑好不规则区域的点集合,然后获取边界点集合数据,这个可以用来自己绘制区域拿到数据,比如某个乡镇甚至某个小区的行政区域数据,很牛逼。

三、体验地址

体验地址:https://pan.baidu.com/s/15ZKAlptW-rDcNq8zlzdYLg  提取码:uyes 文件名:bin_map.zip

国内站点:https://gitee.com/feiyangqingyun

国际站点:https://github.com/feiyangqingyun

四、效果图

五、相关代码

void frmMapBoundary::getBoundary()
{
    //判断当前索引对应的省会的复选框有没有勾选,没有勾选则找到下一个勾选的
    int count = names.count();
    while (indexMain < count - 1 && !cks.at(indexMain)->isChecked()) {
        indexMain++;
        indexSub = 0;
    }

    //到了最后一个省会的索引,停止定时器
    if (indexMain == count || !cks.at(indexMain)->isChecked()) {
        on_btnStop_clicked();
        return;
    }

    //下载到省会的最后一个县,索引自动跳到下一个省会
    QStringList list = names.at(indexMain);
    if (indexSub == list.count()) {
        indexMain++;
        indexSub = 0;
        getBoundary();
        return;
    }

    QString name = list.at(indexSub);
    addBoundary(name);
    indexSub++;

    //更新进度条
    int value = bars.at(indexMain)->value();
    bars.at(indexMain)->setValue(value + 1);
    ui->txtTip->setText(name);
}

void frmMapBoundary::addBoundary()
{
    //开启编辑状态
    QString name = ui->cboxName->currentText();
    addBoundary(name, true);
}

void frmMapBoundary::addBoundary(const QString &name, bool edit)
{
    currentName = name;
    QString js = QString("addBoundary('%1', true, %2)").arg(name).arg(edit ? "true" : "false");
    runJs(js);
}

void frmMapBoundary::saveBoundary(const QString &fileName, const QVariant &data)
{
    //传过来的是行政区划的边界点坐标集合,存储到js文件
    //可能会有多个数据,比如台湾的金门岛,都是独立的区域形状,存入数组
    QStringList boundarys;
    QStringList list = data.toString().split("|");
    foreach (QString points, list) {
        boundarys << QString("{'points': '%1'}").arg(points);
    }

    //最终js文件内容数据
    QString boundary = QString("var boundarys = [%1]").arg(boundarys.join(", "));
    QFile file(fileName);
    if (file.open(QFile::WriteOnly | QFile::Truncate)) {
        QTextStream out(&file);
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
        out.setCodec("utf-8");
#endif
        out << boundary;
    }
}

以上就是QT编写地图实现获取区域边界的详细内容,更多关于QT获取区域边界的资料请关注脚本之家其它相关文章!

相关文章

  • 浅谈C++11的std::mem_fn源码解析

    浅谈C++11的std::mem_fn源码解析

    本文是基于gcc-4.9.0的源代码进行分析,std::mem_fn是C++11才加入标准的,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C语言编程中的联合体union入门学习教程

    C语言编程中的联合体union入门学习教程

    这篇文章主要介绍了C语言编程中的联合体union入门学习教程,也是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-12-12
  • C++ OpenCV裁剪图片时发生报错的解决方式

    C++ OpenCV裁剪图片时发生报错的解决方式

    在图像处理中,我们经常根据需要截取图像中某一区域做处理,下面这篇文章主要给大家介绍了关于C++ OpenCV裁剪图片时发生报错的解决方式,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • C语言函数栈帧的创建与销毁原理图解

    C语言函数栈帧的创建与销毁原理图解

    我们知道c语言中函数都是被调用的,main函数里面能调用其他函数,其实main函数也是被别的函数调用的,下面通过本文给大家分享c语言函数栈帧的创建和销毁过程,一起看看吧
    2022-05-05
  • Qt中常用对话框使用技巧及注意事项

    Qt中常用对话框使用技巧及注意事项

    Qt 为应用程序设计提供了一些常用的标准对话框,如打开文件对话框、选择颜色对话框、信息提示和确认选择对话框、标准输入对话框等,这篇文章主要给大家介绍了关于Qt中常用对话框使用技巧及注意事项的相关资料,需要的朋友可以参考下
    2024-04-04
  • 详解如何在VS2019和VScode中配置C++调用python接口

    详解如何在VS2019和VScode中配置C++调用python接口

    这篇文章主要介绍了详解如何在VS2019和VScode中配置C++调用python接口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C++实现LeetCode(99.复原二叉搜索树)

    C++实现LeetCode(99.复原二叉搜索树)

    这篇文章主要介绍了C++实现LeetCode(99.复原二叉搜索树),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++设计模式之抽象工厂模式

    C++设计模式之抽象工厂模式

    这篇文章主要介绍了C++设计模式之抽象工厂模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • VC实现ODBC数据库操作实例解析

    VC实现ODBC数据库操作实例解析

    这篇文章主要介绍了VC实现ODBC数据库操作的方法,非常有实用价值,需要的朋友可以参考下
    2014-07-07
  • C++动态内存分配(new/new[]和delete/delete[])详解

    C++动态内存分配(new/new[]和delete/delete[])详解

    这篇文章主要介绍了C++动态内存分配(new/new[]和delete/delete[])详解的相关资料,需要的朋友可以参考下
    2017-05-05

最新评论