QGC中地图
来源:互联网 发布:猎趣钓鱼网站源码 编辑:程序博客网 时间:2024/06/08 00:04
QGCLocationPlugin
定义了QGCLocationPlugin.pri文件,这个文件包含QtLocationPlugin文件夹里面的头文件和源文件
在main.cc文件中,include “QGCMapEngine.h”,这个头文件与Qt项目中总体头文件不在一个目录中,但是之所以能直接包含,就是因为在.pro文件中include QGCLocationPlugin.pri。
main.cc中getQGCMapEngine()
在main.cc中使用了这个getQGCMapEngine()->init(),不是对象或者类调用,经过追代码发现是在QGC。
extern QGCMapEngine * getQGCMapEngine();extern void destroyMapEngine();
1️⃣当extern 与C一起使用,如extern “C” void func(int a,int b);则告诉编译器在编译func这个函数名字的时候;
2️⃣当extern 不与C一起使用的时候,如在头文件extern int g_int,它的作用就是声明函数或者全局变量,其声明的函数和变量可以在本模块或者其他模块中使用。是声明而不是定义。
QGCMapEngine.cpp中定义了
kMapTypes[]={}
kMapboxTypes[]={}
kEsriTypes[]={}
getQGCMapEngine()
static QGCMapEngine *kMapEngine=null; QGCMapEngine *getQGCMapEngine(){ if(!kMapEngine) kMapEngine=new QGCMapEngine(); return kMapEngine; }
destroyMapEngine()
void destroyMapEngine()(){ if(kMapEngine) kMapEngine=null; }
地图的表示
struct stQGeoTileCacheQGCMapTypes{ const char * name; UrlFactory::Maptype type; }
QGCMapEngine
//构造方法中给_urlFactory赋值 QGCMapEngine::QGCMapEngine():_urlFactory(new UrlFactory()) _userAgent() ,_maxDiskCache(0) ,_prunning(false) ,_cacheWasReset(false) ,_isInternetActive(false) //注册 qRegisterMetaType<QGCMapTask::TaskType>(); qRegisterMetaType<QGCTile>(); qRegisterMetaType<QList<QGCTile *>>(); //信号与槽的连接 connect(&_worker,&QGCCacheWorker::updateTotals,this,&QGCMapEngine::_updateTotals); connect(&_worker,&QGCCacheWorker::internetStatus,this,&QGCMapEngine::_internetStatus);
QGCMapEngine析构方法
QGCMapEngine::~QGCMapEngine(){ _worker.quit(); _worker.wait(); if(_urlFactory) delete _urlFactory; }
加载地图的init()
void QGCMapEngine::init(){ _wipeOldCache(); ... //设置地图缓存目录 ... QGCMapTask *task=new QGCMapTask(QGCMapTask::taskInit); _worker.enqueueTask(task); }
从地图名称中获取类型
UrlFactroy::MapType QGCMapEngine::getTypeFromName(const QString &name){ size_t i; for(i=0;i<NUM_MAPS;i++){ if(name.compare(kMapTypes[i].name,Qt::CaseInsensitive)==0) return kMapTypes[i].type; } .... 如果是kMapboxType类型,那么遍历后返回 return kMapboxTypes[i].type; ... 如果是kEsriTypes类型,那么遍历后返回 kEsriTypes[i].type}//如果都不是,那么返回UrlFactory::Invalid
获得地图名称列表getMapNameList
QStringList QGCMapEngine::getMapNameList(){ QStringList mapList; for(size_t i=0;i<NUM_MAPS;i++){ mapList<<kMapTypes[i].name; } if(!qgcApp()->toolox()->settingManager()->appSettings()->mapboxToken()->rawValue().toString().isEmpty()){ for(size_t i=0;i<NUM_MAPBOXMAPS;i++){ mapList<<kMapboxTypes[i].name; } } if(!qgcApp()->toolox()->settingManager()->appSettings()->esriToken()->rawValue().toString().isEmpty()){ for(size_t i=0;i<NUM_ESRIMAPS;i++){ mapList<<kEsriTypes[i].name; } } return mapList;
QGCMapEngine中的_worker
private:
QGCCacheWorker _worker;
定义在QGCTileCacheWorker.cpp中
QGCCacheWorker::enqueueTask
class QGCCacheWorker:public QThread{ Q_OBJECTpublic: QGCCacheWorker(); ~QGCCacheWorker(); void quit(); bool enqueueTask(QGCMaoptask *task); void setDatabaseFile(const QString &path);}void QGCCacheWorker::run(){if(!_valid&&!_failed){ _init();}if(_valid){ _db=new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE",kSession)); _db->setDatabaseName(_databasePath); _db->setConnectOptions("QSQLITE_ENABLE_SHARED_CACHE"); _valid=_db->open();}while(true){ QGCMapTask* task; if(_taskQueue.count()){ _mutex.lock(); task=_taskQueue.dequeue(); _mutex.unlock(); switch(task->type()){ case QGCMapTask::taskInit break; case QGCMapTask::taskCacheTile _saveTile(task); break; ... } task->deleteLater(); //根据task数量来确定时间间隔 size_t count =_taskQueue.count(); if(count>100){ //define LONG_TIMEOUT 5 _updateTimeout=LONG_TIMEOUT; }else if(count<25){ //define LONG_TIMEOUT 2 _updateTimeout=SHORT_TIMEOUT; } } }}}
//测试网络
QGCCacheWorker::_testInternet(){QTcpSocket socket;socket.connectToHost("www.github.com",80);if(socket.waitForConnected(2500)){ qCDebug(QGCTileCacheLog)<<"Yes Internet Access"; emit internetStatus(true); return; } qWarning()<<"No Internet Access"; emit internetStatus(false);}
class QGCMapEngineData
定义了class QGCTile
class QGCTile{ public QGCTile(): :_x(0) ,_y(0) ,_z(0) ,_set(UINT64_MAX) ,_type(UrlFactory::Invalid){ }enum TyleState{ StatePending=0, StateDownloading, StateError, StateComplete};}
//定义了QGCCacheTile
class QGCCacheTile:public QObject{ Q_OBJECT }
//定义了QGCMapTask类
class QGCMapTask:public QObject{ Q_OBJECT public: enum TaskType{ taskInit, taskTestInternet, ... ... }; //构造函数,需要初始化一个值 QGCMapTask(TaskType type):_type(type){} virtual ~QGCMapTask(){} }//虚函数,C++中多态的体现virtual TaskType type(){ return _type;}
QGCMapTileSet.h
class QGCCachedTileSet:public QObject{ Q_OBJECTpublic: QGCCachedTileSet(const QString &name); ~QGCCachedTileSet();}
地图中的UrlFactory
class UrlFactory :public QObject{ Q_OBJECTpublic: enum MapType{ Invalid =-1; GoogleMap =1; ... }; UrlFactory(); ~UrlFactory();}#ifdef QGC_NO_GOOGLE_MAPS bool _googleVersionRetrived; QNetworkReply* _googleReply; ... QString _versionGoogleMap; ...#endif//BingMapsQString _versionBingMaps;
阅读全文
0 0
- QGC中地图
- QGC中地图
- QGC地图中2点连线
- QGC瓦片地图
- QGC地图上任务项
- QGC中QGCTool
- QGC中QGCTool
- QGC中QGCQmlWidgetHolder
- QGC中主界面
- QGC
- QGC中MainWindow与QML
- QGC 整体架构图
- QGC之QGCCorePlugin
- QGC的MainWindow
- QGC之qml
- QGC的MainToolBarIndicator
- QGC之qml学习
- QGC之MainWindow
- ROS发布&订阅字符串
- Vector,ArrayList,LinkedList的区别与适用场景
- 使用pymsql存取图片
- Docker中配置国内镜像
- Area in Triangle (计算几何)
- QGC中地图
- Number Sequence(不知道啥方法,不过做出来了,不容易啊)
- struts、hibernate、spring、 mybatis、 spring boot 等面试题汇总
- Android中定时执行任务的3种实现方法
- java性能优化之for循环
- zoj3705 Applications 模拟题
- android shape的使用详解
- ssh命令作为windows系统命令
- 0818 T2 gloves