二维地图组件开发

      很多的业务项目中,都会用到二维地图,二维地图功能简洁,并且很多在很多的业务中采用,维护难度也比三维地图小一些。而开发二维地图的开源库有QGis, Mapwingis等。

       采用mapwingis开发了一个二维地图组件,可以实现常用的地图功能。比如地图的放大,缩小,移动,添加矩形,添加圆形,测量距离,获取经纬度等常用功能。并且提供了较多的接口,方便后期二次开发和维护等。组件采用vs2015+qt5.9.8开发。

        使用地图接口的代码为:

//主要有mymap.h, mymap.cpp, main.cpp三个代码文件

//mymap.h

#pragma once

#include <QtWidgets/QDialog>
#include <QTimer>

#include "ui_mymap.h"

#include "hlMap/imapview.h"

#include "hlLinker/IEntity.h"

class CEngine;
class mymap : public QDialog
{
    Q_OBJECT

public:
    mymap(QWidget* parent = Q_NULLPTR);
    virtual ~mymap();

private slots:
    /*
    @brief 刷新兵力数据
    */
    void slotTimeout();

    /*
    @brief    鼠标在地图点击信号
    @param    btn    鼠标按键,1表示左键,2表示右键
    @param lon 经度
    @param lat 纬度
    */
    void slotMouseClicked(int btn, double lon, double lat);

    /*
    @brief    鼠标在地图双击信号
    @param    btn    鼠标按键,1表示左键,2表示右键
    @param lon 经度
    @param lat 纬度
    */
    void slotMouseDoubleClicked(int btn, double lon, double lat);

    /*
    @brief 鼠标位置改变
    @param lon 经度
    @param lat 纬度
    */
    void slotMouseMoved(double lon, double lat);

    图元信号
    /*
    @brief 兵力增加消息
    @param id 兵力ID
    */
    void slotForceJoined(unsigned int id);

    /*
    @brief 兵力删除消息
    @param id 兵力ID
    */
    void slotForceResigned(unsigned int id);

    /*
    @brief 兵力选中消息
    @param id 兵力ID
    @param selected true表示选中,false表示未选中
    */
    void slotForceSelected(unsigned int id, bool selected);

    /*
    @brief 新产生标绘
    @param id 标绘ID
    */
    void slotGraphicsAdded(unsigned int id);

    /*
    @brief 标绘删除
    @param id 标绘ID
    */
    void slotGraphicsRemoved(unsigned int id);

    /*
    @brief 标绘选中消息
    @param id 标绘ID
    @param selected true表示选中,false表示未选中
    */
    void slotGraphicsSelected(unsigned int id, bool selected);

private:
    Ui::MapTestClass ui;

    CEngine* _engine;
    QTimer _timer;

    hlLinker::EntityPtrType _pentity;

    hlgis::IMapView* _pmapview;
};
 

//mymap.cpp

#include "mymap.h"

#include <QDebug>
#include <QHBoxLayout>
#include <QMenu>
#include <QGraphicsItem>

#include "Math/Geography.h"
#include "Math/Constant.h"
#include "Math/RandomGenerator.h"

#include "Thread/Thread.h"

#include "Utility/JsonFile.h"

#include "KernelDefine.inl"

#include "hlMap/iforcemgr.h"
#include "hlMap/igraphicsmgr.h"
#include "hlLinker/IEntity.h"

#include "hlLinker/SimLinker.h"

#include "ui_mywgt.h"

#define TEST_FORCE_NUM            0

class CEngine : public Common::CThread
{
public:
    CEngine(hlgis::IForceManager* forcemgr) : _forcemgr(forcemgr) {
        Start();
    }
    virtual ~CEngine() {
        Stop();
    }

protected:
    virtual void run() {
        {// 性能测试
            for (int i = 0; i < TEST_FORCE_NUM; ++i)
            {
                hlLinker::EntityPtrType e = _forcemgr->getForce(i + 1);
                if (e == NULL) return;

                double lon = e->getLon();
                double lat = e->getLat();
                double heading = e->getHeading();

                double dlon, dlat;
                Common::dr_to_ll(lon, lat, heading, 100, dlon, dlat);
                e->setLon(dlon);
                e->setLat(dlat);
            }
        }

        _tsleep(1);
    }

private:
    hlgis::IForceManager* _forcemgr;
};

class MyWgt : public QWidget
{
public:
    MyWgt(QWidget* parent) : QWidget(parent){
        _ui.setupUi(this);
    }

private:
    Ui_mywgt _ui;

};


