Rotation automatique des cartes dans Map Composer QGIS

10

Le fait est que je me demande de permettre de calculer automatiquement la rotation de la carte dans Map Composer. J'ai plusieurs cartes dans un fichier avec leurs propres paramètres de projection, et je voudrais définir la rotation des cartes dans le composeur de cartes en fonction de la formule de projection (ou autre chose?)

par exemple, localiser une carte spécifique dans le projet:

entrez la description de l'image ici

La projection est

entrez la description de l'image ici

Dans le compositeur de carte, la limite de la carte ressemble

entrez la description de l'image ici

Et avec l'angle de rotation sélectionné pour la carte avec leurs paramètres de projection:

entrez la description de l'image ici

L'angle de rotation de la carte est différent pour chaque carte en fonction de son emplacement et des paramètres de projection.

Est-il possible d'automatiser ce processus et de calculer l'angle de rotation de la carte automatiquement, car ne trouve pas cette valeur manuellement à chaque fois (je voudrais créer un composeur universel pour toutes les cartes via le menu de génération d'atlas)?

Jeanne
la source
1
Voulez-vous faire pivoter l'entité de sorte qu'elle soit parallèle aux bords du cadre de la carte? Pourriez-vous calculer l'azimut de l'un des côtés de l'entité et l'utiliser pour la faire pivoter? Si c'était une ligne, quelque chose comme rotation = degrés (atan (abs ((y1-y2) / (x1-x2))))) vous donnerait un angle en degrés. Ensuite, la rotation à 90 ° l'alignerait sur le cadre de la carte.
mixedbredie
2
Utilisez-vous un atlas? Si vous générez une couche de couverture à l'aide de l'outil "Boîte de délimitation minimale orientée", cette couche comprendra un attribut de rotation qui peut être lié à la rotation de l'élément de carte à l'aide de propriétés définies par les données.
ndawson
@mixedbredie, Oui, je souhaite faire pivoter ma carte afin que les limites de la carte soient parallèles au cadre de la carte dans le canevas de carte. J'ai essayé de calculer l'azimut, mais le problème est que ma couche avec des cartes est poligonale et rien ne dit que le premier point est le sommet gauche en haut ou un autre sommet certain (en bas à droite, etc.). Donc, l'angle presque chaque fois ne satisfait pas
Jane
La solution proposée par @ndawson fonctionne à merveille. Utilisez la nouvelle couche de boîte englobante comme couche de couverture cachée et tout sera aligné.
mixedbredie
1
Ouvrez la boîte à outils de traitement (Ctrl + Alt + T) et recherchez "orienté" - vous voyez l'outil sous Géoalgorithmes QGIS> Outils généraux de vecteur.
mixedbredie

Réponses:

3

Ci-dessous une solution trouvée par @ndawson dans les commentaires de la question. N'hésitez pas à commenter et à améliorer cette réponse.

Exécutez à partir de la boîte à outils de traitement l'outil Boîte de délimitation minimale orientée sur la grille d'enveloppe de carte que vous utilisez déjà.

Outil Boîte englobante orientée

Cela créera un calque qui devrait être tout à fait identique à votre calque d'origine. Vous trouverez dans la table attributaire un champ ANGLE

Champs OBB

Vous devriez maintenant pouvoir utiliser ce champ ANGLE dans le compositeur pour remplir le champ de données défini pour la rotation:

Angle défini par les données

Le problème semble être que l'angle n'est pas toujours facile à utiliser car il dépend de la façon dont les polygones initiaux sont faits. J'ai fait quelques tests et cela dépend de la façon dont vous avez dessiné vos polygones source. Vous devrez peut-être modifier les valeurs des attributs du champ ANGLe en conséquence:

(le rouge est les polygones d'origine, en noir les polygones de l'outil OMBB). J'ai numérisé pour l'exemple des polygones similaires de deux manières différentes (aller à droite ou à gauche)

Exemple OMBB

Pour ramener la valeur d'angle à votre calque d'origine, vous pouvez utiliser une opération de jointure de localisation spatiale.

gisnside
la source
Merci beaucoup! J'ai rouge attentivement votre réponse détaillée! Mais le problème semble être plus complexe. J'ai une couche avec toutes les cartes et leurs projections dans le tableau d'attributs pour chaque carte. La couche initiale avec un ensemble de cartes dans WGS84, mais lors de la préparation d'une carte, j'ai défini la projection dans le canevas de carte, tirée de la table d'attributs (qui diffère pour chaque carte) et j'ai besoin d'une valeur de rotation de carte dans CETTE PROJECTION. Je dois donc réenregistrer chaque carte dans sa propre projection, puis exécuter OMBB pour le polygone. J'ai testé pour certaines cartes, mais la valeur de l'angle de rotation sans succès diffère de celle calculée via OMBB
Jane
Ce serait formidable de calculer la valeur de l'angle de rotation dans le composeur de cartes, en fonction de la formule de projection dans la table attributaire
Jane
Pas facile ! Je ne vois pas comment vous pourriez le faire d'une manière simple, en particulier pour l'angle de rotation. Il existe un moyen de projeter des données avec la fonction "transformer", mais je doute que cela fonctionne pour tout autre élément que les coordonnées. (Renvoie la géométrie transformée d'un CRS source en un CRS de destination. Syntaxe: transform (geom, source_auth_id, dest_auth_id) - Exemple: geom_to_wkt (transform ($ geometry, 'EPSG: 2154', 'EPSG: 4326'))
gisnside