PyQGIS에서 계층 CRS를 정의하고 CRS 대화 상자를 피 하시겠습니까?


16

추가하려는 기존 Shapefile이 있습니다.

현재 내 코드는 다음과 같습니다.

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

잘 작동하지만 코드 내에서 crs를 정의하고 싶습니다. 가능합니까? 이와 비슷한 질문을 발견했습니다. 파이썬을 사용하여 QGIS 2.4에서 프로그래밍 방식으로 CRS 선택

하지만 어쨌든 작동하지 않습니다.

답변:


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를 요청합니까?
Mustafa Uçar

CRS 대화 상자가 나타납니다!
Roberto Marzocchi 2018 년

gis.stackexchange.com/a/325796/77806- 대화 상자가 표시되지 않음
Pavel Pereverzev

6

모두를 기반으로 이 블로그 게시물 과에 대한 대답 어떻게 내가 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 (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 값 기관 ID 그림과 같이 당신의 선택의를 :

CRS 옵션


1
답변 주셔서 감사합니다! 그러나 주요 문제는 레이어를로드 할 때 crs를 선택할 수있는 대화 상자가 나타나는 것입니다. 숨기거나 비활성화 할 수 있습니까?
Hinne123

명령을 실행할 때 대화창이 표시되지 않습니다. 바라건대 당신도하지 않을 것입니다!
Joseph

2
CRS 창이 코드에 CRS가 설정되지 않은 경우에만 나타납니다. 설정하는 한 좋을 것입니다.
BritishSteel

@BritishSteel-언급 해 주셔서 감사합니다! 나는 그것이 사실인지 몰랐다.
Joseph

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

이 답변 에서는 파일을 메모리로로드하는 데 사용되는 URL에 CRS를 지정하여이 대화 상자를 피하는 방법에 대해 설명합니다. 따라서 Shapefile 경로를로 직접 전달하는 대신 적절한 URL을 addVectorLayer()사용 하여을 QgsVectorLayer만든 다음을 호출하십시오 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.