y-matsui::weblog

電子楽器、音楽、コンピュータ、プログラミング、雑感。面倒くさいオヤジの独り言

MapGuide:SDFデータの属性から文字列検索

MapGuideのASP.NETサンプルアプリケーションを改造しつつ、MapGuideとASP.NETを両方勉強している。
今回のお題は「国土数値情報の駅名を使って、文字列あいまい検索」をやってみた。
表記に日本語を使うので、サンプルアプリケーションのaspxファイルをすべて、UTF-8、BOM付きで保存しなおし、ページディレクティブにはResponseEncoding="utf-8" を追加しておく。
<%@ Page language="c#" debug="true" ResponseEncoding="utf-8" %>
findparceltask.aspx 検索入力画面
findparcels.aspx 検索結果画面
findparcelfunctions.aspx 検索結果のオブジェクトを格納する仮想レイヤ生成関数など

属性を使って図形オブジェクトを絞り込んだ後、どのようにレイヤを重ねて表示するのかが謎であったが、このサンプルがお勉強用の完璧なサンプルなのであった。
findparceltask.aspxのPOST先がfindparcels.aspxになってるんだけど、findparceltask.aspxの中で
MgLayer layer = GetLayerByName(map, " ParcelMarker");
って指定しているのがミソ。
ParcelMarkerっていうレイヤは、サーバ上の実体データとして存在しない。

POSTされたfindparcels.aspxが、セッション(接続)固有の仮想レイヤとして生成するのである。
MgResourceIdentifier tempLayerResId = new MgResourceIdentifier("Session:" + sessionId + "//ParcelMarker.LayerDefinition");

「findparcels.aspxがミソだね。」ってことで、じっくり舐めまわすように見る。

ふむふむ、
String filter = "STN LIKE '%" + station + "%'";

MgResourceIdentifier featureResId = new MgResourceIdentifier("Library://SuuchiChizu/Data/N02-05_EB03.FeatureSource");
MgFeatureQueryOptions queryOptions = new MgFeatureQueryOptions();
queryOptions.SetFilter(filter);

この時点で、「STN(駅名)が、stationという変数(POSTされた文字列)を含む」という条件を、”Data/N02-05_EB03”に対して指定しているわけですな。

結果リストに表示させるnameを
String name = featureReader.GetString("STN") + "( " + featureReader.GetString("LIN") + " )";
こんな風に、駅名(路線名)に加工して

properties.Add(new MgStringProperty("STN", name));
properties.Add(new MgGeometryProperty("Location", geometryReaderWriter.Write(point)));
parcelMarkerCommands.Add(new MgInsertFeatures("ParcelMarker", properties));
最後、テンポラリレイヤに結果をインサートすれば完了。

めでたく、駅名を使った検索が出来た。
search_station.jpg