Визначення рівня CRS рівня та уникнення діалогу CRS у PyQGIS?


16

Є існуючий Shapefile, який я хочу додати.

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

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

Це добре працює, але я хочу визначити crs в коді. Це можливо? Я знайшов подібні питання, як це: Програмно виберіть CRS у QGIS 2.4 за допомогою Python

Але я все одно не змушую його працювати.

Відповіді:


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 (BTW, не слід: P), використовуйте замість нього змінну "/ Projections / 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 в обох випадках на власний ідентифікатор, як показано на зображенні:

Варіанти 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))

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.