Có thể đặt CRS dự án thông qua lệnh Python không?


10

Có thể đặt CRS dự án của một dự án trong QGIS thông qua lệnh Python không?

Trong trường hợp của tôi, người dùng nên mở QGIS, bắt đầu plugin viết của tôi và plugin này sẽ tải dữ liệu không gian có mã epsg 31467 (Gauss Krueger Vùng 3). Thật không may, CRS mặc định của QGIS là WGS84 và vì vậy tôi gặp rắc rối với các đơn vị và quy mô.

Cách tiếp cận đầu tiên của tôi là sử dụng mã này:

    my_crs = core.QgsCoordinateReferenceSystem(31467, core.QgsCoordinateReferenceSystem.EpsgCrsId)
    self.iface.mapCanvas().mapRenderer().setDestinationCrs(my_crs)

Điều này thay đổi (sau khi dữ liệu đã được trực quan hóa) CRS sang Gauss Krueger Vùng 3. Ít nhất là mã đặc biệt ở góc dưới bên phải đã thay đổi. Các đơn vị vẫn ở độ và quy mô là hoàn toàn sai. 1: 5000 trong Gauss Krüger là 1: 528822376 trong WGS 84 (trong trường hợp của tôi ở QGIS). Sau khi thiết lập CRS dự án theo cách thủ công trong các thuộc tính, crs dự án thực sự là GK3 và tỷ lệ và các đơn vị là đúng.

Vì vậy, câu hỏi của tôi là, tôi có thể thiết lập CRS dự án theo cách khác so với tôi đã làm không? Tôi muốn tránh cách thủ công.


Tôi đã giải quyết vấn đề bằng cách thêm đoạn mã sau:

qgis.utils.iface.mapCanvas().setMapUnits(0)
qgis.utils.iface.mapCanvas().refresh()

Điều này đặt các đơn vị để đo và thang đo được cập nhật tự động. 0 là viết tắt của mét, 1 là chân, 2 là độ và 3 là không rõ.

Câu trả lời:


7

Vâng nó có thể. Plugin Openlayers của Sourcepole tự động đặt CRS thành EPSG: 3857.

Hãy xem openlayftimellayers và openlayftimeplugin.py.


8

Một chút muộn để trả lời, nhưng trong trường hợp ai đó rơi vào trang đó từ google, mà không cài đặt plugin, http://www.purplelinux.co.nz cung cấp thông tin tốt về điều đó.

Ví dụ được tìm thấy trên purplelinux (đang hoạt động tốt) gợi ý như sau:

if iface.mapCanvas().mapRenderer().hasCrsTransformEnabled():
    my_crs = core.QgsCoordinateReferenceSystem(4326,core.QgsCoordinateReferenceSystem.EpsgCrsId)
    iface.mapCanvas().mapRenderer().setDestinationCrs(my_crs)


Và bạn thậm chí có thể tạo CRS bằng cách gọi:

QgsCoordinateReferenceSystem("PROPERTY:ID")

đó sẽ là:

QgsCoordinateReferenceSystem("EPSG:31467")

IMHO làm cho mã dễ đọc hơn nhiều.


1
Lưu ý mã dành cho QGIS 2.X và bạn sẽ thấy các câu trả lời khác được liệt kê ở đây cho mã QGIS3
Mr Purple

4

Dùng cái này:

QgsProject.instance().setCrs(my_crs)

1
Hoạt động với QGIS3, khi my_crs=QgsCoordinateReferenceSystem(4326):)
axel_ande
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.