使用Python将csv导入QGIS

4
我正在尝试使用Python脚本将文件导入到QGIS中。我在尝试使它接受CRS时遇到了问题。迄今为止的代码如下:
from PyQt4.QtGui import * from PyQt4.QtCore import * from qgis.core import * from qgis.utils import iface # ----1 在此处设置文件名 InFlnm='Input.CSV'
# ---2 在此处设置路径名 InDrPth='G:/test'
# ---3 为uri构建文件名和路径 InFlPth="file:///"+InDrPth+InFlnm
# ---4 在此处设置导入Sting注意只需要设置x和y,其他的自动完成! uri = InFlPth+"?delimiter=%s&xField=%s&yField=%s" % (",","x","y")
# ---5 将点加载到图层中 bh = QgsVectorLayer(uri, InFlnm, "delimitedtext")
# ---6 设置CRS(不确定这是否有效?) bh.setCrs(QgsCoordinateReferenceSystem(32365, QgsCoordinateReferenceSystem.EpsgCrsId))
# ---7 在QGIS中显示图层(这里我得到了一个语法错误?) QgsMapLayerRegistry.instance().addMapLayer(bh)
现在以上所有内容都可以正常工作,并且当我注释掉第6步时,QGIC会提示我选择CRS,然后执行最后一行脚本以显示该图层。
但是,如果我尝试去掉第6步中注释符###,则会在显示点的最后一行(步骤7)上报告语法错误。不确定这里的技巧是什么 - 我对Python相当陌生,但是熟悉其他一些编程语言。

你能通过打印数组或其他方式验证是否已读取CSV文件中的值吗? - Jules G.M.
Julius,感谢您的回复 - 我现在有点尴尬,因为我没有发现这个语法问题,现在你指出来后它变得非常明显。然而,当我现在运行脚本时,QGIS仍然提示选择“坐标参考系统选择器”表单以选择CRS。我期望步骤6会停止此提示,因为已经为导入的CSV设置了CRS?如果能指点一下正确的方向,我将不胜感激,因为我希望让脚本在没有人工干预的情况下加载和显示点。 - Markm0705
检查一下 bh.source(),看看是否真的加载了什么东西。 - Jules G.M.
哦,还有bh.isValid()。 - Jules G.M.
所有这些内容都是从阅读源代码 http://qgis.org/api/1.8/classQgsVectorLayer.html 中获取的。 - Jules G.M.
Julius,再次感谢您的回复和建议。源代码和isValid命令doshow表明已经加载了某些内容,在我将CRS输入表单后,点加载似乎进一步得到了确认。代码仍然是相同的(纠正了语法错误),这是我正在加载的点文件的前三行。(X,Y,Z,长度,CU,S,AU,CUO,CU1,CU2,INDEX 559.26621306,2234.68248,0.0,,-999.0,,,,,,-999.0 563.9107829,2175.4604286,0.0,,-999.0,,,,,,-999.0 568.55535274,2116.2383773,0.0,,-999.0,,,,,,-999.0)。我正在使用QGIS 2.1.0,也许我应该尝试一个更旧的版本? - Markm0705
3个回答

4
我在http://www.purplelinux.co.nz/找到了解决问题最后一部分的答案。看起来您需要禁止提示CRS的表单。因此,我的脚本现在如下:
#--- Load a csv file and set CRS
#---1 Reference library
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from qgis.core import *
from qgis.utils import iface

#---  2 Turn of the CRS dialog box
s = QSettings()
oldValidation = s.value( "/Projections/defaultBehaviour")
s.setValue( "/Projections/defaultBehaviour", "useGlobal" )

#--- 3 Set file name here
InFlnm='Test.csv'

#--- 4  Set pathname here
InDrPth='C:/_Work/PyQGIS/Test/'

#--- 5 Build file name an path for uri
InFlPth="file:///"+InDrPth+InFlnm

#---  6 Set import Sting here note only need to set x and y other come for free
uri = InFlPth+"?delimiter=%s&xField=%s&yField=%s" % (",","x","y")

#--- 7 Load point layer
bh = QgsVectorLayer(uri, InFlnm, "delimitedtext")

#--- 8 Confirm something is loaded and valid
bh.isValid()

#--- 9 Set CRS
bh.setCrs(QgsCoordinateReferenceSystem(32365, QgsCoordinateReferenceSystem.EpsgCrsId))

#--- 10 Display the layer into QGIS (but it asks for CRS before displaying_
QgsMapLayerRegistry.instance().addMapLayer(bh)

#--- 11 turn CRS dialog box back on again
s.setValue( "/Projections/defaultBehaviour", oldValidation )

导入的点现在已经显示出来了,但是我收到了一个错误提示,说CRS未被识别,所以我怀疑上面第9步可能没有起作用。如果我能解决这个问题,我会再次发布帖子,否则我可能只能接受CRS默认值了。

你解决了#9的问题吗?我也遇到了同样的问题。 - kflaw
我觉得有人解决了这个问题 - 看一下下面的帖子 - 我从来没有回过头来处理这个有趣的部分... - Markm0705

3

感谢提供这个示例,对我编写一个用于将 Python 脚本中的地理编码器输出为 QGIS 的 CSV 文件非常有帮助。要解决您的问题,请在您的 URI 行中添加 CRS:

uri = InFlPth+"?crs=epsg:32365&delimiter=%s&xField=%s&yField=%s" % (",","x","y")    

2

您的第--6行代码结尾缺少一个括号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接