1.9.2 Přidání možnosti zoom in, zoom out, pan

Zatímco v případě CGI aplikace řeší operace s mapou samotná CGI aplikace mapserv.exe, v případě PHP modulu se o toto musí postarat vždy námi vytvořený skript. Jednoduše řečeno, co si nenapíšeme to nemáme. Výhodou však je možnost napsání operací, které CGI verze nenabízí.

Úvod

Podívejme se na následující kód, který pouze definuje základní uživatelské prostředí a parametry, které budou od uživatele předávány našemu skriptu (nové řádky jsou vyznačeny tučně):

<HTML>
<BODY>
<H1>Cviceni s PHP/MapScript</H1>
<?
  //dl("php_mapscript.dll");
  $mapfile = "prvni.map";   
  $mapa = ms_newMapObj($mapfile);
   
  //mapa má rozsah
  //zapsání rozsahu do objektu rect
  $rect = $mapa->extent;
 
  //zapsání rozsahu do stránky
  //umístění všech parametrů do formuláře
  ?>
 <FORM ACTION="prvni.php" METHOD=POST>
  <INPUT TYPE="HIDDEN" NAME="minx" VALUE=<? echo $rect->minx; ?>>
  <INPUT TYPE="HIDDEN" NAME="miny" VALUE=<? echo $rect->miny; ?>>
  <INPUT TYPE="HIDDEN" NAME="maxx" VALUE=<? echo $rect->maxx; ?>>
  <INPUT TYPE="HIDDEN" NAME="maxy" VALUE=<? echo $rect->maxy; ?>>
  <?
  $img = $mapa->draw(); 
  $url = $img->saveWebImage(MS_PNG, 1, 1, 0);
?>
<INPUT TYPE="IMAGE" NAME="mapa2" SRC=<? echo $url; ?> WIDTH=600 HEIGHT=400 BORDER=1>
<INPUT TYPE="HIDDEN" NAME="width" VALUE=600> <!—šířka mapy -->
<INPUT TYPE="HIDDEN" NAME="height" VALUE=400> <!—výška mapy -->
<P>Akce:
      <!—přepínací políčko na akci -->
      <input type=radio name=mode value=browse <? if ($mode==browse) echo "checked"; ?>> Prohlížet
</P>
<P>Zoom:
      <!—přepínací políčka  -->
      <input type=radio name=zoomf value=2 <? if ($zoomf==2) echo "checked"; ?>> Zoom In
      <input type=radio name=zoomf value=1 <? if ($zoomf==1) echo "checked"; ?>> Pan
      <input type=radio name=zoomf value=-2 <? if ($zoomf==-2) echo "checked"; ?>> Zoom Out
</P>
 
</FORM>
 
</BODY>
</HTML>

 

Uvedený kód není schopen zpracovávat kliknutí uživatele na obrázek, ale pouze demonstruje jaké parametry budeme skriptu předávat. Jedná se o podobnou skladbu jako v případě rozhraní pro CGI aplikaci.

Uživatelské rozhraní

V první řadě je to samozřejmě souřadnice kliknutí uživatele na obrázek:

<INPUT TYPE="IMAGE" NAME="mapa2" SRC=<? echo $url; ?> WIDTH=600 HEIGHT=400 BORDER=1>

Ty jsou předávány přes parametr mapa2.

Souřadnice kliknutí

V druhé řadě to jsou údaje o rozsahu zobrazené mapy v souřadnicích mapy:

<INPUT TYPE="HIDDEN" NAME="minx" VALUE=<? echo $rect->minx; ?>>
...

Všechny čtyři souřadnice získáváme z obdélníku, který je pojmenován rect. Tento nabízí vlastnosti minx, miny, maxx, a maxy. Daný obdélník je získán pomocí vlastnosti extent objektu mapa.

$rect = $mapa->extent;

Souřadnice rozsahu mapy

Dále jsou to údaje width a height, které udávají velikost obrázku v pixelech.

<INPUT TYPE="HIDDEN" NAME="width" VALUE=600>
<INPUT TYPE="HIDDEN" NAME="height" VALUE=400>

Šířka a výška mapy

V další kapitole se budeme zabývat i pořizováním bodů nad mapou a proto musíme rozlišit zda chce uživatel měnit měřítko mapy (resp. centrovat mapu) nebo zda chce umístit bod. K tomu nám slouží parametr mode (podobně jako u CGI).

<input type=radio name=mode value=browse <? if ($mode==browse) echo "checked"; ?>> Prohlížet

V případě, že je parametr mode roven hodnotě browse bude probíhat změna měřítka nebo centrování.

Akce uživatele

Dále musíme rozlišit, zda chce uživatel zvětšit nebo zmenšit měřítko, případně posunout (centrovat) mapu. To nám bude zajišťovat parametr zoomf.

