QGIS二次开发:如何将图层导出为shp文件

图层导出为shp文件

1.QgsVectorFileWriter类

QgsVectorFileWriter类位于qgsvectorfilewriter.h中,可以将矢量图层写入磁盘,支持多种写入格式,如shapefiles、geopackage、Posrgres SQL。

有两种方法来使用该类:

  1. 直接调用static接口QgsVectorFileWriter::writeAsVectorFormat(…)将整个矢量图层保存。
  2. 创建该类的实例,并调用addFeature(…)

writeAsVectorFormat(…)

该接口有三个版本,writeAsVectorFormat(…)为第一版,writeAsVectorFormatV2(…)为第二版,用以代替writeAsVectorFormat(…)。从QGIS3.20开始,使用writeAsVectorFormatV3(…)代替了writeAsVectorFormatV2(…)

writeAsVectorFormatV3()

    /**
     * Writes a layer out to a vector file.
     * \param layer source layer to write
     * \param fileName file name to write to
     * \param transformContext coordinate transform context
     * \param options save options
     * \param newFilename potentially modified file name (output parameter)
     * \param newLayer potentially modified layer name (output parameter)
     * \param errorMessage will be set to the error message text, if an error occurs while writing the layer
     * \returns Error message code, or QgsVectorFileWriter.NoError if the write operation was successful
     * \since QGIS 3.20
     */
    static QgsVectorFileWriter::WriterError writeAsVectorFormatV3( QgsVectorLayer *layer,
        const QString &fileName,
        const QgsCoordinateTransformContext &transformContext,
        const QgsVectorFileWriter::SaveVectorOptions &options,
        QString *errorMessage SIP_OUT = nullptr,
        QString *newFilename SIP_OUT = nullptr,
        QString *newLayer SIP_OUT = nullptr );
  • layer: 需要写入的原图层
  • fileName:写入的文件名
  • transformContext:坐标转换上下文
  • options:与保存相关的设置,如文件编码、图层元数据等。保存的目标格式也通过该对象设置。
  • errorMessage:输出参数,如果保存出错,以此返回错误信息。
  • newFilename:输出参数
  • newLayer:输出参数

QgsVectorFileWriter::SaveVectorOptions类

SaveVectorOptions为QgsVectorFileWriter的内部类,调用writeAsVectorFormat()时将该对象传入。
该类内部通过public的成员变量保存了一些设置信息:

  • driverName:驱动名称,对应了保存的格式,如:ESRI Shapefile、geopackage
  • layerName:图层名,如果为空的话,将会从文件名产生
  • fileEncoding:文件编码,如:UTF-8
  • attributes:需要导出的属性,通过该变量过滤出不需要导出的字段

2.QGIS中导出图层时的调用栈

在QgisApp的createActions()中,连接了Action的动作槽,其中包含了“图层另存为”action,槽函数调用saveAsFile()。

void QgisApp::createActions()
{
  connect( mActionLayerSaveAs, &QAction::triggered, this, [ = ] { saveAsFile(); } );
}
  1. 调用QgisApp::saveAsFile()后,判断图层类型,如果是矢量图层,则调用QgisApp::saveAsVectorFileGeneral()。
  2. 之后创建“保存”对话框QgsVectorLayerSaveAsDialog,在对话框中输入保存格式(shp文件,postgres sql语句等)、文件编码、字段、范围等信息。
  3. 通过对话框确认保存后,创建SaveVectorOptions对象,并从对话框对象获取关键数据:保存格式、文件编码、字段、范围等。
  4. 创建QgsVectorFileWriterTask对象,并将options传入,该对象由QgsApplication::taskManager()统一调度,最终会调用该对象的run()函数。
  5. 在QgsVectorFileWriterTask::run()内部调用static函数QgsVectorFileWriter::writeAsVectorFormatV2()保存矢量图层。
QgisApp::saveAsFile(...)
└─QgisApp::saveAsVectorFileGeneral(...)
    └─new QgsVectorLayerSaveAsDialog
    └─ dialog->exec()
    └─ QgsVectorFileWriter::SaveVectorOptions options;
    └─new QgsVectorFileWriterTask(...)
          └─ QgsVectorFileWriterTask::run()
                └─ QgsVectorFileWriter::writeAsVectorFormatV2
QGIS是一个功能强大的开源地理信息系统软件,它提供了许多二次开发的机会,包括导出SHP文件。下面是关于如何在QGIS中进行二次开发导出SHP文件的步骤。 首先,在进行二次开发之前,确保你已经安装了QGIS软件和开发工具。 其次,打开QGIS软件,导入你想要导出SHP文件的地理数据。这可以通过点击菜单栏中的“添加矢量图层”按钮,然后选择你的数据文件来完成。 然后,在QGIS中创建一个自定义插件或使用Python编写一个脚本来导出SHP文件。这可以通过在QGIS插件开发环境中创建一个新的插件或创建一个新的Python脚本来实现。确保你熟悉使用Python编程语言和QGIS的开发文档。 接下来,编写代码来导出SHP文件。这可以通过使用QGIS提供的矢量文件编写工具和方法来实现。例如,你可以使用`QgsVectorFileWriter`类来创建一个新的矢量文件写入器对象,并使用`writeAsVectorFormat()`方法将数据导出SHP文件。 最后,运行你的插件或脚本来导出SHP文件。这可以通过在QGIS中加载你的插件或使用Python脚本工具来运行你的脚本来实现。 通过遵循以上步骤,你就可以在QGIS中进行二次开发,并使用自定义插件或脚本实现导出SHP文件的功能。这样,你可以根据自己的需求定制导出过程,并将地理数据导出SHP格式,方便在其他地理信息系统软件中使用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值