我想一次导入多个csv文件到QGIS。这些文件包含纬度/经度数据。我想要这些文件来投影点。基本上,我希望导入 csv 文件得到与使用数据源管理器分隔文本并选择点坐标并将 x 字段和 y 字段分别设置为长/纬度时相同的结果。
我不断在众多论坛上遇到相同的 python 代码。虽然我可以将文件作为表导入,但无法让它们加载几何图形(下一阶段的问题也将是让时间戳作为日期而不是字符串加载,我可能必须重构所有文件)。
这是论坛上可用的代码,导致加载损坏的链接(我的文件具有列标题“Lat”和“Long”):
import glob, os
# Define path to directory of your csv files
path_to_csv = "C:/File Path/"
# Set current directory to path of csv files
os.chdir(path_to_csv)
# Find each .csv file and load them as vector layers
for fname in glob.glob("*.csv"):
uri ="file:///"+path_to_csv + fname+"encoding=%s&delimiter=%s&xField=%s&yField=%s&crs=%s" % ("UTF-8",",", "Long", "Lat","epsg:4326")
name=fname.replace('.csv', '')
lyr = QgsVectorLayer(uri, name, 'delimitedtext')
QgsProject.instance().addMapLayer(lyr)
此代码将加载图层,但带有“不可用图层”的警告三角形。单击三角形将打开“修复数据源”窗口。我可以手动选择文件并修复链接。但它只不过是一个所有字段都是字符串的表。
如果我运行这样的代码,我会导入要导入的文件,但仅作为表格且没有几何图形:
import glob, os
# Define path to directory of your csv files
path_to_csv = "C:/Users/DanielStevens/Documents/Afghanistan Monitoring/Phase 2/Border Crossing/Crossing Polygons/Pakistan/"
# Set current directory to path of csv files
os.chdir(path_to_csv)
# Find each .csv file and load them as vector layers
for fname in glob.glob("*.csv"):
uri ="file:///"+path_to_csv + fname
"encoding=%s&delimiter=%s&xField=%s&yField=%s&crs=%s" % ("UTF-8",",", "Long",
"Lat","epsg:4326")
name=fname.replace('.csv', '')
lyr = QgsVectorLayer(uri, name, 'delimitedtext')
QgsProject.instance().addMapLayer(lyr)
如何让 CSV 文件批量导入几何图形(经纬度投影点)?
我将您所拥有的内容修改为下面的行,并且效果完美。我删除了编码,因为我的数据不是 UTF-8。不确定是否是这样造成的。
uri = "file:///" + path_to_csv + fname + "?delimiter=%s&crs=epsg:3857&xField=%s&yField=%s" % (",", "lon", "lat")
如果它有助于解决部分问题,则在导入 csv 时使用 csvt 文件有助于强制数据类型(如果您有多个文件,尤其是文件名发生更改时,例如需要处理新批次时,这会很痛苦)。我正在考虑编写一些 python 来读取 csv、创建具有相同文件名的 csvt 并使用正确数量的列定义填充该文件。最后,由于我只有 30 个文件,所以使用记事本制作 csvt,然后相应地重命名它会更快。我还发现,在 Qgis 中,将日期时间字段转换为 Oracle 日期时间的处理更加一致。希望有帮助。
有一个很酷的 QGIS 插件可以做到这一点。它的名字是CSV批量导入。
它允许浏览 CSV 文件目录。然后递归导入该目录中的所有 CSV 文件作为 QGIS 中的图层。