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 30 November 2009 11:08

flo42
Juste Inscrit !
Date d'inscription: 8 Apr 2009
Messages: 6

[Mapserver 5]zoom

Bonjour,

débutante en mapserver, je ne comprends pas comment marche le zoom indiqué dans la documentation de mapserver.org. Pourriez vous m'expliquer comment il calcule son zoom?
car à l'avenir, j'aimerai remplacer les facteurs de zoom actuels par une liste déroulante avec des échelles: style 1/25000, 1/50000,1/100000.
De plus, j'ai un gros problème d'échelle. J'ai affiché l'échelle dans la carte par le mapfile mais celle-ci est complètement fausse!! je travaille sur le département de la nièvre et d'après l'échelle celui-ci ferait plus de 40500km de large!!!! Ma seconde question est alors comment est calculée l'échelle?
je vous remrcie pour votre aide.

Hors ligne

 

#2 Tue 01 December 2009 14:47

flo42
Juste Inscrit !
Date d'inscription: 8 Apr 2009
Messages: 6

Re: [Mapserver 5]zoom

bonjour,

j'ai trouvé une solution pour le zoom.
la liste déroulante:

Code:

        <SELECT name="nomzoom" size="1">
            <?php
            
            if($zoom==6)
            {
                echo "<OPTION value='6' selected>1/100 000 </option>";
            }
            else
            {
                echo "<OPTION value='6'>1/100 000 </option>";
            }
            if($zoom==12)
            {
                echo "<OPTION value='12' selected>1/50 000 </option>";
            }
            else
            {
                echo "<OPTION value='12'>1/50 000 </option>";
            }
            if($zoom==25)
            {
                echo "<OPTION value='25' selected >1/25 000 </option>";
            }
            else
            {
                echo "<OPTION value='25'>1/25 000 </option>";
            }
            if($zoom==100)
            {
                echo "<OPTION value='100' selected >1/10 000 </option>";
            }
            else
            {
                echo "<OPTION value='100'>1/10 000 </option>";
            }
            ?>
        </SELECT>
        <INPUT TYPE=SUBMIT NAME="zoom" VALUE="Zoom"  SIZE=2 >

puis le code pour zoomer grâce aux différents facteur de zoom:

Code:

         if (isset($_POST["nomzoom"])){
         $zoom=$_POST["nomzoom"];
        
        $extent_to_html=$map->extent->minx." ".$map->extent->miny." ".$map->extent->maxx." ".$map->extent->maxy;
        $extent_to_set=explode(" ",$extent_to_html);
        $map->setextent($extent_to_set[0],$extent_to_set[1],$extent_to_set[2],$extent_to_set[3]);
        $my_point=ms_newpointObj();
        $my_point->setXY($refx,$refy);
        $my_extent=ms_newrectObj();
        $my_extent->setextent(638000, 2184000, 744000, 2288000);
        $zoom_factor=$zoom;
        $val_zsize=abs($zoom_factor);
        $map->zoompoint($zoom_factor,$my_point,$map->width,$map->height,$my_extent);
        
        if ($zoom==6)
        {
            $layer = $map->getLayerByName('ign');            
            $layer->set("status", MS_DELETE);
        }
        }

Mais je n'ai toujours pas solutionné mon problème d'échelle!! Cela vient-il de l'extent du mapfile? de la résolution de l'image?

Dernière modification par flo42 (Tue 01 December 2009 14:48)

Hors ligne

 

#3 Tue 01 December 2009 22:52

assefa
Participant occasionnel
Date d'inscription: 7 Nov 2008
Messages: 12

Re: [Mapserver 5]zoom

Voici la fonction qui calcule l'echelle de la map dans mapserver. Ca depend de l'extent geographic de la carte, des sizes (width, height del map), des unites de la map, et la resolution (qui est 72 par default). Si tous ces parametres sont correctement initiilaises dans votre map file et l'echelle est encore mauvaise, vous puvez peut etre mettre votre map file en ligne pour que je puisse y jetter un coup d'oeil.
Autre chose, si vous utilisez mapscript pour verfier l'echelle,  la valeure de l'echelle dans le map object n'est calculee qu'au momenet ou on invoque certaines operations qui modifient les extents. Par example:

  $oMap = ms_newMapObj("$map_file");
  echo $oMap->scaledenom;

pourrait vous donner des results errones.  Mais quelquechose comme ca va forcer le scale a etre recalculer:
  $oMap = ms_newMapObj("$map_file");
  $oMap->draw();
  echo $oMap->scaledenom;



static char *unitText[6]={"in", "ft", "mi", "m", "km", "NM"};
double inchesPerUnit[7]={1, 12, 63360.0, 39.3701, 39370.1, 72913.3858, 4374754};

