TOPシステム開発> MapScript
PHPプロ!マガジン
MapServerマスターへの道

第3回:MapScriptを使ってみよう

著者:アシアル  森川 穣   2007/1/29
1   2  3  次のページ
MapScript

   次にスクリプトからレイヤーの操作を行ってみましょう。スクリプトでレイヤーの操作を行うには、MapScriptを使用します。MapScriptについては、すでに第2回に掲載したリスト1のスクリプトの中でms_newMapObj()関数やsetSize()メソッドなどを使用しています。MapScriptのリファレンスは下記のURLから参照することができます。

   今回はスクリプトから市区町村の名前を表示するレイヤーを追加してみましょう。サンプルをリスト5に掲載します。表示は図4のようになります。

リスト5
1 <?php
2
3 // 東京都の緯度経度情報
4 $min_lon = 138.9; $min_lat = 35.45;
5 $max_lon = 140.0; $max_lat = 35.95;
6
7
8 // 設定ファイルからオブジェクトを作成する
9 $map = ms_newMapObj("./list1.map");
10 // 出力する画像サイズの設定
11 $map->setSize(800, 400);
12 // 地図画像に含まれる緯度経度の指定
13 $map->setExtent($min_lon, $min_lat, $max_lon, $max_lat);
14
15 $layer = ms_newLayerObj($map);
16 $layer->set("name", “cityname”);
17 $layer->set("connectiontype", MS_POSTGIS);
18 $layer->set("connection",“user=postgres password=pass dbname=phppro_sample host=localhost”);
19 $layer->set("data", “the_geom FROM gyosei”);
20 $layer->set("type", MS_LAYER_ANNOTATION);
21 $layer->set("labelitem", “cn2”);
22 $layer->set("status", MS_ON);
23 $class = ms_newClassObj($layer);
24 $class->label->set("size", 10);
25 $class->label->set("type", MS_TRUETYPE);
26 $class->label->set("font", “gothic”);
27 $class->label->set("encoding", “UTF8”);
28 $class->label->color->setRGB(0, 0, 0);
29
30
31
32 // 保存する画像のパス
33 $image_file = dirname(__FILE__) . “/mapimg/figure1.png”;
34 // 画像オブジェクトの作成
35 $img = $map->draw();
36 // 画像オブジェクトからファイルへの保存
37 $img->saveImage($image_file);
38
39 header("Content-type: image/png");
40 readfile($image_file);
41 ?>

図4
図4
(画像をクリックすると別ウィンドウに拡大図を表示します)

   PHPスクリプトからレイヤーはms_newLayerObj()関数で追加することができます。作成されてすぐの状態では何の設定もされていないので、各種プロパティをset()メソッドで指定します。ですが、ms_newLayerObj()関数の第2引数に他のレイヤーを指定することで、そのレイヤーのコピーを取得することができます。

   これは後述のms_newClassObj()関数でも同様です。TYPEは第2回に掲載したリスト2のMapファイルではPOLYGONとしていましたが、テキストを表示する場合はANNOTATIONを指定する必要があります。MapScriptから指定する場合は、定数のMS_LAYER_ANNOTATIONを指定します。また、テキストとして表示するテーブルのフィールド名をLABELITEMで指定します。今回の場合はcn2となります。

   レイヤーのプロパティを設定したら、次にクラスをレイヤーに追加します。クラスの追加はレイヤーの時とあまり変わらず、ms_newClassObj()関数で追加することができます。テキストを表示する場合はクラスのプロパティを設定する必要はあまりなく、ラベルで文字の設定を行います。ラベルはクラスの中に含まれているので、$class->label->set()というようにラベルのプロパティを設定します。

   また前述したリスト5で指定しているのは、文字のサイズとフォントの種類(BITMAPかTRUETYPE)、フォント、データの文字コード、文字の色です。リスト5ではフォントにgothicと指定しています。日本語を表示するには日本語用のフォントを使用できるように、MAPオブジェクト内でFONTSETというフォントのパスを記述したファイルを指定しなければなりません。すでに作成しているfont.leがそのためのファイルです。

FONTSET "./fontfile"

   FONTSETに指定したMap ファイルと同じディレクトリにあるfont.le には以下のように記述します。

gothic /usr/share/fonts/ja/TrueType/kochi-gothic-subst.ttf

   fontfileはMapScriptもしくはMapファイル内でフォントを指定するための名前とフォントのパスをセットで記述します。フォントのパスについては適宜変更してください。また、レイヤーの設定の変更も簡単に行うことができます。

   そのためには、レイヤーをgetLayer()メソッドもしくはgetLayerByName()メソッドで取得します。getLayer()メソッドの引数にはレイヤーの番号を指定します。この番号は0 から始まり、Mapファイルに記述された順番に増えていきます。getLayerByName()メソッドはその名の通りMapファイルでNAMEに指定した文字列を引数に指定します。

   レイヤーの数は$map->numlayersに保存されているので、すべてのレイヤーについて処理を行うのであれば、以下のようにします。

for ($i = 0; $i < $map->numlayers; $i++) {
  $layer = $map->getLayer($i);
// 処理
}

   名前を指定したレイヤーを表示しないようにするのであれば、以下のようにします。

for ($i = 0; $i < $map->numlayers; $i++) {
   $layer = $map->getLayer($i);
   if ($layer->name == "layername") {
        $layer->set("status", MS_OFF);
   }
}

   同様にクラスを取得する場合はレイヤーに対してgetClass()メソッドを使用します。こちらは名前での取得ができませんが、クラスの数は$layer->numclassesから取得することができます。

   サンプルとしてスクリプトからレイヤーを追加してみましたが、実をいうとこの機能は実際にはあまり使用しません。では、どのような機能を使うのかというと、レイヤーのON、OFFの切り替え、設定の一部変更などでしょう。

   アプリケーションを作成するのに、GETやPOSTなどの変数からOFFにするレイヤー、ONにするレイヤーが指定されたり、色の指定が行われる場合です。

1   2  3  次のページ

アシアル株式会社 森川 穣
著者プロフィール
アシアル株式会社
森川 穣

高校まではPC・プログラミングとは無縁の生活を送っていたが、大学時代にプログラミングに目覚める。当時、主にC言語でのプログラミングを行っていた。大学4年時にアシアル株式会社にアルバイトとして入社。そこで初めてPHP言語でのプログラミングを覚え、会社に深く参画していく。「極める!PHP」や「超極める!PHP」、「WEB+DB PRESS」等、多数執筆。現在はオープンソースWeb地図作成ソフトMapServerを使った開発に力を入れている。


INDEX
第3回:MapScriptを使ってみよう
MapScript
  マーカーの追加
  最後に