尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

QGIS与QT二次开发实战指南

QGIS与QT二次开发实战指南 1. QGISQT二次开发概述QGIS作为开源地理信息系统结合QT跨平台框架的二次开发能力为地理信息应用开发提供了强大工具链。我曾在智慧城市项目中采用这套技术栈开发过巡检系统实测下来这套组合既能利用QGIS成熟的地理数据处理能力又能通过QT实现定制化的用户界面和业务逻辑。当前最新稳定版本QGIS 3.34配合QT 5.15.2是较优选择。开发环境建议使用Windows/macOS/Linux均可QT Creator 4.11作为IDECMake 3.5构建系统QGIS SDK对应版本2. 开发环境搭建要点2.1 QT安装避坑指南从QT官网下载在线安装器时务必勾选以下组件QT 5.15.2主模块MSVC 2019编译器WindowsQT Charts模块可视化必备Debugging Tools调试工具注意国内用户建议使用清华镜像源加速下载避免官网直连超时2.2 QGIS SDK配置下载对应版本的QGIS SDK开发包设置环境变量# Windows示例 set QGIS_PREFIX_PATHC:\Program Files\QGIS 3.34 set PATH%QGIS_PREFIX_PATH%\bin;%PATH%在CMakeLists.txt中添加find_package(QGIS REQUIRED) include_directories(${QGIS_INCLUDE_DIRS}) link_directories(${QGIS_LIBRARY_DIRS})3. 核心功能开发实战3.1 地图视图集成继承QgsMapCanvas实现自定义地图控件class CustomMapCanvas : public QgsMapCanvas { public: explicit CustomMapCanvas(QWidget* parent nullptr) : QgsMapCanvas(parent) { setCanvasColor(Qt::white); enableAntiAliasing(true); } void loadVectorLayer(const QString shpPath) { QgsVectorLayer* layer new QgsVectorLayer(shpPath, QFileInfo(shpPath).baseName(), ogr); if(!layer-isValid()) { qWarning() 图层加载失败: layer-error().message(); return; } setLayers(QListQgsMapLayer*() layer); zoomToFullExtent(); } };3.2 插件开发框架创建QGIS插件的基本结构MyPlugin/ ├── CMakeLists.txt ├── metadata.txt ├── myplugin.cpp └── myplugin.h关键接口实现示例void MyPlugin::initGui() { mAction new QAction(QIcon(:/icons/icon.png), tr(我的插件), this); connect(mAction, QAction::triggered, this, MyPlugin::run); mToolBar qobject_castQgsInterface*(iface)-addToolBar(tr(工具条)); mToolBar-addAction(mAction); } void MyPlugin::run() { QgsMessageLog::logMessage(插件执行, MyPlugin); // 业务逻辑实现 }4. 典型问题解决方案4.1 中文乱码处理在main.cpp中添加编码设置#include QTextCodec int main(int argc, char *argv[]) { QApplication app(argc, argv); QTextCodec::setCodecForLocale(QTextCodec::codecForName(UTF-8)); // ... }4.2 跨平台兼容性处理不同系统的路径差异QString getConfigPath() { #ifdef Q_OS_WIN return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); #else return QStandardPaths::writableLocation(QStandardPaths::ConfigLocation); #endif }5. 性能优化技巧5.1 图层渲染加速对于大数据量矢量图层layer-setRenderer(QgsSingleSymbolRenderer(new QgsFillSymbol())); layer-setSimplifyMethod(QgsVectorSimplifyMethod()); layer-setSimplifyHints(QgsVectorLayer::GeometrySimplification);5.2 内存管理要点使用QPointer管理QObject派生类对象及时释放不再使用的QgsMapLayer对大型栅格数据使用金字塔构建gdaladdo -r average large.tif 2 4 8 166. 项目实战经验在最近的气象数据可视化项目中我们实现了多线程数据加载QgsTask动态热力图渲染QgsHeatmapRenderer三维地形展示Qgs3DMapCanvas关键代码片段// 异步任务示例 QgsTask* task new QgsTask(tr(数据处理), QgsTask::CanCancel); connect(task, QgsTask::taskCompleted, this, [](){ QgsMessageLog::logMessage(任务完成, MyPlugin); }); QgsApplication::taskManager()-addTask(task);7. 调试与打包部署7.1 常见错误排查Could not find Qt platform plugin错误 确保plugins/platforms目录与可执行文件同级符号链接问题Linux/macOS 使用patchelf修正rpathpatchelf --set-rpath $ORIGIN/../lib myapp7.2 打包发布方案Windows使用windeployqtwindeployqt --qmldir qml myapp.exeLinux创建AppImagelinuxdeployqt myapp -appimage -qmake/path/to/qmake8. 扩展开发建议结合QML实现现代化UIMapCanvas { id: map anchors.fill: parent layers: [ vectorLayer ] MouseArea { anchors.fill: parent onClicked: console.log(map.toMapCoordinates(mouse.x, mouse.y)) } }集成Python脚本from qgis.core import * from qgis.gui import * def analyze_data(): layer iface.activeLayer() stats layer.dataProvider().uniqueValues(0) print(f唯一值数量: {len(stats)})
返回列表