Est-il possible de définir le projet CRS via une commande Python?

10

Est-il possible de définir le projet CRS d'un projet dans QGIS via une commande Python?

Dans mon cas, l'utilisateur doit ouvrir QGIS, démarrer mon plugin écrit et ce plugin chargera les données spatiales qui ont le code epsg 31467 (Gauss Krueger Zone 3). Malheureusement, le CRS par défaut de QGIS est le WGS84 et j'ai donc des problèmes avec les unités et l'échelle.

Ma première approche a été d'utiliser ce code:

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

Cela change (une fois les données déjà visualisées) le CRS en Gauss Krueger Zone 3. Au moins le code espg dans le coin inférieur droit a changé. Les unités sont toujours en degrés et l'échelle est totalement fausse. 1: 5000 dans Gauss Krüger est 1: 528822376 dans WGS 84 (dans mon cas dans QGIS). Après avoir défini le projet CRS manuellement dans les propriétés, le projet CRS est vraiment GK3 et l'échelle et les unités sont correctes.

Donc ma question est, puis-je définir le projet CRS d'une autre manière que je l'ai fait? Je veux éviter la voie manuelle.


J'ai résolu le problème en ajoutant le code suivant:

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

Cela définit les unités au mètre et l'échelle est mise à jour automatiquement. Le 0 signifie mètres, 1 pour pied, 2 pour degré et 3 pour inconnu.

kopi
la source

Réponses:

7

Oui c'est possible. Le plugin Openlayers de Sourcepole définit automatiquement CRS sur EPSG: 3857.

Jetez un œil à openlayers_layers.py et openlayers_plugin.py.

AndreJ
la source
8

Un peu tard pour répondre, mais au cas où quelqu'un tomberait sur cette page de google, sans avoir installé le plugin, http://www.purplelinux.co.nz fournit de bonnes informations à ce sujet.

L'exemple trouvé sur purplelinux (qui fonctionne bien) suggère ce qui suit:

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


Et vous pouvez même créer un CRS en appelant:

QgsCoordinateReferenceSystem("PROPERTY:ID")

ce qui serait:

QgsCoordinateReferenceSystem("EPSG:31467")

quelle IMHO rend le code beaucoup plus lisible.

Kim
la source
1
Notez que le code est pour QGIS 2.X et vous devriez voir d'autres réponses listées ici pour le code QGIS3
Mr Purple
4

Utilisez ceci:

QgsProject.instance().setCrs(my_crs)
letmaik
la source
1
Fonctionne avec QGIS3, quand my_crs=QgsCoordinateReferenceSystem(4326):)
axel_ande