最後に地図上にマーカーを追加してみましょう。図5では、円形のマーカー表示しています。地図上で任意の緯度経度の地点にマーカーを追加します。

図5 (画像をクリックすると別ウィンドウに拡大図を表示します)
そのためには、以下のレイヤーをMapファイルに追加します。
LAYER
NAME "marker"
STATUS ON
TYPE POINT
FEATURE
POINTS
139.76 35.70
139.72 35.65
END
END
CLASS
SYMBOL "circle"
SIZE 30
COLOR 0 0 0
OUTLINECOLOR 0 255 0
END
END
ここではFEATUREオブジェクトとPOINTSオブジェクト、SYMBOLが新しく出てきました。FEATUREオブジェクトはシェープファイルやPostGISなど、外部データ以外のデータをMapファイルで定義する場合に使用します。FEATUREオブジェクト内で、点を記述するためのPOINTSオブジェクトを使用して、2つの点を定義しています。
この点は緯度と経度のセットで記述され、いくつでも追加することができます。これで任意の点を表現することができるようになります。次のSYMBOLについてですが、SYMBOLによって表示するマーカーを決定します。SYMBOLはMapファイルから読み込む別ファイルで定義します。
今回使用するcircleは以下のような定義になっています。
SYMBOL
NAME "circle"
TYPE ellipse
FILLED true
POINTS
1 1
END
END
この内容をsymbolというファイル名でMapファイルと同じディレクトリに保存したとすると、以下のようにSYMBOLSETをMAPオブジェクト内で指定します。
SYMBOLSET "./symbol"
SYMBOLについては下記Webサイトに色々なサンプルが掲載されています。
このURLのサンプルには点線などがありますが、線をSYMBOLに指定する場合はレイヤーのTYPEをPOINTではなくLINEと指定しなければなりません。
次にスクリプトから同じレイヤーを追加してみましょう。マーカーについては他のデータベースなどに保存し、その情報をMapScriptを使用して描画することの方が実用的なはずです。
SYMBOLについてはすでにMapファイルから読み込みまれているとします。先ほどMapファイルで設定したレイヤーと同様のレイヤーは以下のようにMapScriptで追加することができます。
$layer = ms_newLayerObj($map);
$layer->set("name", "marker");
$layer->set("status", MS_ON);
$layer->set("type", MS_LAYER_POINT);
// ShapeObjの作成
$shape = ms_newShapeObj(MS_SHAPE_POINT);
// LineObjで点列を作成する
$line = ms_newLineObj();
$line->addXY(139.76, 35.70);
$line->addXY(139.72, 35.65);
// ShapeObjに点列を追加
$shape->add($line);
// レイヤーへFeatureを追加
$layer->addFeature($shape);
$class = ms_newClassObj($layer);
// クラスへStyleObjを追加
$style = ms_newStyleObj($class);
// StyleObjでSYMBOLなどを追加
#$id = ms_newSymbolObj($map, "circle");
#$style->set("symbol", $id);
$style->set("symbolname", "circle");
$style->set("size", 30);
$style->color->setRGB(0,0,0);
ここではShapeObjとLineObj、StyleObj が出てきました。MapファイルのFEATUREオブジェクトの記述は、ShapeObjとしてMapScriptでは記述します。そして、FEATUREオブジェクト内のPOINTSオブジェクトは、LineObjとして記述します。MapScriptにはPointObjもありますが、LineObjで記述するので注意しましょう。
LineObjにはaddXY()メソッドで点を追加します。このメソッドを複数回呼び出すことで、動的にマーカーを追加することができるでしょう。こうして作成されたLineObjをShapeObjに追加したら、addFeature()メソッドでレイヤーに追加します。
これで、点列の緯度経度データの作成は終了です。次にSYMBOLのクラスへの登録ですが、この部分はMap ファイルとの対応が少し異なるので注意しましょう。CLASSオブジェクトではSYMBOLを直接プロパティとして設定していますが、MapScriptではまずCLASSオブジェクトにStyleObjを追加します。そうして、StyleObjにSYMBOLを指定したり、SIZE、色の設定を行います。
SYMBOLの登録方法には数値での指定と名前での指定の2つがあります。名前での指定の方が簡単なのですが、数値での指定はSYMBOLのオブジェクトを取得するために同様の方法で行うので覚えておきましょう。
最後に、SYMBOLとして画像を使用してみます。図6のようにgif形式やpng形式が指定可能です。

図6 (画像をクリックすると別ウィンドウに拡大図を表示します)
Mapファイルを使用する場合は非常に簡単で、SYMBOLとして画像のファイル名を指定します。また、SYMBOLに指定するパスはMapファイルからの相対パスになります。これと同様のことをMapScriptで行う場合は2つの方法があります。
1つめはSymbolObjを新しく作成し、そのSYMBOLで画像を指定し、StyleObjに指定します。その場合は以下のようにします。
$id = ms_newSymbolObj($map, "pic");
$symbol = $map->getSymbolObjectById($id);
$symbol->setimagepath("./pic.gif");
$style->set("symbol", $id);
ms_newSymbolObj()関数の第2引数には、SYMBOLSETで指定したファイル内で作成されていないシンボル名を指定します。そうすると新しくSymbolObjが作成されるので、getSymbolObjectById()メソッドで取得します。すでに存在する名前のシンボルを指定した場合は、そのシンボルのIDが取得されます。setimagepath()メソッドで画像のパスを登録すれば、あとはそのSYMBOLをStyleObjに指定するだけです。ちなみにこのシンボルをスクリプト内の他の部分で使用することもできます。
もうひとつの方法はもっと簡単で、あらかじめSYMBOLが記述されているファイルに以下のようなSYMBOLを追加します。
SYMBOL
NAME "pic"
TYPE pixmap
IMAGE "./pic.gif"
END
これで、StyleObjで$style->set("symbolname","pic")とすれば画像のSYMBOLを使用することができます。
|