大体上为:创建一个shp临时文件(也可以根据getSaveFileName()选取的路径生成shp文件),为其添加fields、geometry啥的,之后根据自己定义的工具重写鼠标事件获取xy坐标或直接手写坐标,创建要素,将几何点设置为要素,并设置要素属性,最后将点要素添加到矢量层即可。
一、创建shp图层
//创建空的shp临时文件
QString name = "temp";
QgsFields fields = QgsFields();
QString mAttributeName = "id";
QString typeName = "integer";
int width = 10;
QVariant::Type fieldType = QVariant::String;
QgsField field = QgsField(mAttributeName, fieldType, typeName, width, 0);
fields.append(field);
QgsWkbTypes::Type geometrytype = QgsWkbTypes::MultiPoint;
//也可以是Point/LineString/Polygon
//可以在qgswkbtypes.h中找到枚举Type
//创建shp临时文件
QgsVectorLayer* vLayer = QgsMemoryProviderUtils::createMemoryLayer(name, fields,
geometrytype, QgsProject::instance()->defaultCrsForNewLayers());
//下面这个是在fileName路径下创建shp文件
/*QgsOgrProviderUtils::createEmptyDataSource(fileName, fileformat, enc,
geometrytype, attributes, srs, errorMessage);
这是定义:
static bool createEmptyDataSource( const QString &uri,
const QString &format,
const QString &encoding,
QgsWkbTypes::Type vectortype,
const QList< QPair<QString, QString> > &attributes,
const QgsCoordinateReferenceSystem &srs,
QString &errorMessage );*/
QList< QgsMapLayer* > layers;
layers << vLayer ;
QgsProject::instance()->addMapLayers(layers);
二、自定义工具类,重写鼠标事件以获取坐标
MapToolAddFeature.cpp
继承QgsMapToolDigitizeFeature类
class MapToolAddFeature : public QgsMapToolDigitizeFeature
mainwindow.cpp
在canvas中,需要使用时,setMapTool()
MapToolAddFeature* mAddFeature = new QgsMapToolAddFeature(mapCanvas, QgsMapToolCapture::CaptureNone);
mapCanvas->setMapTool(mAddFeature);