mymap::mymap(QWidget* parent)
    : QDialog(parent)
{
    ui.setupUi(this);

    connect(&_timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));

    //创建地图控件

    _pmapview = hlgis::create_mapview();
    //加载地图
    if (_pmapview->load())
    {
        //将地图加入窗口
        QHBoxLayout* layout = new QHBoxLayout(ui.widget);
        layout->addWidget(_pmapview->widget());
        QObject* mapview_bus = _pmapview->msgBus();

        MyWgt* mywgt = new MyWgt(_pmapview->widget());


        bool bConnect = true;
        bConnect &= (bool)connect(mapview_bus, SIGNAL(sigMouseClicked(int, double, double)),
            this, SLOT(slotMouseClicked(int, double, double)));
        Q_ASSERT(bConnect);

        bConnect &= (bool)connect(mapview_bus, SIGNAL(sigMouseDoubleClicked(int, double, double)),
            this, SLOT(slotMouseDoubleClicked(int, double, double)));
        Q_ASSERT(bConnect);

        bConnect &= (bool)connect(mapview_bus, SIGNAL(sigMouseMoved(double, double)),
            this, SLOT(slotMouseMoved(double, double)));
        Q_ASSERT(bConnect);

        bConnect &= (bool)connect(mapview_bus, SIGNAL(sigForceJoined(unsigned int)),
            this, SLOT(slotForceJoined(unsigned int)));
        Q_ASSERT(bConnect);

        bConnect &= (bool)connect(mapview_bus, SIGNAL(sigForceResigned(unsigned int)),
            this, SLOT(slotForceResigned(unsigned int)));
        Q_ASSERT(bConnect);

        bConnect &= (bool)connect(mapview_bus, SIGNAL(sigForceSelected(unsigned int, bool)),
            this, SLOT(slotForceSelected(unsigned int, bool)));
        Q_ASSERT(bConnect);

        bConnect &= (bool)connect(mapview_bus, SIGNAL(sigGraphicsAdded(unsigned int)),
            this, SLOT(slotGraphicsAdded(unsigned int)));
        Q_ASSERT(bConnect);

        bConnect &= (bool)connect(mapview_bus, SIGNAL(sigGraphicsRemoved(unsigned int)),
            this, SLOT(slotGraphicsRemoved(unsigned int)));
        Q_ASSERT(bConnect);

        bConnect &= (bool)connect(mapview_bus, SIGNAL(sigGraphicsSelected(unsigned int, bool)),
            this, SLOT(slotGraphicsSelected(unsigned int, bool)));
        Q_ASSERT(bConnect);

        //_pmapview->setOwner("zhangsan");
        _pmapview->setSyncGroup("mygroup");

        _pmapview->setEventWindowVisible(false);

        QAction* myact = _pmapview->menu()->addAction(u8"我的地图菜单");


        double lon = 120, lat = 22;

        double x, y;
        hlgis::map_to_screen(lon, lat, x, y);

        double lon1, lat1;
        hlgis::screen_to_map(x, y, lon1, lat1);

        double centerlon = 114.2081;
        double centerlat = 30.7838;

        _pmapview->centerOn(centerlon, centerlat);

        hlgis::IForceManager* forcemgr = _pmapview->forceMgr();

        // 隐藏标识为myeffect下面的原始包络
        _pmapview->setLayerVisible("effects/myeffect/self/origin", false);

        {
            _pentity = NULL;
            const char* props1 = R"({
                    "id":123,            
                    "name":"001_1",    
                    "entity":123,    
                    "iff":3,    
                    "lon":115.0,
                    "lat":21.0,
                    "alt":100.0,
                    "heading":0.0,
                    "roll":0.0,
                    "pitch":0.0})";
            hlLinker::EntityPtrType e = forcemgr->addForce(props1);


            {
                unsigned int effectid = e->addEffect(1);

                const char* estr = R"({
                        "symbol":"myeffect",
                        "fuse":true,
                        "framecolor":"#FF0000",
                        "fillcolor":"#1F00FF00",
                        "points":[["30-60#200000",3000]]})";
                e->setEffect(effectid, estr);
            }
            
            {
                const char* props = R"({
                    "id":456,            
                    "name":"001_2",    
                    "entity":123,    
                    "iff":3,    
                    "lon":116.0,
                    "lat":22.0,
                    "alt":100.0,
                    "heading":0.0,
                    "roll":0.0,
                    "pitch":0.0})";
                e = forcemgr->addForce(props);
            }

            {
                unsigned int effectid = e->addEffect(2);

                const char* estr2 = u8R"({
                        "type":2,
                        "label":"我的特效线",
                        "color":"#9F00FF00",
                        "width" : 10,
                        "src" : "123",
                        "dest" : "456"})";

                e->setEffect(effectid, estr2);
            }

            {
                unsigned int effectid = e->addEffect(1);
        /*        const char* estr = R"({
                        "symbol":"myeffect",
                        "fuse":true,
                        "framecolor":"#FF0000",
                        "fillcolor":"#1F00FF00",
                        "points":[[500000,500000,500000,500000,500000,300000,300000,300000,300000,300000,300000,300000,300000,300000,300000,300000,300000,350000,350000,350000,350000,350000,350000,350000,3000]]})";*/

                const char* estr = R"({
                        "symbol":"myeffect",
                        "fuse":true,
                        "framecolor":"#FF0000",
                        "fillcolor":"#1F00FF00",
                        "points":[[300000,300000,300000,300000,"30-60#500000","80-160#100000",3000]]})";
                e->setEffect(effectid, estr);
            }
            
            _pentity = e;
            int nTest = 0;


        }

        {
            Common::CUniformDistributionRandom lonrand, latrand, headingrand;
            lonrand.Input(-180, 180);
            latrand.Input(-90, 90);

            //lonrand.Input(90, 130);
            //latrand.Input(0, 60);
            headingrand.Input(0, 360);
            for (int i = 0; i < TEST_FORCE_NUM; ++i)
            {
                double lon = lonrand.Generate();
                double lat = latrand.Generate();

                double heading = headingrand.Generate();

                char props[1024];
                _tsprintf(props, R"({
                            "id":%d,        
                            "name":"J-10_1",        
                            "entity":460,    
                            "iff":%d,    
                            "lon":%f,
                            "lat":%f,
                            "alt":0,
                            "heading":%f,
                            "roll":0.0,
                            "pitch":0.0})", i + 1, i % 7 + 1, lon, lat, heading);
                hlLinker::EntityPtrType e = forcemgr->addForce(props);

    
            }

            _engine = new CEngine(forcemgr);
        }

        hlgis::IGraphicsManager* graphicsmgr = _pmapview->graphicsMgr();
        {
            const char* props = R"({
                    "id":555,            
                    "name" : "area_1",    
                    "type" : "area",        
                    "shape" : {
                        "framecolor": "#FF0000",
                        "fillcolor" : ""
                    },
                    "anchors" : [
                        {"lon": 120, "lat" : 22},
                        {"lon": 120, "lat" : 21},
                        {"lon": 119, "lat" : 21},
                        {"lon": 119, "lat" : 22}
                    ]})";

            //hlLinker::GraphicsPtrType ovl = graphicsmgr->addGraphics(props);

            int nTest = 0;
        }

        {
            //const char* props = R"({
            //        "id":0,            
            //        "type" : "route",        
            //        "shape" : {
            //            "framecolor": "#FF0000",
            //            "fillcolor" : ""
            //        },
            //        "anchors" : [
            //            {"lon": 115.0, "lat" : 21.0},
            //            {"lon": 120, "lat" : 22}
            //        ]})";

            const char* props = R"({
                    "type" : "route",        
                    "shape" : {
                        "framecolor": "#FF0000",
                        "fillcolor" : ""
                    }})";

            //hlLinker::GraphicsPtrType ovl = graphicsmgr->addGraphics(props);
            //ovl->addAnchor(115, 21, 0);
            //ovl->addAnchor(120, 22, 0);


            int nTest = 0;
        }

        //_timer.start(1000);
    }
}

