#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.
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