在QGIS内置的python提示中,我可以做到这一点
>>> linesfile
'C:\\Users\\path\\to\\Lines.csv'
>>> mylayer = QgsVectorLayer(linesfile, "GPSLines", "ogr")
>>> mylayer.isValid()
True
>>> mylayer.featureCount()
6624
成功创建了一个虚拟图层,该虚拟图层引用了新鲜创建的一个:
>>> vlayer = QgsVectorLayer("?query=SELECT * FROM 'GPSLines'", 'myvlayer', 'virtual')
>>> vlayer.isValid()
True
>>> vlayer.featureCount()
6624
wove,从外部编辑器(VSCODE)尝试相同的操作,它的行为不像预期。创建的图层似乎无效,但是我看不出为什么甚至找到了更多解释的错误消息。感觉好像我刚刚创建的“ gpslines”层消失在稀薄的空气中。
mylayer = QgsVectorLayer(linesfile, "GPSLines", "ogr")
mylayername = mylayer.name()
if not mylayer.isValid():
print("Layer failed to load")
else:
print("Layer loaded.")
print("Original number of features: " + str(mylayer.featureCount()))
vlayer = QgsVectorLayer("?query=SELECT * FROM 'GPSLines'", 'myvlayer','virtual')
if not vlayer.isValid():
error_msg = vlayer.lastError()
print(f"Virtual layer creation failed with error: {error_msg}")
print("Filtered Layer failed to load")
else:
print("Filtered Layer loaded.")
print("Filtered number of features: " + str(vlayer.featureCount()))
输出:
Layer loaded.
Original number of features: 6624
Virtual layer creation failed with error:
Filtered Layer failed to load
任何帮助或指针欢迎 - 我不知道在哪里可以寻找。
QGIS Python控制台和您的外部脚本之间的区别是图层注册表/管理。在QGIS Python控制台中,当您创建图层时,它会自动添加到项目的图层注册表中,但是从外部脚本运行时,您需要将该图层添加到项目中才能用于虚拟图层查询。 您应该修改您的脚本以处理以下操作:
from qgis.core import QgsProject
# Create and add the source layer
mylayer = QgsVectorLayer(linesfile, "GPSLines", "ogr")
if not mylayer.isValid():
print("Layer failed to load")
else:
# Add layer to the project
QgsProject.instance().addMapLayer(mylayer)
print("Layer loaded.")
print("Original number of features: " + str(mylayer.featureCount()))
# Now create the virtual layer
vlayer = QgsVectorLayer("?query=SELECT * FROM 'GPSLines'", 'myvlayer', 'virtual')
if not vlayer.isValid():
error_msg = vlayer.lastError()
print(f"Virtual layer creation failed with error: {error_msg}")
print("Filtered Layer failed to load")
else:
print("Filtered Layer loaded.")
print("Filtered number of features: " + str(vlayer.featureCount()))
QGI中的虚拟层需要参考项目的一部分。当您在QGIS Python控制台中运行此操作时,该图层会自动添加到项目中,这就是为什么它在此处工作的原因。在外部脚本中,我们需要添加它。
如果您完全独立地运行此此操作(根本不在QGI中),则需要确保已正确初始化QGI。您需要在脚本开始时类似的东西:
from qgis.core import QgsApplication
# Initialize QGIS Application
qgs = QgsApplication([], False)
qgs.initQgis()
# Your existing code here...
# Clean up when done
qgs.exitQgis()