mymap::~mymap()
{

}

void mymap::slotTimeout()
{
    {// 单例功能测试
        if (_pentity == NULL) return;

        double lon = _pentity->getLon();
        double lat = _pentity->getLat();
        double heading = _pentity->getHeading();

        double dlon, dlat;
        Common::dr_to_ll(lon, lat, heading, 1000, dlon, dlat);
        _pentity->setLon(dlon);
        _pentity->setLat(dlat);
    }
}

void mymap::slotMouseClicked(int btn, double lon, double lat)
{

}

void mymap::slotMouseDoubleClicked(int btn, double lon, double lat)
{

}

void mymap::slotMouseMoved(double lon, double lat)
{

}

void mymap::slotForceJoined(unsigned int id)
{

}

void mymap::slotForceResigned(unsigned int id)
{

}

void mymap::slotForceSelected(unsigned int id, bool selected)
{

}

void mymap::slotGraphicsAdded(unsigned int id)
{

}

void mymap::slotGraphicsRemoved(unsigned int id)
{

}

void mymap::slotGraphicsSelected(unsigned int id, bool selected)
{

}
 

//main.cpp

#include "mymap.h"
#include <QtWidgets/QApplication>

#include <QTextCodec>

#include "Log/TxtLog.h"
#include "Utility/OSHelper.h"

