PHP/MapScriptを使ってみる

PHP/MapScriptを使う

前回CentOS5.8上でMapServer5.6.8の動作確認ができたので、今回は、PHPを使ってmapを表示してみます。
まずは、手始めにshpファイルの世界地図をブラウザーに表示させてみましょう。
必要なものは、phpファイル、mapfile(拡張子がmap)、shpファイル一式です。
shpファイルはロシア応用地学センターからダウンロードしておきます(ArcView SHP FORMATの方です)。

超簡単PHP/MapScript

まず、/var/www/htmlのowner,groupを変更して、アクセスし易いようにします。
そして、Directoryを作成します。
何でも良いですが、例としてworldとします。

# chown -R tys. /var/www/html/
# exit   -> rootから抜ける。
$ mkdir /var/www/html/world
$ cd /var/www/html/world
$ mkdir data
$ cd data
$ wget http://data.geocomm.com/editorspicks/world_shp.zip
$ unzip world_shp.zip
$ rm -rf world_shp.zip
$ cd

でshpファイルをworld/data内に解凍しておきます。(shp,dbf,shxの拡張子ファイル3個できます。)

phpファイル作成

スクリプトを書いて、myworld.phpとして保存する。
myworld.php

<?php
$mapfile = "myworld.map";
$map = ms_newMapObj( $mapfile ); // load the mapfile
$img = $map -> draw(); // draw the map
$img_url = $img->saveWebImage(); // save img & get the URL
echo "<IMG SRC='$img_url'>"; // display map with an IMG tag
?>

mapfile作成

これが無いと、表示できません。phpファイルと同じDirectoryにmyworld.mapを作成します。
myworld.map

MAP
  EXTENT -180 -90 180 90
  UNITS DD
  INTERLACE ON
  SIZE 600 300
  IMAGECOLOR 102 153 255
  SHAPEPATH "data"
  WEB
    #IMAGEPATH "C:/ms4w/Apache/htdocs/world/"
    #IMAGEURL "/ms_tmp/"
    IMAGEPATH "/var/www/html/tmp/"  #イメージファイルを書き込むDirectory
    IMAGEURL "/tmp/"
  END # web end
  #layerの定義
  LAYER
   NAME "World"
   STATUS ON
   TYPE POLYGON
   DATA "country_col_region"
   CLASS
     COLOR 255 220 160
     OUTLINECOLOR 0 0 0
   END
  END #layer end
END # map end

これで準備OKです。worldのDirectoryは以下のようになっているか、確認してください。

html --- world --- myworld.php
                |
                +- myworld.map
                |
                +- data --- country_col_region.shp
                         +- country_col_region.dbf
                         +- country_col_region.shx

地図の表示

後は、ブラウザーでhttp://localhost/world/myworld.phpで世界地図が表示されます。

myworld.phpで表示

ちょとした機能追加

ただ、「世界地図が表示されてもねぇ~~ それが何だよ。JPEGでリンクして表示しただけだろ!」と今までの苦労を知らない人にとってはなんてこと言われ続けていますので、ちょいと機能を追加してみましょう。
スクリプトmyworld2.phpとして、作成してみます。
myworld2.php

<?php
//dl('php_mapscript.so');
// Default values and configuration
    $val_zsize=3;
    $check_pan="CHECKED";
    $map_path="/var/www/html/world/";
    $map_file="myworld.map";
    $map = ms_newMapObj($map_path.$map_file);
    if ( isset($_POST["mapa_x"]) && isset($_POST["mapa_y"])
          && !isset($_POST["full"]) ) {
          $extent_to_set = explode(" ",$_POST["extent"]);
          $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($_POST["mapa_x"],$_POST["mapa_y"]);
          $my_extent = ms_newrectObj();
          $my_extent->setextent($extent_to_set[0],$extent_to_set[1],
                                  $extent_to_set[2],$extent_to_set[3]);
          $zoom_factor = $_POST["zoom"]*$_POST["zsize"];
          if ($zoom_factor == 0) {
                  $zoom_factor = 1;
                  $check_pan = "CHECKED";
                  $check_zout = "";
                  $check_zin = "";
          } else if ($zoom_factor < 0) {
                  $check_pan = "";
                  $check_zout = "CHECKED";
                  $check_zin = "";
          } else {
                  $check_pan = "";
                  $check_zout = "";
                  $check_zin = "CHECKED";
          }
          $val_zsize = abs($zoom_factor);
          $map->zoompoint($zoom_factor,$my_point,$map->width,$map->height,
                          $my_extent);
     }
     $image=$map->draw();
     $image_url=$image->saveWebImage();
     $extent_to_html = $map->extent->minx." ".$map->extent->miny." "
                  .$map->extent->maxx." ".$map->extent->maxy;
 ?>
     <HTML>
     <HEAD>
     <TITLE>Map 2</TITLE>
     </HEAD>
     <BODY>
     <CENTER>
     <FORM METHOD=POST ACTION=<?php echo $HTTP_SERVER_VARS['PHP_SELF']?>>
     <TABLE>
     <TR>
          <TD>
                  <INPUT TYPE=IMAGE NAME="mapa" SRC="<?php echo $image_url?>">
          </TD>
     </TR>
     <TR>
          <TD>
                  Pan
          </TD>
          <TD>
                  <INPUT TYPE=RADIO NAME="zoom" VALUE=0 <?php echo $check_pan?>>
          </TD>
     </TR>
     <TR>
          <TD>
                  Zoom In
          </TD>
          <TD>
                  <INPUT TYPE=RADIO NAME="zoom" VALUE=1 <?php echo $check_zin?>>
          </TD>
     </TR>
     <TR>
          <TD>
                  Zoom Out
          </TD>
          <TD>
                  <INPUT TYPE=RADIO NAME="zoom" VALUE=-1 <?php echo $check_zout?>>
          </TD>
     </TR>
     <TR>
          <TD>
                  Zoom Size
          </TD>
          <TD>
                  <INPUT TYPE=TEXT NAME="zsize" VALUE="<?php echo $val_zsize?>"
                  SIZE=2>
          </TD>
     </TR>
     <TR>
          <TD>
                  Full Extent
          </TD>
          <TD>
                  <INPUT TYPE=SUBMIT NAME="full" VALUE="Go"
                  SIZE=2>
          </TD>
     </TABLE>
     <INPUT TYPE=HIDDEN NAME="extent" VALUE="<?php echo $extent_to_html?>">
     </FORM>
     </CENTER>
     </BODY>
     </HMTL>

後は、ブラウザーでhttp://localhost/world/myworld2.phpで世界地図が表示されます。
myworld2.phpで表示

これで、ZoomIN,ZoomOUT,PAN, FullExtentの最低限の機能が使えるようになりました。

最後に

mapfileの記述方法などについては、追々書いていきます。
YaskeyさんのHPでPHP/MapScript 4.x tutorialを参考にして、アプリケーションを作成するなど、Internet上にいろいろとありますので、それらを活用してください。

次回は、MapServerのFrameworkであるjavascriptを使ったKa-mapを使って、最終的にはこんな感じみたいなWEB-GISを作成していきたいと思います。

Social Widgets powered by AB-WebLog.com.