<input type=radio name=zoomf value=2 <? if ($zoomf==2) echo "checked"; ?>> Zoom In
<input type=radio name=zoomf value=1 <? if ($zoomf==1) echo "checked"; ?>> Pan
<input type=radio name=zoomf value=-2 <? if ($zoomf==-2) echo "checked"; ?>> Zoom Out

Rozlišení mezi ZoomIn, ZoomOut a Pan

V další fázi musíme parametry zadané uživatelem zpracovat a provést zvolenou operaci. Tj. musíme se přesvědčit, zda uživatel zvolil některou z funkcí, resp. jakou zvolil.

Toto zpracování je demonstrováno rozšířením již uvedeného kódu (tučné řádky jsou nově přidané řádky):

<HTML>
<BODY>
<H1>Cviceni s PHP/MapScript</H1>
<?
//dl("php_mapscript.dll");
$mapfile = "prvni.map"; #9;
$mapa = ms_newMapObj($mapfile);

//*********Převzetí parametrů od uživatele**************

 
//místo kliknutí uživatele – souřadnice x v pixelech
$x = $HTTP_POST_VARS['mapa2_x'];
//místo kliknutí uživatele – souřadnice y v pixelech
$y = $HTTP_POST_VARS['mapa2_y'];
//přepínací tlačítko akce
$mode = $HTTP_POST_VARS['mode'];
//přepínací tlačítko Zoom...
$zoomf = $HTTP_POST_VARS['zoomf'];
//šířka obrázku v pixelech
$width = $HTTP_POST_VARS['width'];
//výška obrázku v pixelech
$height = $HTTP_POST_VARS['height'];
//rozsah zobrazené plochy v reálných souřadnicích
$minx = $HTTP_POST_VARS['minx'];
$miny = $HTTP_POST_VARS['miny'];
$maxx = $HTTP_POST_VARS['maxx'];
$maxy = $HTTP_POST_VARS['maxy'];

//*********Konec převzetí parametrů od uživatele****

 
//ověření zda uživatel zvolil nějakou funkci
//(resp. nejedná se o první spuštění)
if ($mode!="") {
//vytvoření nového objektu typu Rectangle
$rect2 = ms_newRectObj();
//nastavení rozsahu obdélníka v reálných souřadnicích
//rozsah (minx, ...) se předává v
//sekci setting the rectangle
$rect2->setextent($minx, $miny, $maxx, $maxy);
//vytvoření obdélníka v pixelech
$rect3 = ms_newRectObj();
$rect3->setextent(0, 0, 600, 400);
//zoom mapy na předchozí rozsah zapsaný níže
//resp. rozsah z předchozí akce uživatele
$mapa->zoomrectangle($rect3, $width, $height, $rect2);
}
//uživatel zvolil funkci Prohlížet(Browse)
if ($mode=="browse") {
//vytvoření nového Bodu
$pPoint = ms_newPointObj();
//nastavení souřadnic dle kliknutí uživatele
$pPoint->setXY($x, $y);
//získání obdélníka
$rect = $mapa->extent;
//zoom na bod
$mapa->zoompoint($zoomf, $pPoint, $width, $height, $rect);
}

//mapa má nový rozsah
//zapsání nového rozsahu do objektu rect
$rect = $mapa->extent;
//setting the rectangle
//zapsání nového rozsahu do stránky
//umístění všech parametrů do formuláře
?>
<FORM ACTION="prvni.php" METHOD=POST>
<INPUT TYPE="HIDDEN" NAME="minx" VALUE=<? echo $rect->minx; ?>>
<INPUT TYPE="HIDDEN" NAME="miny" VALUE=<? echo $rect->miny; ?>>
<INPUT TYPE="HIDDEN" NAME="maxx" VALUE=<? echo $rect->maxx; ?>>
<INPUT TYPE="HIDDEN" NAME="maxy" VALUE=<? echo $rect->maxy; ?>>
<?
$img = $mapa->draw();
$url = $img->saveWebImage(MS_PNG, 1, 1, 0);
?>
<INPUT TYPE="IMAGE" NAME="mapa2" SRC=<? echo $url; ?> WIDTH=600 HEIGHT=400 BORDER=1>
<INPUT TYPE="HIDDEN" NAME="width" VALUE=600> <!—šířka mapy -->
<INPUT TYPE="HIDDEN" NAME="height" VALUE=400> <!—výška mapy -->
<P>Akce:
<!—přepínací políčko na akci -->
<input type=radio name=mode value=browse <? if ($mode==browse) echo "checked"; ?>> Prohlížet
</P>
<P>Zoom:
<!—přepínací políčka -->
<input type=radio name=zoomf value=2 <? if ($zoomf==2) echo "checked"; ?>> Zoom In
<input type=radio name=zoomf value=1 <? if ($zoomf==1) echo "checked"; ?>> Pan
<input type=radio name=zoomf value=-2 <? if ($zoomf==-2) echo "checked"; ?>> Zoom Out
</P>

 
</FORM>

 
</BODY>
</HTML>

