MapFile改二

わかってる人はドキュメンテーションが多少不明瞭でも困らないからか、いまだにアンドキュメンテッドなノウハウが要求されることがけっこうあります。最近はSTYLE定義をJavaScriptで動的制御できるように魔改造するRFCとかも出されてるようですし、MapFile先生のさらなる満艦飾化にご期待ください。

SWIG MapScriptの場合

基本的にMapScriptのオブジェクトモデルはSWIGPHPもほとんど変わりないので、PHPのコードを機械的Pythonとかに置き換えればいい…はずなのですが。実際はこんなコードが必要です。

clsid = "KONGO_TYPE"        # KONGO型の表示スタイルをもった点を作る
point = mapscript.pointObj(lon, lat)
coords = mapscript.lineObj()
coords.add(point)
feature = mapscript.shapeObj(lyr.type)
feature.add(coords)
feature.initValues(1)
feature.setValue(0, clsid)
lyr.addFeature(feature)

最後にSetValueした値がCLASS EXPRESSIONと一致したスタイルがえらばれるのでーす。
・・・こんな仕様どうやってわかれと。

PHP MapScriptの場合

PHP MapScriptだとこんな感じだったかと。(最近書いてないので間違ってたらごめん)

$clsidx = 0                  # KONGO型の表示スタイルをもった点を作る
$coords = ms_newLineObj();
$coords->addXY($lon, $lat);
$feature = ms_newShapeObj(MS_SHAPE_POINT);
$feature->set('classindex', $clsidx);
$feature->add($coords);
$lyr->addFeature($feature);
$coords->free();
$coords->free();

KONGO型を選ぶには、CLASSの順番を指定すればいいのでーす。
知らないとちょっとわかりにくいですよね。

たとえば

こういうMapFileがあったとします。"SENKAN" レイヤに置く点の種類、"KONGO_TYPE", "FUSO_TYPE", "NAGATO_TYPE" で違う見た目で表示したいと。

MAP
  # 略
  LAYER
    NAME "SENKAN"
    # 略
    TYPE POINT
    CLASS
      EXPRESSION "KONGO_TYPE"
      STYLE
        # 略
      END
    END
    CLASS
      EXPRESSION "FUSO_TYPE"
      STYLE
        # 略
      END
    END
    CLASS
      EXPRESSION "NAGATO_TYPE"
      STYLE
        # 略
      END
    END
  END
END

ここにMapScriptで動的に点を置きたい場合のコードは・・・

MapScriptって便利だな

前の日記にもMapServerとGeoServerの使い分けを書いたりしましたが、MapServerを使ったほうが確実に楽できるシチュエーションのひとつに、たとえばプログラムロジックでオンザフライで作った地物を画面に出したいときなんかがあります。こういうのはMapScript使うと簡単に実装できます。ただ、地物を動的にclassifyしようとか欲を出すと公式ドキュメント見ただけじゃやり方がわからない人がおおいのではないかと思います。

ここは俺様のメモ帳

なんというか日記やブログ減りましたね。いまや「ブログ」っていったら「ネット掲示板の記事をまとめてアフィるもの」って感じですよねー。日記文化が滅ぶのを見届けたところで、あえて日記でMapServerネタです。しかも小ネタ。