#include "Qt/qtCommon.h"


int main(int argc, char* argv[])
{
    SYSTEM_LOG_RENAME("map-test");

    //支持中文格式
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("system"));

    // 加入插件路径

    std::string home = Common::env_value("DBDK_HOME");
    if (home.empty())home = ".";

    QString lib_path = UDQ_L8(home.c_str()) + ("/plugins");
    QGuiApplication::addLibraryPath(lib_path);
    QGuiApplication::addLibraryPath(lib_path + "/platforms");
    QGuiApplication::addLibraryPath(lib_path + "/sqldrivers");
    QGuiApplication::addLibraryPath(lib_path + "/imageformats");
    QApplication a(argc, argv);

    mymap w;
    w.showMaximized();
    return a.exec();
}
 

//运行后的界面如下:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter事务控制器聚合报告

Jmeter 事务控制器。 在Jmeter中&#xff0c;默认一个取样器就是一个事务 事务控制器控制其子集取样器&#xff0c;合并为一个事务 添加&#xff1a;逻辑控制器/Logic Controller -> 事务控制器/Transaction Controller TPS: 服务器每秒处理的事务数 在事务控制器下添加多…

Http与Tcp协议的原理以及应用

OSI七层模型和相关协议 七层模型从上到下如下所示&#xff1a; 应用层&#xff1a;负责应用之间的通信&#xff0c;处理请求和响应的具体格式表示层&#xff1a;对于数据格式进行处理会话层&#xff1a;负责建立和断开通信连接&#xff0c;传输层&#xff1a;负责建立端口之间…

gdal平面几何空间关系

关于平面几何的空间关系判定&#xff0c;gdal提供了8个函数&#xff0c;分别是&#xff1a;Intersects&#xff08;相交&#xff09;&#xff0c;Equals&#xff08;相等&#xff09;&#xff0c;Disjoint&#xff08;不相交&#xff09;&#xff0c;Touches&#xff08;接触&a…

LeetCode做题总结 15. 三数之和、18. 四数之和 (Java)

不会做&#xff0c;参考了代码随想录和力扣官方题解&#xff0c;对此题进行整理。 X数之和 15. 三数之和代码思路20240103重写错误1错误2Java语言点总结 18. 四数之和代码思路20240104&#xff08;伪&#xff09;错误1 第一次剪枝错误2 第二次剪枝错误3 溢出 15. 三数之和 代码…

C#使用纯OpenCvSharp部署yolov8-pose姿态识别

【源码地址】 github地址&#xff1a;https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov8-Pose算法是一种基于深度神经网络的目标检测算法&#xff0c;用于对人体姿势进行准确检测。该算法在Yolov8的基础上引入了姿势估计模块&#xff0c;通过联合检测和姿势…

vue icon 本地正常 线上打包失败变乱码

出现这个原因是因为sass解析的问题 Node版本高的话可以通过升级sass版本 并且配置vue.config规避这个问题 //给sass配置的东西 这个对应的版本是sass 1.39.0 本人node版本v14 升级sass版本后出现报错css: {loaderOptions: {scss: {additionalData: import "/styles/var…

网络请求 - 异步编程详解

一、概述 网络管理模块主要提供以下功能&#xff1a; HTTP数据请求&#xff1a;通过HTTP发起一个数据请求。WebSocket连接&#xff1a;使用WebSocket建立服务器与客户端的双向连接。Socket连接&#xff1a;通过Socket进行数据传输。 HTTP和WebSocket都是啥&#xff1f; 比如我…

速记计算机网络传输介质分类

计算机网络中的传输介质是指用于在不同设备之间传递数据的物理媒介。传输介质的选择对于网络的性能和可靠性至关重要。在计算机网络中&#xff0c;常见的传输介质可以分为有线传输介质和无线传输介质两类。本文将对这两类传输介质进行详细的分类和介绍。 一、有线传输介质 有…

外包干了4个月,技术退步明显了...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四…

[C]jupyter中使用C

