Определение слоя CRS и избегание диалога CRS в PyQGIS?

16

Существует существующий шейп-файл, который я хочу добавить.

На данный момент мой код выглядит так:

self.iface.addVectorLayer(self.shpFilePath, "Track", "ogr")

Это работает нормально, но я хочу определить crs в коде. Является ли это возможным? Я нашел несколько похожих вопросов, таких как этот: программно выбрать CRS в QGIS 2.4 с использованием Python

Но я все равно не получаю работу.

Hinne123
источник

Ответы:

8

Я решаю подобную проблему следующим образом:

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)
Домокос Эндре
источник
4
Однако это все еще спрашивает меня CRS в диалоге?
Мустафа Учар
Откроется диалоговое окно CRS!
Роберто
gis.stackexchange.com/a/325796/77806 - диалог не появится, подтверждено
Павел Переверзев,
6

На основании этого поста и ответа на вопрос Как я могу указать CRS растрового слоя в Pyqgis? , вы можете достичь того, что вы хотите, таким образом:

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), используйте вместо этого имя переменной "/ Projection / defaultBehaviour".

Герман Каррильо
источник
5

Следующий код должен позволить вам добавить векторный слой без появления всплывающего окна 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 авторизации по вашему выбору, как показано на рисунке:

Варианты CRS

Джозеф
источник
1
Спасибо за Ваш ответ! Но главная проблема в том, что когда я загружаю слой, появляется диалоговое окно, где я могу выбрать crs. Можно ли это скрыть или отключить?
Hinne123
Отредактировал мой пост, когда я запускаю команды, я не получаю диалоговое окно. Надеюсь, вы тоже не будете!
Джозеф
2
Окно CRS появляется только в том случае, если CRS не был установлен в коде. Пока вы установите его, у вас все будет хорошо.
BritishSteel
@BritishSteel - Спасибо, что упомянули об этом! Я не знал, что это так.
Джозеф
3

Спустя месяцы я нашел решение. Вы должны добавить две строки перед и в конец скрипта из @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)
Мустафа Учар
источник
1

Для меня любое вышеуказанное решение не работает. Возможно, потому что я загружаю CSV как векторный слой, а не файл формы. Единственный способ заставить это работать:

crs = QgsCoordinateReferenceSystem(2180)
self.iface.mapCanvas().mapRenderer().setDestinationCrs(crs)
vlayer = QgsVectorLayer(filePath, "layer name", "ogr")
vlayer.setCrs(QgsCoordinateReferenceSystem(2180))
wawka
источник
0

Этот ответ описывает, как избежать этого диалога, указав CRS в URL-адресе, который используется для загрузки файла в память. Поэтому вместо того, чтобы передавать путь к Shapefile addVectorLayer(), создайте QgsVectorLayerс соответствующим 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)
Ник К9
источник