int msCalculateScale(rectObj extent, int units, int width, int height, double resolution, double *scale)
{
  double md, gd, center_y;

  /* if((extent.maxx == extent.minx) || (extent.maxy == extent.miny))   */
  if(!MS_VALID_EXTENT(extent)) {
    msSetError(MS_MISCERR, "Invalid image extent, minx=%lf, miny=%lf, maxx=%lf, maxy=%lf.", "msCalculateScale()", extent.minx, extent.miny, extent.maxx, extent.maxy);
    return(MS_FAILURE);
  }
 
  if((width <= 0) || (height <= 0)) {
    msSetError(MS_MISCERR, "Invalid image width or height.", "msCalculateScale()");
    return(MS_FAILURE);
  }

  switch (units) {
  case(MS_DD):
  case(MS_METERS):   
  case(MS_KILOMETERS):
  case(MS_MILES):
  case(MS_NAUTICALMILES):
  case(MS_INCHES): 
  case(MS_FEET):
    center_y = (extent.miny+extent.maxy)/2.0;
    md = (width-1)/(resolution*msInchesPerUnit(units, center_y)); /* remember, we use a pixel-center to pixel-center extent, hence the width-1 */
    gd = extent.maxx - extent.minx;
    *scale = gd/md;
    break;
  default:
    *scale = -1; /* this is not an error */
    break;
  }

  return(MS_SUCCESS);
}

Hors ligne

 

#4 Wed 02 December 2009 11:17

flo42
Juste Inscrit !
Date d'inscription: 8 Apr 2009
Messages: 6

Re: [Mapserver 5]zoom

bonjour,

merci pour votre aide.
j'ai essayé sur mon mapscript mais je ne comprends pas tout!comment est appelé la fonction? je ne comprends pas la déclaration de votre tableau

Code:

static char *unitText[6]={"in", "ft", "mi", "m", "km", "NM"};
double inchesPerUnit[7]={1, 12, 63360.0, 39.3701, 39370.1, 72913.3858, 4374754};

je ne connais pas la programmation objet, juste le php!
Je joins le mapfile et le mapscript, si cela peut vous aider!
merci encore.


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#5 Thu 03 December 2009 15:08

assefa
Participant occasionnel
Date d'inscription: 7 Nov 2008
Messages: 12

Re: [Mapserver 5]zoom

Votre map file specfie UNITS KILOMETERS, est-ce que ca ne devarit pas etre lutot des UNITS METERS.  Les extents en x donnent 744000 - 638000=106000 et ca semble etre plutot des distances en Metres.

De ce qui du caclule de l'echelle, voici comment elle est faite (j'assume un dpi de 72, et que les unites sont des metres):

  72 pixel ---> 1 inch
  800 pixels (width) ---> 11.11inchs

11.11inch = 0.282 metre


  0.282 metre sur la carte represent 106000m sur le terrain
  l'echelle = 106000/0.282 = 375886.524

Hors ligne

 

#6 Thu 03 December 2009 15:25

flo42
Juste Inscrit !
Date d'inscription: 8 Apr 2009
Messages: 6

Re: [Mapserver 5]zoom

bonjour,
je venais juste vous dire que j'avais trouver cette erreur dans mon mapfile!! et que cette fois votre formule marche très bien!
en effet, j'ai déclaré des kilometres au début pour la carte alors que c'était des mètres!
excusez moi du dérangement!
merci pour votre aide!

Hors ligne

 

#7 Fri 04 December 2009 11:53

brunofriedmann
Participant occasionnel
Lieu: Vellerat, suisse
Date d'inscription: 19 Apr 2008
Messages: 31
Site web

Re: [Mapserver 5]zoom

> j'ai essayé sur mon mapscript mais je ne comprends pas tout!comment est appelé la fonction? je ne comprends pas la déclaration de votre tableau

Pas de panique l'extrait de code est issu du C de mapserver : Il a bien dit voici la fonction qui calcule l'échelle.

> -----------------
>     Code :
> static char *unitText[6]={"in", "ft", "mi", "m", "km", "NM"};
> double inchesPerUnit[7]={1, 12, 63360.0, 39.3701, 39370.1, 72913.3858, 4374754};
> -----------------
>
> je ne connais pas la programmation objet, juste le php!
> Je joins le mapfile et le mapscript, si cela peut vous aider!
> merci encore.

Ben PhP est objet depuis la version 5 :-)

Donc le petit bout de php donné précedemment

   $oMap = ms_newMapObj("$map_file");
   $oMap->draw();
   echo $oMap->scaledenom;

devrait le faire ( c'est à dire forcer une opération de draw sur la carte )

Hors ligne

 

Pied de page des forums

Powered by FluxBB