¿Es posible configurar el proyecto CRS a través de un comando de Python?

10

¿Es posible configurar el CRS del proyecto de un proyecto en QGIS mediante un comando de Python?

En mi caso, el usuario debe abrir QGIS, iniciar mi complemento escrito y este complemento cargará datos espaciales que tienen el código epsg 31467 (Gauss Krueger Zone 3). Lamentablemente, el CRS predeterminado de QGIS es WGS84 y, por lo tanto, me meto en problemas con las unidades y la escala.

Mi primer enfoque fue usar este código:

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

Esto cambia (después de visualizar los datos) el CRS a Gauss Krueger Zone 3. Al menos el código espg en la esquina inferior derecha ha cambiado. Las unidades todavía están en grados y la escala está totalmente equivocada. 1: 5000 en Gauss Krüger es 1: 528822376 en WGS 84 (en mi caso en QGIS). Después de configurar el CRS del proyecto manualmente en las propiedades, el crs del proyecto es realmente GK3 y la escala y las unidades son correctas.

Entonces, mi pregunta es, ¿puedo configurar el proyecto CRS de otra manera que no lo he hecho? Quiero evitar la forma manual.


Resolví el problema agregando el siguiente código:

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

Esto configura las unidades para medir y la escala se actualiza automáticamente. El 0 significa metros, 1 es para pie, 2 es para grado y 3 para desconocido.

kopi
fuente

Respuestas:

7

Si es posible. El complemento Openlayers de Sourcepole configura automáticamente CRS a EPSG: 3857.

Eche un vistazo a openlayers_layers.py y openlayers_plugin.py.

AndreJ
fuente
8

Un poco tarde para contestar, pero en caso de que alguien acceda a esa página desde google, sin tener el complemento instalado, http://www.purplelinux.co.nz proporciona buena información al respecto.

El ejemplo que se encuentra en purplelinux (que funciona bien) sugiere lo siguiente:

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


E incluso podría crear un CRS llamando:

QgsCoordinateReferenceSystem("PROPERTY:ID")

cuál podría ser:

QgsCoordinateReferenceSystem("EPSG:31467")

que en mi humilde opinión hace que el código sea mucho más legible.

Kim
fuente
1
Tenga en cuenta que el código es para QGIS 2.X y debería ver otras respuestas enumeradas aquí para el código QGIS3
Mr Purple
4

Utilizar este:

QgsProject.instance().setCrs(my_crs)
letmaik
fuente
1
Funciona con QGIS3, cuando my_crs=QgsCoordinateReferenceSystem(4326):)
axel_ande