如何建立一个学校网站,广州建设工程信息网站,wordpress如何更换空间,多伦多网站建设多少钱实习三 地图符号库操作
3.1 任务要求
基于QGIS#xff0c;实现地图符号的设计/存储与显示#xff1b;基于QGIS实现一个点、线、面shp矢量图层文件的显示。通过设置引用的符号#xff0c;改变矢量图层的显示效果#xff1b;可编辑地图的符号库汇中的点符号、线符号、面符号…实习三 地图符号库操作
3.1 任务要求
基于QGIS实现地图符号的设计/存储与显示基于QGIS实现一个点、线、面shp矢量图层文件的显示。通过设置引用的符号改变矢量图层的显示效果可编辑地图的符号库汇中的点符号、线符号、面符号和颜色表。
3.2 完成过程
3.2.1 地图符号库实现技术
在QGIS中地图符号库的设计、存储和现实等功能的实现主要应用到了 QgsSymbol 类和QgsMarkerSymbolLayer类。这里QgsSymbol类主要是用于呈现符号的抽象基类经常和QgsMarkerSymbolLayer类搭配使用。而QgsMarkerSymbolLayer类标记符号层的抽象基类也经常和QgsSymbol类搭配使用。
显然 QgsSymbol 类和QgsMarkerSymbolLayer类一个用于标记一个用于呈现。
通过QgsSymbol类的继承关系不难发现可以呈现点、线、标记等如图3.2.1-1所示。 图3.2.1-1 QgsSymbol类的继承关系
与之相搭配的QgsMarkerSymbolLayer类的继承关系如图3.2.1-2所示。 图3.2.1-2 QgsMarkerSymbolLayer类的继承关系
接下来我们就如何实现基于QGIS二次开发实现地图符号库操作给出详细过程。
3.2.2 地图符号库实现过程
这里我们首先打开项目的ui文件在主界面添加需要使用的QAction控件分别为“自定义符号管理”、“qgs符号管理”、“更改矢量符号显示”。为了便于代码的编辑将添加的按钮的objectName分别命名为“actionSelfStylelibMng”、“actionQgsStylelibMng”、“actionChgSymbolRender”。操作如图3.2.2-1所示。 图3.2.2-1 对ui进行操作
将设定的ui进行保存后即可回到Visual Studio中对相应的代码进行适当的编辑。
首先需要进入头文件中定义必要的函数这是由于QT的信号与槽的机制必须要进行信号与槽的相关绑定这里我们主要预先声明了两个函数分别是“void on_actionSelfStylelibMng_triggered()”和“void on_actionQgsStylelibMng_triggered()”。如图3.2.2-2所示。 图3.2.2-2 声明函数
接下来需要对声明的函数进行详细的定义。on_actionSelfStylelibMng_triggered()函数通过调用“Smart3dMap::S3d_StyleManagerLib::getSingletonPtr()-excuteSysStyleManager()”来执行系统样式管理器使用第三方库 Smart3dMap 中的 S3d_StyleManagerLib 类的单例模式对象调用 excuteSysStyleManager() 方法用于调用自定义样式库管理器。
on_actionQgsStylelibMng_triggered()函数主要加载用户样式库路径中的样式并通过 QgsStyleManagerDialog 展示一个 QGIS 的样式管理对话框。并且在调用的过程中创建或访问一个静态的 QgsStyle 对象同时确保样式库只加载一次避免重复初始化。操作如图3.2.2-3所示。 图3.2.2-3 定义函数
需要说明的是这里的符号库的设计和使用都属于是二次窗口在QGIS中的调用也是独立于一级主窗口。因此这里可以通过git拉取所需的符号设计库的方法进行调用将QGIS设计完好的二次开发ui和逻辑在自己的系统中进行直接的调用如图3.2.2-4所示。 图3.2.2-4 设计ui文件
同样的拉取的还有需要的头文件和执行文件如图3.2.2-5所示。 图3.2.2-5 拉取的执行文件
进行完如上步骤编译即可得到相应的融合了地图符号库的系统如图3.2.2-6所示。 图3.2.2-6 系统界面
3.3 结果展示
完成3.2部分的系统构建后我们便可以使用系统的地图符号库了打开“自定义符号管理”可以看到这里可以实现地图符号的设计、存储与显示。如图3.3-1所示。 图3.3-1 自定义符号管理
这里我们也可以进行符号导入操作打开“qgs符号管理”依次点击【Import/Export】-【Import】-【File】将从QGIS提供的官方符号库下载的“”符号文件导入即可得到改XML符号文件中所得的符号标记如图3.3-2所示。 图3.3-2 修改XML符号标记
点击想要导入的符号再点击“Import”即可导入在“All”中即可观察到刚刚导入的符号如图3.3-3所示。 图3.3-3 导入的符号显示
同样这里也可以通过点击“更改符号系统显示”实现符号的更改如图3.3-4所示。 图3.3-4 更改符号系统的显示
同样当我们点击【矢量符号】-【qgs符号系统】也可以实现地图的符号库汇中的点符号、线符号、面符号和颜色表的编辑操作如图3.3-5所示。 图3.3-5 符号修改
3.4 关键代码
这里的关键代码是针对符号库的打开操作和调用操作。
具体代码的功能主要是on_actionSelfStylelibMng_triggered()函数通过调用“Smart3dMap::S3d_StyleManagerLib::getSingletonPtr()-excuteSysStyleManager()”来执行系统样式管理器使用第三方库 Smart3dMap 中的 S3d_StyleManagerLib 类的单例模式对象调用 excuteSysStyleManager() 方法用于调用自定义样式库管理器。
on_actionQgsStylelibMng_triggered()函数主要加载用户样式库路径中的样式并通过 QgsStyleManagerDialog 展示一个 QGIS 的样式管理对话框。并且在调用的过程中创建或访问一个静态的 QgsStyle 对象同时确保样式库只加载一次避免重复初始化。
源代码如下
//打开qgs样式库
void YLGIS::on_actionSelfStylelibMng_triggered()
{Smart3dMap::S3d_StyleManagerLib::getSingletonPtr()-excuteSysStyleManager();
}
//打开样式管理器
void YLGIS::on_actionQgsStylelibMng_triggered()
{//显示属性表static QgsStyle style;if (style.symbolCount() 0){sqlite3_initialize();style.load(QgsApplication::userStylePath());}QgsStyleManagerDialog* dlg new QgsStyleManagerDialog(style);dlg-show();
}
//自定义符号库
#include S3dmStyleManager.h
#include qgsapplication.h
#include qgsmarkersymbollayer.h
#include qgsfillsymbollayer.h
#include qfiledialog.h
#include QgsSymbolLayerRegistry.h
#include QgsApplication.h
#include qgsfillsymbollayer.h
#include qmessagebox.h
#include qgsvectorlayer.h
#include S3dmSymbolManager.h
#include S3dmApplySymbolDlg.h
QgsStyle Smart3dMap::S3dmStyleManager::m_style;
Smart3dMap::S3dmStyleManager::S3dmStyleManager()
{
}
Smart3dMap::S3dmStyleManager::~S3dmStyleManager()
{
}
bool Smart3dMap::S3dmStyleManager::initStyle()
{sqlite3_initialize();return m_style.load(QgsApplication::userStylePath());
}
QgsStyle * Smart3dMap::S3dmStyleManager::getS3dmStyle()
{if (m_style.symbolCount() 0){initStyle();}return m_style;
}
QgsSymbol * Smart3dMap::S3dmStyleManager::getSymbol(std::string name)
{if (m_style.symbolCount() 0){initStyle();}return m_style.symbol(QString::fromLocal8Bit(name.c_str()));
}
QgsSymbol * Smart3dMap::S3dmStyleManager::getSymbol(std::string name, const QColor color)
{if (m_style.symbolCount() 0){initStyle();}QgsSymbol* oriSymbol m_style.symbol(QString::fromLocal8Bit(name.c_str()));if (oriSymbol nullptr){return nullptr;}QgsSymbol* symbol oriSymbol-clone();//添加一个背景图层QgsSymbol::SymbolType qgsType symbol-type();if (qgsType ! QgsSymbol::SymbolType::Line){if (qgsType QgsSymbol::SymbolType::Marker){QgsSimpleMarkerSymbolLayer *simplelayer new QgsSimpleMarkerSymbolLayer();simplelayer-setColor(color);simplelayer-setStrokeStyle(Qt::PenStyle::NoPen);symbol-insertSymbolLayer(0,simplelayer);}else if (qgsType QgsSymbol::SymbolType::Fill){QgsSimpleFillSymbolLayer *simplelayer new QgsSimpleFillSymbolLayer();simplelayer-setColor(color);simplelayer-setStrokeStyle(Qt::PenStyle::NoPen);symbol-insertSymbolLayer(0, simplelayer);}}return symbol;
}
// -------------------------------- 材质管理对象 --------------- //
Smart3dMap::S3d_StyleManagerLib * Smart3dMap::S3d_StyleManagerLib::getSingletonPtr()
{static S3d_StyleManagerLib instance;return instance;
}
void Smart3dMap::S3d_StyleManagerLib::excuteSysStyleManager()
{S3dmSymbolManager* geo3dStyleManager new S3dmSymbolManager();if (geo3dStyleManager nullptr){geo3dStyleManager new S3dmSymbolManager(nullptr);geo3dStyleManager-setObjectName(excuteSysStyleManager);geo3dStyleManager-setWindowFlags(geo3dStyleManager-windowFlags() | Qt::Dialog);}geo3dStyleManager-show();
}
__int64 Smart3dMap::S3d_StyleManagerLib::excuteSysStyleSelector()
{S3dmSymbolManager* geo3dStyleManager new S3dmSymbolManager();QgsStyle* qStyle QgsStyle::defaultStyle();if (geo3dStyleManager nullptr){QString dbpath QgsApplication::userStylePath();qStyle-load(dbpath);}else{qStyle geo3dStyleManager-getStyle();if (qStyle nullptr){return 0;}}S3dmApplySymbolDlg dlg(qStyle, nullptr, S3dmApplySymbolDlg::symbolType::POLYGON, NULL);int res dlg.exec();if (res QDialog::Accepted){return (__int64)dlg.getSymbol();}else{return 0;}return 0;
}
Smart3dMap::S3d_StyleManagerLib::S3d_StyleManagerLib()
{
}
Smart3dMap::S3d_StyleManagerLib::~S3d_StyleManagerLib()
{
}