我正在为使用QGIS的MSc学生编写一个教程。
其中一项任务要求修改属性数据
(如果感兴趣,请参见此处的pdf教程草稿)。

问题是如何让他们编辑属​​性数据。
我知道之前曾有人问过这个问题,答案过去很简单:只需使用LibreOffice calc对其进行修改然后保存,以确保行顺序和列标题保持不变。我以前使用过这种方法,效果很好。

不幸的是,该解决方案不再起作用:在LibreOffice(5.4.2)或OpenOffice(3.4.1)中保存.dbf文件,Calc从QGIS角度对数据进行加密(仅随机整数)出现在属性表中),而是创建一个附加的.dbt文件。

所以要问一个问题:我如何告诉一班理学硕士课程的学生下周去做?我考虑了以下选项:


使用R代替(对我来说很棒,但对学生来说很可怕)
将文件编辑为.csv,然后根据时间戳记(很好,但似乎过于复杂,可能会在2小时的实际操作中引入更多错误)
使用替代程序:我尝试了Gnumeric和Excel,但两者均无法迅速产生良好的结果。

为了帮助回答这个问题,我创建了一个可复制的示例。
在QGIS中打开文件“ points.shp”,观察者属性表,然后关闭。
在LibreOffice中的属性表“ points.dbf”-保存。
在QGIS中重新打开“ points.shp”,并观察加扰的属性表。 .zip文件夹中的其他shapefile已被LibreOffice和OpenOffice破坏,以说明该问题对我来说是什么样。

总之,如何最好地解决此问题?

评论

欢迎来到该网站,我想说这是一个非常好的问题,希望我们能解决一些好的问题。我认为对于这些学生来说,python毫无用处,因为这是我一开始就将如何解决此问题的方法...

直接编辑shapefile的.DBF部分太危险了,以至于建议常规使用,因此绝对不适合新手使用-至少在有人关心数据的情况下至少如此。但是,可以使用类似性质的更可靠的解决方案:在shapefile中维护唯一的标识符字段。永远不要编辑它。取而代之的是,将属性保存在关联的表(以GIS可以读取的任何格式)中,并以相同的标识符进行连接。现在,在很大程度上,只要保护标识符字段,就可以自由地编辑属性表,而不会失去形状和属性之间的联系。

Python解决方案就可以了,只要它们易于实现和理解即可。关于保留标识符号是个不错的选择-(我的问题中的选项2),而且可能是我的默认答案。但是,希望有一个不涉及其他文件的更简单的“快速修复”(IMO文件每个5个shapefile就足够了!)

您的意思是,每个shapefile 5个?尝试9! :-)(索引文件可能会累积,具体取决于所使用的GIS。)一旦您需要多个相关文件来维护一组数据(并且shapefile至少需要三个),那么这样做就不会造成任何麻烦。放入其他文件。您也可以同时添加元数据文件。 :-)一旦建立了连接,它不会自动发生吗? (不过,我不知道如何将时间戳用于联接。它将用于版本控制系统。)

如果您有意将它们引入数据库,spatiaLite会提供一个用于OSM数据的字段编辑和命令行工具的GUI。然后,您可能需要使用一些SQL,并且可以说您的学生将领先一步。

#1 楼

我找到了最简单的答案,这是根据Ryan Garnett的建议在QGIS中完成的:

使用regexp_replace

此功能由JürgenFischer于1年前添加到字段计算器中如该错误报告所示)。我尝试了一段时间以了解如何执行此操作,但是未能搜索“ qgis regex”和其他模糊术语。

需要对“名称”列中的所有值进行标准化,可以最好地说明其功能。例如,如果我们需要将所有包含模式“ Tesc”的单元格替换为“ Tesco”,并删除诸如“ Tesco,Infirmary Road”(OSM贡献者经常添加的信息)之类的多余信息,则可以使用以下功能:




我想这是Pythonic正则表达式功能,因为它是与我以前使用过的grep稍有不同。

我认为需要更多文档(有关QGIS网站的详细信息,只用几句话),因此我将以下页面加为书签,以备将来参考:


Python正则表达式的一般介绍。

QT中的相关功能(从QGIS错误报告中引用)