Zpracování události kliknutí uživatele a zvolené funkce

V úvodu přidaného kódu se převezmou všechny parametry, předávané od uživatele. Všechny parametry se nachází v systémovém poli HTTP_POST_VARS.

//místo kliknutí uživatele – souřadnice x v pixelech
$x = $HTTP_POST_VARS['mapa2_x'];
//místo kliknutí uživatele – souřadnice y v pixelech
$y = $HTTP_POST_VARS['mapa2_y'];
//přepínací tlačítko akce
$mode = $HTTP_POST_VARS['mode'];
//přepínací tlačítko Zoom...
$zoomf = $HTTP_POST_VARS['zoomf'];
//šířka obrázku v pixelech
$width = $HTTP_POST_VARS['width'];
//výška obrázku v pixelech
$height = $HTTP_POST_VARS['height'];
//rozsah zobrazené plochy v reálných souřadnicích
$minx = $HTTP_POST_VARS['minx'];
$miny = $HTTP_POST_VARS['miny'];
$maxx = $HTTP_POST_VARS['maxx'];
$maxy = $HTTP_POST_VARS['maxy'];

Převzetí parametrů

Dále je za všech okolností (resp. v případě volby jakékoliv funkce) provedena změna měřítka na rozsah předaný uživatelem. Tato operace musí být provedena vždy protože objekt mapa, který získáme v úvodu skriptu má vždy rozsah takový jaký je nadefinován v souboru prvni.map. Uživatel však již mohl provést změnu měřítka a tudíž jeho rozsah neodpovídá rozsahu v prvni.map.

if ($mode!="") {
//vytvoření nového objektu typu Rectangle
$rect2 = ms_newRectObj();
//nastavení rozsahu obdélníka v reálných souřadnicích
//rozsah (minx, ...) se předává v
//sekci setting the rectangle
$rect2->setextent($minx, $miny, $maxx, $maxy);
//vytvoření obdélníka v pixelech
$rect3 = ms_newRectObj();
$rect3->setextent(0, 0, 600, 400);
//zoom mapy na předchozí rozsah zapsaný níže
//resp. rozsah z předchozí akce uživatele
$mapa->zoomrectangle($rect3, $width, $height, $rect2);
}

Změna měřítka se provádí pomocí metody zoomrectangle, která vyžaduje obdélník v pixelech, rozměry obrázku v pixelech a obdélník v reálných souřadnicích.

Změna měřítka dle předchozího stavu na straně uživatele

V poslední fázi je provedena operace dle volby uživatele (tj. buď ZoomIn nebo ZoomOut nebo Pan).

if ($mode=="browse") {
//vytvoření nového Bodu
$pPoint = ms_newPointObj();
//nastavení souřadnic dle kliknutí uživatele
$pPoint->setXY($x, $y);
//získání obdélníka
$rect = $mapa->extent;
//zoom na bod
$mapa->zoompoint($zoomf, $pPoint, $width, $height, $rect);
}

Ke změně měřítka dle kliknutí uživatele se využívá funkce zoompoint, která vyžaduje faktor změny měřítka (-2: ZoomOut, 2: ZoomIn, 1: Pan), místo kliknutí v pixelech, rozměry obrázku v pixelech a obdélník (rozsah mapy) v reálných souřadnicích.

ZoomIn, ZoomOut, Pan

V prohlížeči zadejte adresu http://127.0.0.1/ms/prvni.php. Vyberte akci Prohlížet a funkci ZoomIn a klikněte do mapy. Výstup je zobrazen na dalším obrázku.

Testování

Obrázek 1-35: Výstup z prvni.php po ZoomIn.

Pokud jste neobdrželi uvedený výstup, podívejte se do průvodce studiem. Pokud ani tam nenajdete řešení vašeho problému postupujte podle pokynů uvedených v úvodu modulu.

Výstup z prvni.php po ZoomIn

 

PRŮVODCE STUDIEM 15

 

V případě problémů s kopírováním (přepisováním) kódu souboru jej naleznete na CD v adresáři ms/ pod názvem prvni_v3.php.

Zdroj na CD

 

Přestože máte kód v pořádku může dojít k několika chybovým hlášením. Dále je uvedeno jedno nejpravděpodobnější:

Chyby

 

Warning: MapServer Error in : in c:\program files\apache group\apache\htdocs\ms\prvni.php on line 58

Fatal error: zoomPoint failed : incorrect parameters in c:\program files\apache group\apache\htdocs\ms\prvni.php on line 58

Tato chyba ukazuje na nepředání parametru zoomf a to značí, že jste nevybrali přepínací políčko ZoomIn, vraťte se v prohlížeči o krok zpět, vyberte funkci ZoomIn a zkuste znovu.

Chyba - zoomPoint failed