Xác định CRS lớp và tránh hộp thoại CRS trong PyQGIS?


16

Có một Shapefile hiện có, mà tôi muốn thêm.

Tại thời điểm mã của tôi trông như:

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

Nó hoạt động tốt, nhưng tôi muốn xác định các crs trong mã. Có thể không? Tôi đã tìm thấy một số câu hỏi tương tự như câu hỏi này: Lập trình Chọn CRS trong QGIS 2.4 bằng Python

Nhưng dù sao tôi cũng không làm cho nó hoạt động được.

Câu trả lời:


8

Tôi giải quyết vấn đề tương tự theo cách này:

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
Tuy nhiên nó vẫn hỏi tôi CRS trong hộp thoại?
Mustafa Uçar

Hộp thoại CRS xuất hiện!
Roberto Marzocchi

gis.stackexchange.com/a/325796/77806 - hộp thoại sẽ không xuất hiện, được xác nhận
Pavel Pereverzev

6

Dựa trên cả bài đăng trên blog này và câu trả lời cho Làm cách nào tôi có thể chỉ định CRS của lớp raster trong pyqgis? , bạn có thể đạt được những gì bạn muốn theo cách này:

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 )

Lưu ý: Nếu bạn vẫn đang sử dụng QGIS v2.x (BTW, bạn không nên: P), thay vào đó, hãy sử dụng tên biến "/ Dự đoán / defaultBehaviour".


5

Đoạn mã sau sẽ cho phép bạn thêm một lớp vectơ mà không có cửa sổ bật lên CRS xuất hiện (ít nhất nó không xuất hiện cho tôi):

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)

Chỉ cần thay đổi 4326giá trị CRS trong cả hai trường hợp thành ID ủy quyền mà bạn chọn như trong hình:

Tùy chọn CRS


1
Cảm ơn câu trả lời của bạn! Nhưng vấn đề chính là khi tôi tải lớp, một hộp thoại xuất hiện nơi tôi có thể chọn crs. Có thể ẩn hoặc vô hiệu hóa nó?
Hinne123

Chỉnh sửa bài đăng của tôi, khi tôi chạy các lệnh tôi không nhận được cửa sổ đối thoại. Hy vọng bạn sẽ không!
Giuse

2
Cửa sổ CRS chỉ xuất hiện nếu CRS chưa được đặt trong mã. Miễn là bạn đặt nó, bạn sẽ tốt.
BritishSteel 23/2/2015

@BritishSteel - Cảm ơn bạn đã đề cập đến điều đó! Tôi không biết đó là trường hợp.
Joseph

3

Sau nhiều tháng, tôi tìm thấy một giải pháp. Bạn nên thêm hai dòng trước và cuối tập lệnh từ @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

Đối với tôi bất kỳ giải pháp trên không hoạt động. Có lẽ bởi vì tôi đang tải csv dưới dạng lớp vector, không phải là tệp hình dạng. Cách duy nhất tôi có thể làm cho nó hoạt động là:

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

0

Câu trả lời này mô tả cách tránh hộp thoại này bằng cách chỉ định CRS trong URL được sử dụng để tải tệp vào bộ nhớ ở vị trí đầu tiên. Vì vậy, thay vì chuyển trực tiếp đường dẫn Shapefile tới addVectorLayer(), hãy tạo một QgsVectorLayerURL thích hợp và sau đó gọi 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.