目录
1 前言
最近在研究gis相关的开发,之前使用arcgis进行二次开发,虽然arcgis的文档很丰富,demo功能也比较全,实例代码也都有,可无奈的是,arcgis的桌面版只支持x86平台,由于我的项目涉及到的是arm平台的,只能再找一个能同时支持x86和arm的gis开发库了。
通过网上搜索,最后发现QGIS用的比较多,而且是开源的,于是就选择使用QGIS来进行开发了,但QGIS的资料真的是很少,比arcgis还少,没办法,自己研究吧。
图层的添加,要素的添加,这些都是基本的,baidu一搜一大堆,我这里就不说了。此文主要来说一下如果对图层中的要素进行移动。
2 开发环境
Qt 5.12.12+QGIS 3.10+Win11
编译器选择vs2017(msvc2017_64bit)
3 添加要素
首先,我们先在QGIS desktop中导入一张shp图层,如下图:
代码如下:
void MainWindow::addVectorLayer(const QString& path)
{
QString fileName;
if (path.isEmpty())
{
fileName = QFileDialog::getOpenFileName(this, tr("Open shape file"), "", "*.shp");
if(fileName.isNull())//如果未选择文件则返回
return;
}
else
{
fileName = path;
}
QFileInfo info(fileName);
QString basename = info.baseName();
qDebug()<<"basename:"<<basename;
// 创建矢量图层
QgsVectorLayer* vecLayer = new QgsVectorLayer(fileName, basename, "ogr");
if (!vecLayer->isValid())
{
QMessageBox::critical(this, "error", QString("layer is invalid: \n") + fileName);
return;
}
// 缩放至图层区域
m_mapCanvas->setExtent(vecLayer->extent());
mlayers.append(vecLayer);
m_mapCanvas->setLayers(mlayers);
m_mapCanvas->refresh();
// 设置坐标系,坐标系以导入的shp文件为准
vecLayer->setCrs(QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem::EpsgCrsId));
// 设置当前图层
m_mapCanvas->setCurrentLayer(vecLayer);
}
导入之后运行效果如下:
4 如何移动要素
接下来说一下如何移动要素。通过参考QGIS Desktop工具上的工具栏,可以发现要素操作的工具栏,见下图:
小白会问,怎么我的工具栏是灰色的不能点啊,那是因为需要先开启编辑状态,按下按钮
然后就元素工具栏就点亮了。然后我们就可以点击移动要素按钮,对图层的要素进行移动了。如下:
网上资料比较多的都是说如何识别选择的要素,或者如何选择要素,这明显不是我们想要的,但提供了思路,就是这些工具按钮,都是通过QgsMapTool这个类来实现的,既然网上没有,那就看源码吧,最后通过文件搜索关键字move feature,在源码的\src\app\目录下发现了qgsmaptoolmovefeature.cpp这个文件,就是QGIS上的移动要素的类,我们打开看一下代码:
qgsmaptoolmovefeature.h
/***************************************************************************
qgsmaptoolmovefeature.h - map tool for translating features by mouse drag
---------------------
begin : Juli 2007
copyright : (C) 2007 by Marco Hugentobler
email : marco dot hugentobler at karto dot baug dot ethz dot ch
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version.