Pages: 1
- Sujet précédent - QGIS: Composeur/Projection & Ellipsoïde de la carte dynamique (pyqgis) - Sujet suivant
#1 Wed 08 June 2016 15:15
- doublecriquet
- Participant occasionnel
- Date d'inscription: 10 Jul 2009
- Messages: 28
QGIS: Composeur/Projection & Ellipsoïde de la carte dynamique (pyqgis)
Bonjour,
Bien qu'étant familier de Georezo, et plus particulièrement la section Autodesk Map 3D, je suis nouveau sur ce forum QGIS.
Alors bonjour à tous, et j'espère pouvoir trouver ici autant d'information de qualité que je peux en trouver dans la section Autocad Map 3D .
Je sollicite ici votre aide car je souhaiterais préparer un modèle composeur .qpt avec, dans le cartouche, la valeur de projection et la valeur d'ellipsoïde de la carte, ces valeurs devant être dynamiques pour s'adapter à chaque nouvelle impression.
Travaillant dans le milieu du câble sous-marin, je suis en effet amené à devoir imprimer des cartes locales un peu partout sur la surface du Globe, et donc à devoir régulièrement changer de projection (UTM le plus souvent), voire d'ellipsoïde (WGS84 le plus souvent).
J'utilise QGIS Instant Print Plugin pour tracer mes cartes à partir de modèles .qpt.
Après une longue recherche sur Google, je me suis aperçu que ce type de besoin (afficher dynamiquement des infos de projection dans le composeur) n'était à priori pas courant (et cela m'étonne beaucoup!), car il y a très peu d'info à ce sujet. Je n'ai d'ailleurs trouvé qu'un seul site qui en parle : http://www.xyht.com/spatial-itgis/dynam … s-layouts/. Je précise que je ne suis pas développeur, que je n'ai aucune connaissance en langage informatique (encore moins en python), donc excusez moi par avance pour le manque d'imprécision...
Malheureusement, cette page n'est pas aboutie. Pour résumer, l'auteur y explique comment créer un champs automatique permettant d’afficher le code 'wkt' (Well know Text format) du scr du canvas, à l'aide d'un code pyqgis inscris dans l'éditeur de fonction (2ème onglet de l'éditeur d'expression) de la boite texte créée.
Le code python qgis à écrire dans l'éditeur de fonction est le suivant :
Code:
from qgis.core import * from qgis.gui import * from qgis.utils import iface @qgsfunction(args='auto', group='Custom') def crsstring(stringformat, feature, parent): settings = iface.mapCanvas().mapSettings() if stringformat == 'wkt': return settings.destinationCrs().toWkt() else: return settings.destinationCrs().toProj4()
La variable rédigée '[% crsstring('wkt') %] ' dans la boite texte du composeur permet d'appeler le code décrit ci-dessus, et donc d'afficher le code 'wkt' (Well know Text format) du scr du canvas.
Jusque là tout marche bien. Le problème est que la description wkt du scr est beaucoup trop détaillée/longue pour un cartouche, et personnellement je vous rappelle que je ne souhaiterais afficher que la projection de la carte dans un premier champs, et l'ellipsoide dans un second champs.
Par la suite, l'auteur de la page explique comment n'afficher automatiquement que le code EPSG choisi (ex: 'EPSG 3395') plutôt que le code 'wkt' complet, mais même si ce n'est pas ce que je souhaite faire, j'ai essayé, et ça ne marche pas. J'ai essayé car l'affichage du code EPSG uniquement s'obtiendraient par le QString 'authid'. Or, j'ai pu remarquer dans la documentation de l'API QGIS "classQgsCoordinateReferenceSystem" (http://qgis.org/api/classQgsCoordinateR … ystem.html) que les valeurs que je souhaite afficher existent bien, et elles aussi via des Qstings 'ellipsoidAcronym' et 'projectionAcronym'.
D'où ma question : Y aurait-il parmi vous une bonne âme programmeuse qui sache comment renvoyer dans un champs texte du composeur les valeurs des Qstrings 'ellipsoidAcronym' d'une part, puis dans un autre champs 'projectionAcronym' d'autre part, en précisant quel(s) petit(s) code(s) il faut écrire dans l'éditeur de fonction, et quel(s) texte(s)/variable(s) il faut écrire dans le(s) champs texte(s) pour appeler ce(s) code(s), à la manière de ce qui est écrit dans la page qui m'a permis d'en arriver là où j'en suis ?
Dernières précisions :
- je souhaiterais obtenir les valeur scr de la carte et non du cancas principal, utilisant le plugin Instant Print, et imprimant souvent en projeté (utm, world mercator) depuis un canvas en projection géographique (LatLon EPSG 4326).
- Je suis sous win 7 64
- J'utilise la dernière version de QGIS 2.14.3 win64
Merci par avance pour votre aide. Je reste à votre disposition si besoin d'informations supplémentaires.
Edouard
Hors ligne
#2 Wed 08 June 2016 16:09
Re: QGIS: Composeur/Projection & Ellipsoïde de la carte dynamique (pyqgis)
Bonjour,
Code:
from qgis.core import * from qgis.gui import * from qgis.utils import iface @qgsfunction(args='auto', group='Custom') def crsstring(stringformat, feature, parent): settings = iface.mapCanvas().mapSettings() if stringformat == 'wkt': return settings.destinationCrs().toWkt() elif stringformat == 'authid': return settings.destinationCrs().authid() elif stringformat == 'ellipsoidAcronym': return settings.destinationCrs().ellipsoidAcronym() elif stringformat == 'projectionAcronym': return settings.destinationCrs().projectionAcronym() else: return settings.destinationCrs().toProj4()
Pour utiliser la fonction pour votre besoin dans le composeur se fera au choix avec:
Code:
[% crsstring('authid') %] [% crsstring('wkt') %] [% crsstring('ellipsoidAcronym') %] [% crsstring('projectionAcronym') %]
Cordialement
Thomas
Hors ligne
#3 Wed 08 June 2016 18:34
- doublecriquet
- Participant occasionnel
- Date d'inscription: 10 Jul 2009
- Messages: 28
Re: QGIS: Composeur/Projection & Ellipsoïde de la carte dynamique (pyqgis)
Merci beaucoup Thomas pour cette rapide et TRES précise réponse, qui correspond parfaitement à ma demande. J'espère que cela servira à beaucoup d'autres 'users' non 'developers'.
J'espère aussi que des variables courantes seront ajoutées à l'objet carte du composeur par Nyall Dawson dans une prochaine release de QGIS. (Je viens de lui en faire la suggestion sur son blog ... http://nyalldawson.net/2015/12/explorin … 12-part-1/
Hors ligne
#4 Wed 08 June 2016 19:40
Re: QGIS: Composeur/Projection & Ellipsoïde de la carte dynamique (pyqgis)
Salut,
Sauf erreur, ton vœu est déjà exaucé. J'ai bien accès aux variables dans l'objet carte du composeur.
Voir la capture d'écran en PJ.
Cordialement
Thomas
Hors ligne
#5 Wed 08 June 2016 21:00
- doublecriquet
- Participant occasionnel
- Date d'inscription: 10 Jul 2009
- Messages: 28
Re: QGIS: Composeur/Projection & Ellipsoïde de la carte dynamique (pyqgis)
Re-Bonjour,
Merci pour ce screenshot, mais tu as oublié de déplier le contenu de ces variables map objet. J' ai également sur ma version 2.14.3 des variables map object, mais aucune ne permet d'afficher d'information relative au scr. A moins que tu ne sois sur une version plus recente que moi, et que lorsque tu deplies il y en a de nouvelles qui ont été ajoutées ?
Hors ligne
#6 Thu 09 June 2016 14:13
Re: QGIS: Composeur/Projection & Ellipsoïde de la carte dynamique (pyqgis)
Bonjour,
J'avais mal compris votre besoin relatif aux variables. Ma réponse est donc invalide. Désolé pour le faux espoir
Cordialement
Thomas
Hors ligne
#7 Wed 21 September 2016 18:07
- doublecriquet
- Participant occasionnel
- Date d'inscription: 10 Jul 2009
- Messages: 28
Re: QGIS: Composeur/Projection & Ellipsoïde de la carte dynamique (pyqgis)
Bonjour,
Je reviens sur ce theme, car je ne trouve pas de réponses concrètes à mes dernières avancées.
Je travaille désormais sur des projections personnalisées, écrite en proj4, ex:
"+proj=merc +lon_0=100 +lat_ts=4 +x_0=2000000 +y_0=1000000 +ellps=WGS84 +units=m +no_defs"
J'aimerais pouvoir y récupérer les valeurs suivantes :
central_meridian (+lon_0), donc dans mon exemple '100'
standard_parallel (+lat_ts), donc dans mon exemple '4'
false_easting (+x_0), donc dans mon exemple '2000000'
false_northing (+y_0), donc dans mon exemple '1000000'
D'où mes questions :
1) Existe t-il des Qstrings relatifs à une projection personnalisée ? Car dans ce cas de projection perso., 'authid', 'wkt', 'ellipsoidAcronym', ou encore 'projectionAcronym' ne renvoient rien, la projection personnalisée n'étant définie auprès d'aucune instance officielle à part sur mon poste :-).
2) faut-il déclarer cette projection quelquepart (dans le logiciel, ailleurs?) pour qu'elle soit reconnu ?
3) Autre chose ?
Merci pour votre aide
Cordialement,
Edouard
Hors ligne
#8 Thu 22 September 2016 15:38
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: QGIS: Composeur/Projection & Ellipsoïde de la carte dynamique (pyqgis)
Bonjour,
le code qui peut vous aider :
Code:
@qgsfunction(args='auto', group='Custom') def proj4_info(info, feature, parent): """ Return only the proj4 info part <h4>Syntax</h4> <p>proj4_info(<i>argument</i>)</p> <h4>Arguments</h4> <p><i>argument</i> → the name of the argument as a string, for example 'x_0'.<br> </p> <h4>Example</h4> <p><!-- Show example of function.--> Imagine the proj4 is : </p> <p> +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs </p> <p> proj4_info('proj') → 'lcc'<br> proj4_info('lat_l') → '49'<br></p> <h4>Note:</h4> <p>If the parameters is not present in proj4 None is return </p> """ settings = iface.mapCanvas().mapSettings() proj4 = settings.destinationCrs().toProj4() proj4_info = [ infos for infos in proj4.replace('+','').split() if '=' in infos] proj4_dico = {} for infos in proj4_info: k,v = infos.split('=') proj4_dico[k]=v return proj4_dico.get(info,None)
Pour avoir la valeur de x_0 il faut faire :
Code:
proj4_info('x_0')
Dernière modification par lejedi76 (Thu 22 September 2016 21:04)
Hors ligne
#9 Fri 23 September 2016 16:18
- doublecriquet
- Participant occasionnel
- Date d'inscription: 10 Jul 2009
- Messages: 28
Re: QGIS: Composeur/Projection & Ellipsoïde de la carte dynamique (pyqgis)
Merci beaoucoup lejedi76 pour ta réponse, mais apparemment ton code ne fonctionne pas pour les CRS personnalisés :-(.
Ex:
proj4_info('x_0') renvoie '0' sur une projection connue type "World Mercator EPSG 3395",
proj4_info('x_0') renvoie '' (RIEN) sur une projection personnalisée
... une idée ?
Hors ligne
#10 Mon 26 September 2016 08:34
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: QGIS: Composeur/Projection & Ellipsoïde de la carte dynamique (pyqgis)
Bonjour,
le code fonctionne : tout dépend de comment est définie la projection.
Pour World Mercator EPSG 3395, le proj4 est :
+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs
Donc c'est normal que ca renvoit 0.
Tu peux aller vérifier le SCR dans les propriétés du projet.
Pour ta projection personnalisé, as tu un paramètre x_0 ? Les projections issues du WSG84 n'ont par exemple pas ce paramètre
Cordialement,
Hors ligne
#11 Mon 26 September 2016 12:22
- doublecriquet
- Participant occasionnel
- Date d'inscription: 10 Jul 2009
- Messages: 28
Re: QGIS: Composeur/Projection & Ellipsoïde de la carte dynamique (pyqgis)
Bonjour,
Merci pour ton retour.
La projection personnalisée que j'utilise pour tester est celle-ci :
+proj=merc +lon_0=100 +lat_ts=4 +x_0=2000000 +y_0=1000000 +ellps=WGS84 +units=m +no_defs
J'ai donc bien a priori le paramètre X_0, '2000000', mais proj4_info('x_0') renvoie '' (RIEN). Les autres paramètres proj4_info('lon_0'), proj4_info('lat_ts'), proj4_info('y_0') ne renvoient rien non plus : ''.
Sur 3395, proj4_info('x_0') renvoie bien '0' aussi chez moi, donc marche bien sur cette projection.
Peut-être que ma projection est mal définie en proj4, mais elle marche bien en terme d'affichage et de placement des datas qui sont dans cette projection dans le le canvas.
Aurais tu une idée d'où pourrait provenir le problème ?
Cordialement,
Edouard
Hors ligne
#12 Mon 26 September 2016 16:02
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: QGIS: Composeur/Projection & Ellipsoïde de la carte dynamique (pyqgis)
Bonjour,
quelle version de qgis ?
Avez vous définie la projection dans Préférences > Projection Personnalisée.
Cela fonctionne chez moi sous la 2.10
Hors ligne
#13 Mon 26 September 2016 17:57
- doublecriquet
- Participant occasionnel
- Date d'inscription: 10 Jul 2009
- Messages: 28
Re: QGIS: Composeur/Projection & Ellipsoïde de la carte dynamique (pyqgis)
Bonjour,
Merci beaucoup pour votre aide.
Suite à votre dernière question, et après avoir testé sur 2.12.3, 2.14.6, et 2.16.2 sans succès, je m'aperçois que la cause du non fonctionnement chez moi vient du fait que j'utilise le plugin InstantPrint pour mes impressions.
Quand je lance une impression avec Instant Print, ce plugin demande de sélectionner le CRS dans lequel on souhaite imprimer, puis créé, dans un modèle de composer choisi par l'utilisateur, la carte au CRS demandé. A partir de là, tant qu'on édite dans le composeur et qu' InstantPrint reste ouvert dans le Canvas principal de QGIS, le CRS du canvas est modifié au CRS sélectionné dans InstantPrint. En revanche dès lors qu'on ferme le plugin, le CRS du canvas revient au CRS initial du projet (chez moi WGS84 EPSG 4326).
InstantPrint marche très bien avec des projections référencées par QGIS: En World Mercator 3395, quand InstantPrint est en marche et que je regarde le CRS du canvas principal (en bas à droite de QGIS) il est bien affiché 'EPSG:3395 (ALV)' (affichage QGIS 2.16.2). C'est pourquoi je peux afficher '0' à partir de votre code pour 'x_0' sur mon composeur.
En revanche dans ma projection personnalisée '+proj=merc +lon_0=100 +lat_ts=4 +x_0=2000000 +y_0=1000000 +ellps=WGS84 +units=m +no_defs', quand InstantPrint est en marche et que je regarde le CRS du canvas principal (en bas à droite de QGIS) il affiche seulement (ALV). J'imagine que c'est la raison pour laquelle il n'y a rien d'affiché à partir de votre code pour 'x_0' sur mon composeur.
Je viens de tester que si je passe par une impression classique, sans InstantPrint, et que je change donc le CRS du canvas dans ma projection personnalisée avant l'édition dans le composeur (par QGIS en bas à droite du canvas principal, et il affiche bien cette fois 'USER: 100012 (ALV)', 'j'obtiens bien le paramètre X_0 = '2000000'.
Sauriez vous à tous hasard, s'il y a un moyen de faire reconnaître par InstantPrint une projection personnalisée, c'est à dire que QGIS affiche bien un CRS 'USER: 100012 (ALV)' par exemple au lieu de '(ALV)' quand on utilise ce plugin ? Car je crois bien que le problème vient de là.
Hors ligne
Pages: 1
- Sujet précédent - QGIS: Composeur/Projection & Ellipsoïde de la carte dynamique (pyqgis) - Sujet suivant