PyQGIS'de katman CRS tanımlamak ve CRS iletişim kutusundan kaçınmak?


Yanıtlar:


8

Benzer sorunu şu şekilde çözüyorum:

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
Ancak hala iletişim kutusunda CRS soruyor?
Mustafa Uçar

CRS iletişim kutusu görünür!
Roberto Marzocchi

gis.stackexchange.com/a/325796/77806 - iletişim kutusu görünmeyecek, onaylandı
Pavel Pereverzev

6

Her iki dayanarak bu blog yayınında ve cevabı nasıl pyqgis bir raster katmanın CRS belirtebilirim? , istediğiniz şekilde bu şekilde elde edebilirsiniz:

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 )

Not: Hala QGIS v2.x (BTW, kullanmamalısınız: P) kullanmıyorsanız, bunun yerine "/ Projions / defaultBehaviour" değişken adını kullanın.


5

Aşağıdaki kod, CRS açılır penceresi görünmeden bir vektör katmanı eklemenize izin vermelidir (en azından benim için görünmüyor):

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)

4326Her iki durumda da CRS değerini resimde gösterildiği gibi seçtiğiniz Yetki Kimliği ile değiştirmeniz yeterlidir :

CRS seçenekleri


1
Cevabınız için teşekkürler! Ancak asıl sorun, katmanı yüklediğimde crs'yi seçebileceğim bir iletişim kutusu görüntülenmesidir. Gizlemek veya devre dışı bırakmak mümkün mü?
23:15

Yazımı düzenledim, komutları çalıştırdığımda bir diyalog penceresi almıyorum. Umarım siz de olmazsınız!
Joseph

2
CRS penceresi yalnızca CRS kodda ayarlanmamışsa görünür. Ayarladığınız sürece iyi olacaksınız.
BritishSteel

@BritishSteel - Bundan bahsettiğiniz için teşekkür ederiz! Böyle olduğunu bilmiyordum.
Joseph

3

Aylar sonra bir çözüm buldum. @Domokos Endre'den gelen komut dosyasının önüne ve sonuna iki satır eklemelisiniz:

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

Benim için yukarıdaki herhangi bir çözüm işe yaramıyor. Belki csv'yi bir şekil dosyası olarak değil, vektör katmanı olarak yüklediğim için. Çalışmasını sağlamanın tek yolu:

crs = QgsCoordinateReferenceSystem(2180)
self.iface.mapCanvas().mapRenderer().setDestinationCrs(crs)
vlayer = QgsVectorLayer(filePath, "layer name", "ogr")
vlayer.setCrs(QgsCoordinateReferenceSystem(2180))

0

Bu yanıt , dosyayı belleğe yüklemek için kullanılan URL'de CRS'yi belirterek bu iletişim kutusunun nasıl önleneceğini açıklar. Dolayısıyla, Shapefile yolunu doğrudan yerine geçirmek yerine , uygun URL ile addVectorLayer()bir a oluşturun QgsVectorLayerve arayın 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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.