此解决方案具有两个优点:


简单:不需要额外的程序或附加组件
使用(Pythonic?)函数向学生介绍正则表达式的功能(表示文本的“'”很有趣。警告:“否则任何符号都不会失败)和命令行功能。

道歉,我想回答我自己的问题,非常感谢其他人引导我走向光明!我希望这个问题集可以用于教育给其他面临类似问题的人。

评论


不用担心,回答您自己的问题不是问题。

– Underdark♦
2012年11月9日下午13:18

很高兴您找到可以帮助您的东西。感谢您的分享,我知道我会用到的。

–瑞安·加内特(Ryan Garnett)
2012年11月9日下午13:44

我问过QGIS开发人员,它是Qt regex qt-project.org/doc/qt-4.8/qregexp.html

–wildintellect
2014年4月23日23:21在

#2 楼

这可能是一个愚蠢的答案,因为它可能是研究生的学习目标,但是是否有理由不使用“字段计算器”在QGIS中编辑属性?在早期版本的QGIS(1.7版之前)中,无法直接在QGIS中进行编辑属性。因此,需要在OpenOffice等中编辑.DBF文件。
从1.7和1.8开始,您可以直接在Field Calculator中编辑属性数据,并能够执行条件表达式。也有可用的Python属性插件,可以为属性编辑提供其他选项。这可能是一个解决方案,或者是您的教程的一个选择。

作为以前的硕士生和现在的大学雇员,我了解此问题,以及以前在QGIS之外执行此问题的要求,现在感谢能够在QGIS中执行所有属性编辑的功能。如果您愿意,我很乐意为您提供更多帮助。

评论


嗨,瑞安,是的,这将是理想的解决方案。它具有搜索和替换属性表中的文本,标准化凌乱的OSM名称的能力,这促使我尝试直接编辑.dbf文件。我宁愿在QGIS中对其进行编辑。将尝试使用Python Attribute插件-可能是解决方案。应该使我正在寻找正则表达式搜索/替换功能的事实更加清楚。

–RobinLovelace
2012年11月9日,12:05

@ user1694378,您仍然可以澄清您的问题。

– Underdark♦
2012年11月9日下午13:13

感谢Underdark鼓励我这样做-更好地反映了我实际想要做的事情。

–RobinLovelace
2012年11月9日下午13:16

#3 楼

您可以使用LibreOffice的基础来修改dbf文件。



打开库(获取主菜单)
选择“连接到现有数据库”,然后选择类型“ dBASE”。您的dbf文件。
根据需要选择最终选项,然后单击“完成”。
随便命名数据库连接文件(例如“ MyxBasefiles.odb”)并将其保存在某个位置。此后访问您的
数据库通过单击该文件来保存文件,ooOoo,尼斯。
在左侧面板上选择“表”,然后有您的数据文件(称为“表”)。与它们混在一起。



您现在可以开始对其进行编辑了,希望对您的目的已经足够了。

您也可以尝试DBF Explorer,虽然它仅适用于Windows,但确实具有搜索和替换功能。



评论


嗨R.K.感谢您的迅速答复:似乎是编辑.dbf文件的可靠且安全的方法。我只是尝试了您所说的内容,很高兴地说它可行。

–RobinLovelace
2012年11月8日15:34

很高兴知道。不错的课程。 :)

– R.K.
2012年11月8日15:39

但是...我只是尝试了您所说的内容,很高兴地说它适用于单个单元格。不幸的是,这并不是针对该特定应用程序的100%解决方案,因为由于[bug](lists.freedesktop.org/archives/libreoffice-bugs/2010,OOBase似乎不具备本教程所需的搜索替换功能。 -十二月/…)。绝对可以在单个单元上工作:经过测试。因此,这是90%的逐单元编辑解决方案,除非我错过了搜索替换功能。例如,是否有任何想法如何将所有“ Tesc。*”条目替换为“ Tesco”?

–RobinLovelace
2012年11月8日15:48

OO基础错误的更好链接:bugs.freedesktop.org/show_bug.cgi?id=32506

–RobinLovelace
2012年11月8日15:49

更新了我的答案。

– R.K.
2012年11月8日16:14