banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Mon 27 October 2008 10:15

robinevrard
Juste Inscrit !
Date d'inscription: 14 Oct 2008
Messages: 8

Zoom relatif à un objet sélectionné ds une boucle en MapBasic

Bonjour à toutes et à tous,

Voici le sujet qui me conduit à faire appel à vos compétences.

Je souhaiterai exporter des images JPEG relatives à chacun des objets contenus dans une table. Le principe est donc le suivant : je lance une boucle relative à la table en question, et au sein de cette boucle, je programme un Exporter fenêtre.
Ceci fonctionne tel que je le souhaite à une exception près : je ne parviens pas à déterminer un seuil de zoom qui s'adapte précisément à chacun des objets, avant leur export au format JPEG.

Voici mon script :

Code:

--- Introduction d'un répertoire de fonctions MapBasic prédéfinies
include "mapbasic.def"


'--- Déclaration des différentes procédures
declare sub main
declare sub Exporter


'--- Déclaration impérative de la procédure principale propre à MapBasic
'--- Appel de la procédure Exporter
sub main
    call Exporter
end sub


sub Exporter 

'--- Déclaration des variables utilisées au cours de la procédure Exporter
dim carte_win_id, i as integer
dim X, Y, P, v_perimetre_brick as float
dim v_chem_exe, v_nom_brik as string


    '--- Enregistrement du chemin d'accès de l'application
    v_chem_exe=ApplicationDirectory$()

    '--- Ouverture de NomTable
    Open Table v_chem_exe & "03_Brick\NomTable.TAB" Interactive

    '--- Ouverture de la fenêtre carte
    Map From NomTable

    '--- Attribution du numéro identifiant la fenêtre lors de chaque nouvelle session
    carte_win_id = FrontWindow() 

    '--- Lancement de la boucle
    select * from NomTable 
    fetch Rec 1 from NomTable 
    do until eot(NomTable)=true 

        '--- Renseignement de la longitude de l'enregistrement sélectionné 
        X = CentroidX(NomTable.obj) 

        '--- Renseignement de la latitude de l'enregistrement sélectionné 
        Y = CentroidY(NomTable.obj) 

        '--- Renseignement du périmètre de l'enregistrement sélectionné 
        P = CartesianPerimeter(NomTable.obj, "km") 

        '--- Passage du périmètre de l'objet sélectionné dans une variable
        v_perimetre_brick = P 

        '--- Recentre la carte sur le barycentre de l'enregistrement sélectionné
        Set Map Center (X,Y) XY Units "m"     

        '--- Détermine un seuil de zoom égal au périmètre de l'enregistrement sélectionné divisé par 2 (seuil déterminé empiriquement au préalable)
        Set Map Zoom v_perimetre_brick/2 Units "km" 

        '--- Passage du libellé de l'objet sélectionné dans une variable
        v_nom_brik = NomTable.Libelle

        '--- Export de la fenêtre carte, actuellement centrée sur l'enregistrement sélectionné 
        Save Window carte_win_id As v_chem_exe & "05_Resultats\" & v_nom_brik & ".JPG" Type "JPEG"

        fetch next from NomTable
    loop 
end sub

'

Alors si vous avez des pistes...

Merci de votre attention,

Hors ligne

 

#2 Mon 27 October 2008 10:50

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Zoom relatif à un objet sélectionné ds une boucle en MapBasic

Bonjour
Si vous ne rajoutez pas l'objet aux couches représentées (auquel cas un Set Map Zoom Entire Layer 1 ferait l'affaire), je vous conseille le passage par rect_obj = MBR(obj) qui produit le rectangle englobant et ObjectGeography(rect_obj,3) - ObjectGeography(rect_obj,1) qui donne sa largeur (maxX - minX)

Hors ligne

 

#3 Mon 27 October 2008 14:26

robinevrard
Juste Inscrit !
Date d'inscription: 14 Oct 2008
Messages: 8

Re: Zoom relatif à un objet sélectionné ds une boucle en MapBasic

Merci beaucoup pour vos conseils Maurice.

Après avoir testé vos deux propositions, j'ai opté pour la première car elle adpate parfaitement le zoom à la géométrie de chaque objet, tandis que la seconde ne donne pas toujours un résultat optimum.

Au revoir et bon après-midi,

Hors ligne

 

Pied de page des forums

Powered by FluxBB