如何指定要从QGIS导出的字段?


9

我正在使用QGIS 2.0.1,并且已连接到MS SQL Server具有空间功能的数据库(不是ESRI)。我能够连接到该层并将其加载到我的目录中。我隐藏了一些对于可见性而言并不重要的字段。

现在,我想将该数据导出为另一种数据类型(在此示例中,我们将使用shapefile)。右键单击图层,选择“另存为”并定义输出文件时,出现以下错误:

导出到矢量文件失败。错误:字段GlobalID的不受支持的类型

注1:如果在对话框中选中“跳过属性创建”,则shapefile的创建没有错误。

注意2:ArcGIS不会出现此问题,它只是将GUID字段转换为“ TEXT”类型。

查看表,我隐藏的字段之一是SQL类型< uniqueidentifier > 的GUID ,这很可能是罪魁祸首。为了解决此问题,我将该字段设置为“隐藏”。我本来以为因为该字段是隐藏的,所以QGIS不会尝试导出该字段,但事实并非如此。

您可以定义要从QGIS导出的字段吗?

QGIS是否可以仅导出“可见”字段?还是有另一种从QGIS执行此操作的替代方法(也许通过ogr2ogr查询定义字段)?如果我无法定义要导出的字段,这似乎是QGIS的缺点。

更新:我使用一个示例shapefile进行了测试,以查看是否可以限制输出字段。以下ogr2ogr命令行有效并消除了除“名称”之外的所有字段:

ogr2ogr -f "ESRI Shapefile" test.shp city.shp -sql "select name from city"

但是使用QGIS并添加:

-sql "select name from city"

“另存为”对话框的“层”部分中的“否”不会导致仅带有单个字段的shapefile。因此,我真的看不到如何处理文件输出以仅显示选定的几个字段。任何帮助表示赞赏。


如果ogr2ogr可以做到,那么QGIS可以,因为这正是在后台运行的工具。不幸的是,我没有要测试的SQL Server数据库...
underdark

对。因此,我尝试将添加-sql "select <fields> from <table>"(从<fields>中排除GlobalID字段)添加到“另存为”对话框的“层”部分,但是仍然弹出相同的错误。我是否滥用了此代码块,或者这是一个错误?
RyanKDalton

这个答案建议使用-select而不是-sql gis.stackexchange.com/questions/30691 / ... ...我认为它出现在数据源部分,而不是层中。
昏暗

我对您的任何建议都不满意,我也尝试了“ OGR创建选项”的“层”和“数据源”字段中的-select和-sql选项的多种组合:(当然,我不能第一个需要导出字段子集的人...
RyanKDalton

可能值得与开发人员确认。可能是一个错误。
昏暗

Answers:


1

如果它在ogr2ogr的命令行中对您有用,我认为这是使用它的最佳解决方案。您可以编写一个简单的bat文件以从MSSQL数据库创建shapefile。显然,您无法编辑数据并以这种方式保存回服务器。

QGIS具有“数据源”和“层”输入框,但是这些框仅用于ogr2ogr的-dsco和-lco参数。OGR shapefile驱动程序没有有用的dsco或lco来满足您的需求:

http://www.gdal.org/ogr2ogr.html

http://www.gdal.org/ogr/drv_shapefile.html

另外,应该可以编写一个python插件,根据需要使用SQL SELECT命令从服务器请求数据。这甚至可以启用数据编辑。


到目前为止,这似乎是最可行的想法。有没有一种方法可以从QGIS用户界面直接调用ogr2​​ogr命令行来滚动您自己的ogr2ogr语法?
RyanKDalton

不直接。但是您可以劫持gdalwarp的终端以在其中输入ogr2ogr命令。您会得到一个错误,即未创建该图层,但是无论如何它仍在文件系统中。不知道如果该文件已经存在会发生什么,因此最好也添加-overwrite。并且最好使用文件的完整路径名。
AndreJ

另外,您是否尝试过使用GDAL VRT虚拟文件作为MSSQL和QGIS之间的中介程序?
AndreJ

我还没有,但是GDAL不能使用栅格吗?我正在处理点向量层。不过,我喜欢将“虚拟表”作为中间元素的想法。QGIS 2是否没有可写入的内存层?
RyanKDalton

1
还有一个GDAL ogrvrt驱动程序:gdal.org/ogr/drv_vrt.html。但是我认为这应该更好地提出另一个问题。
AndreJ

0

我建议您检查TOC中图层的属性表,以及是否存在GlobalID字段。切换到编辑模式,删除在导出过程中造成问题的列,然后关闭窗口。然后另存为shapefile或所需的任何输出格式。我希望这有帮助。


1
我不确定删除SQL Server表中的字段是否是一个不错的选择。服务器可能仍需要它。
AndreJ

我认为从QGIS TOC层删除属性列会将更新的结构保存在QGIS缓冲区中,并允许您以其他格式导出文件。一旦完成导出,就不要保存对图层的更改(已删除的内容)
Farhat Abbas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.