Можно ли установить проект CRS с помощью команды Python?

10

Можно ли установить проект CRS проекта в QGIS с помощью команды Python?

В моем случае пользователь должен открыть QGIS, запустить мой написанный плагин, и этот плагин будет загружать пространственные данные, которые имеют код epsg 31467 (Gauss Krueger Zone 3). К сожалению, по умолчанию QGIS CRS - WGS84, поэтому у меня проблемы с единицами измерения и шкалой.

Мой первый подход состоял в том, чтобы использовать этот код:

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

Это меняет (после того, как данные уже визуализированы) CRS в зону Гаусса Крюгера 3. По крайней мере, изменился код espg в правом нижнем углу. Единицы все еще в градусах, а шкала полностью неверна. 1: 5000 у Гаусса Крюгера - 1: 528822376 в WGS 84 (в моем случае в QGIS). После настройки CRS проекта вручную в свойствах, проект crs действительно GK3, а масштаб и единицы измерения правильные.

Итак, мой вопрос, могу ли я установить проект CRS иначе, чем я это сделал? Я хочу избежать ручного пути.


Я решил проблему, добавив следующий код:

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

Это устанавливает единицы измерения, и масштаб обновляется автоматически. 0 означает метры, 1 - фут, 2 - градус, 3 - неизвестный.

копи
источник

Ответы:

7

Да, это возможно. Плагин Openlayers от Sourcepole автоматически устанавливает для CRS значение EPSG: 3857.

Взгляните на openlayers_layers.py и openlayers_plugin.py.

Andrej
источник
8

Немного поздно, чтобы ответить, но в случае, если кто-то перейдет на эту страницу из Google без установленного плагина, http://www.purplelinux.co.nz предоставит вам хорошую информацию об этом.

Пример, найденный на purplelinux (который работает нормально), предлагает следующее:

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


И вы могли бы даже создать CRS, позвонив:

QgsCoordinateReferenceSystem("PROPERTY:ID")

который будет:

QgsCoordinateReferenceSystem("EPSG:31467")

ИМХО делает код гораздо более читабельным.

Ким
источник
1
Обратите внимание, что код предназначен для QGIS 2.X, и вы должны увидеть другие ответы, перечисленные здесь для кода QGIS3
Mr Purple
4

Использовать этот:

QgsProject.instance().setCrs(my_crs)
letmaik
источник
1
Работает с QGIS3, когда my_crs=QgsCoordinateReferenceSystem(4326):)
axel_ande