[C]jupyter中使用C 安装使用用处 安装 https://github.com/brendan-rius/jupyter-c-kernel 下拉找到3条命令&#xff0c;装就可以了 mac和linux可用 python3可用&#xff0c; 2不可以 第二条命令可以改为 : python3 install_c_kernel 小总结&#xff1a;如果有问题&#xff0…

Merge还是Rebase?这次终于懂了

《Git分支管理&#xff1a;Merge还是Rebase&#xff1f;》 导语&#xff1a; 在Git的分支管理中&#xff0c;Merge和Rebase是两种常见的合并策略&#xff0c;每一种都有其优劣之处。究竟应该选择Merge还是Rebase&#xff0c;取决于项目的需求和团队的工作流程。本文将深入探讨…

echarts 仪表盘进度条 相关配置

option {series: [{type: gauge,min: 0,//最大值max: 100, //最小值startAngle: 200,//仪表盘起始角度。圆心 正右手侧为0度&#xff0c;正上方为90度&#xff0c;正左手侧为180度。endAngle: -20,//仪表盘结束角度splitNumber: 100, //仪表盘刻度的分割段数itemStyle: {color…

WPF 使用矢量字体图标

矢量字体图标 在WPF项目中经常需要显示图标&#xff0c;但是项目改动后&#xff0c;有时候需要替换和修改图标&#xff0c;这样非常麻烦且消耗开发和美工的时间。为了快速开发项目&#xff0c;节省项目时间&#xff0c;使用图标矢量字体图标是一个非常不错的选择。 矢量字体图标…

【java爬虫】首页显示沪深300指数走势图以及前后端整合部署方法

添加首页 本文我们将在首页添加沪深300指数成立以来的整体走势数据展示&#xff0c;最后的效果是这样的 单独贴一张沪深300整体走势图 我感觉从总体上来看指数还是比较稳的&#xff0c;没有特别大的波动&#xff0c;当然&#xff0c;这只是相对而言哈哈。 首先是前端页面 &l…

C++性能优化- perf 和火焰图的安装使用

工欲善其事必先利其器&#xff0c;要想做Linux下的程序性能优化&#xff0c;就得先知道当前性能的瓶颈在哪里。 这里主要介绍一下常用的工具&#xff1a;perf工具和火焰图的使用方法 本文中的命令都是自己在Ubuntu18.04系统上测试可用的&#xff0c;在其他系统可能会需要不同的…

数据库的连接

连接数据库 我们使用WinR输入cmd打开运行窗口 输入:sqlplus并回车 输入用户名和密码,我用的是Scott,密码我自己设置的123456,Scott默认的密码是tiger,回车 这种情况表示登录成功 在连接Scott成功的情况下创建一些数据,在我的资源里面有个Oracle数据基础可以下载,直接复制粘…

HarmonyOS 开发基础(六)Slider

HarmonyOS 开发基础&#xff08;六&#xff09;Slider Entry Component struct Index {build() {Row() {Column() {// Slider&#xff1a;ArkUI 的基础组件 滑动条组件// options 参数&#xff1a;Slider 基础设置Slider({// 最小值min: 20,// 最大值max: 200,// 当前值value: …

使用Spring Retry优雅的实现业务异常重试

在系统中经常遇到业务重试的逻辑&#xff0c;比如三方接口调用&#xff0c;timeout重试三遍&#xff0c;异常处理重试的兜底逻辑等。那你是不是还在用下面这种方式呢&#xff1a; 我想大家可能很多时候也会这么写&#xff0c;这是能想到的第一个方法&#xff0c;但是我们这段代…

AP2813 双路降压恒流驱动IC 一路内置1A一路外置3A LED储能指示灯线路

产品描述 AP2813 是一款双路降压恒流驱动器,高效率、简单、内置功率管&#xff0c;适用于 5-80V 输入的高精度降 压 LED 恒流驱动芯片。内置功率管输出功率可达 12W&#xff0c;电流 1.2A。 AP2813 一路直亮&#xff0c;另外一路通过 MODE1 切换 全亮&#xff0c;爆闪。AP2813…

嵌入式(四)定时器 | 定时器功能 分类 定时器工作模式 寄存器全介绍

文章目录 1 定时器工作原理2 定时器功能3 定时器分类3.1 定时器13.2 定时器23.3 定时器3和定时器43.4 睡眠定时器3.5 看门狗定时器 4 定时器工作模式4.1 自由运行模式4.2 模模式4.3 正计数/倒计数模式 5 定时器1寄存器5.1 计数寄存器5.2 计数控制寄存器 6 定时器的两种使用方式…