กำหนดเลเยอร์ 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 ฉันในการโต้ตอบ?
Mustafa Uçar

กล่องโต้ตอบ CRS จะปรากฏขึ้น!
Roberto Marzocchi

gis.stackexchange.com/a/325796/77806 - กล่องโต้ตอบจะไม่ปรากฏยืนยัน
Pavel Pereverzev

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.