有一个现有的Shapefile,我想添加。
目前,我的代码如下所示:
self.iface.addVectorLayer(self.shpFilePath, "Track", "ogr")
它工作正常,但我想在代码中定义crs。可能吗?我发现了类似的问题:使用Python在QGIS 2.4中以编程方式选择CRS
但是我还是无法正常工作。
有一个现有的Shapefile,我想添加。
目前,我的代码如下所示:
self.iface.addVectorLayer(self.shpFilePath, "Track", "ogr")
它工作正常,但我想在代码中定义crs。可能吗?我发现了类似的问题:使用Python在QGIS 2.4中以编程方式选择CRS
但是我还是无法正常工作。
Answers:
我用这种方式解决了类似的问题:
from qgis.core import *
from qgis.gui import *
layer = QgsVectorLayer(self.shpFilePath, "Track", "ogr")
crs = layer.crs()
crs.createFromId(4326)
layer.setCrs(crs)
QgsMapLayerRegistry.instance().addMapLayer(layer)
基于此博客文章和答案,如何在pyqgis中指定栅格图层的CRS?,您可以通过这种方式实现您想要的:
settings = QSettings()
# Take the "CRS for new layers" config, overwrite it while loading layers and...
oldProjValue = settings.value( "/Projections/defaultBehavior", "prompt", type=str )
settings.setValue( "/Projections/defaultBehavior", "useProject" )
# YOUR CODE TO LOAD THE LAYER GOES HERE
# ... then set the "CRS for new layers" back
settings.setValue( "/Projections/defaultBehavior", oldProjValue )
注意:如果仍在使用QGIS v2.x(顺便说一句,您不应该:P),请改用变量名“ / Projections / defaultBehaviour”。
以下代码应允许您添加一个矢量层,而不会出现CRS弹出窗口(至少对我而言不会出现):
from qgis import *
from qgis.utils import *
#replace "shapefile_path" with your layer's path; replace "Layer_name" with whatever name you want to give the layer in the TOC
qgis.utils.iface.addVectorLayer("shapefile_path", "Layer_name", "ogr")
#Use loaded layer as active layer to set the CRS
myLayer = qgis.utils.iface.activeLayer()
myLayer.setCrs(QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.EpsgCrsId))
#Sets canvas CRS
my_crs = core.QgsCoordinateReferenceSystem(4326, core.QgsCoordinateReferenceSystem.EpsgCrsId)
iface.mapCanvas().mapRenderer().setDestinationCrs(my_crs)
只需将4326
两种情况下的CRS值更改为您选择的授权机构ID,如图所示:
几个月后,我找到了解决方案。您应该在脚本的开头和结尾添加两行,该脚本来自@Domokos Endre:
import os
iface.mainWindow().blockSignals(True)
layer = QgsVectorLayer(path, "My Layer", "ogr")
crs = layer.crs()
crs.createFromId(32637) # Whatever CRS you want
layer.setCrs(crs)
QgsProject.instance().addMapLayer(layer)
iface.mainWindow().blockSignals(False)
此答案描述了如何通过首先在URL中指定CRS来避免此对话框,该URL用于将文件加载到内存中。因此addVectorLayer()
,QgsVectorLayer
与其直接传递Shapefile路径,不如创建具有适当URL的,然后调用addMapLayer()
。
import urlparse
import urllib
baseuri = urlparse.urljoin('file:', urllib.pathname2url(self.shpFilePath))
uri = baseuri + "?crs=EPSG:4326"
vlayer = QgsVectorLayer(uri, "result", "memory")
QgsMapLayerRegistry.instance().addMapLayer(vlayer)