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));
最後、テンポラリレイヤに結果をインサートすれば完了。
めでたく、駅名を使った検索が出来た。