ものぐさな人向きの位置データ置き場
※FOSS4G Advent Calendar 2013 参加記事です。
本当は別のネタ書こうと用意してたんだけど諸事情でオチを用意できなかった(?)ので、別の小ネタになってしまってごめん。そっちも後日書く。
MapFile改二
わかってる人はドキュメンテーションが多少不明瞭でも困らないからか、いまだにアンドキュメンテッドなノウハウが要求されることがけっこうあります。最近はSTYLE定義をJavaScriptで動的制御できるように魔改造するRFCとかも出されてるようですし、MapFile先生のさらなる満艦飾化にご期待ください。
SWIG MapScriptの場合
基本的にMapScriptのオブジェクトモデルはSWIGもPHPもほとんど変わりないので、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しようとか欲を出すと公式ドキュメント見ただけじゃやり方がわからない人がおおいのではないかと思います。