ラベル 日本語 の投稿を表示しています。 すべての投稿を表示
ラベル 日本語 の投稿を表示しています。 すべての投稿を表示

2011年4月19日火曜日

9 マップデータ 9 - ka-Map Layer Nameを日本語にする

9-4-8 Layer Nameを日本語にする
Identify/Query(ポイント表示)、Search(検索)結果のレイヤ名Layer Nameの日本語表示

QueryクエリやSearch検索の結果が表示されるマップインフォメーションMap Infoの部分のレイヤ名Layer Nameを日本語名にしてみました。

Identify/Query:
htdocs/map_query_float.phpファイルの次の行(2か所)

echo "<p>Layer Name:</p> <h6>" . $oLayer->name . "</h6>";

を次のようにかえます。

---
//get LAYER_TITLE
$szLayerTitle = $oLayer->getMetaData("group_title");
if ($szLayerTitle != '') {
$layertitle = $szLayerTitle;
} else {
$layertitle = $oLayer->name;
}
//END get LAYER_TITLE
echo "<p>Layer Name:</p> <h6>" . $layertitle . "</h6>";

Search:
htdocs/tools/search/kaSearch.phpファイルの次の行(1か所)

echo "<p>Layer Name:</p> <h6>" . $oLayer->name . "</h6>";

を次のようにかえます。

//get LAYER_TITLE
$szLayerTitle = $oLayer->getMetaData("group_title");
if ($szLayerTitle != '') {
$layertitle = $szLayerTitle;
} else
$layertitle = $oLayer->name;
//END get LAYER_TITLE
echo "<p>Layer Name:</p> <h6>" . $layertitle . "</h6>";

9 マップデータ 8 - ka-Map 日本語の地図のLegend(凡例)設定

9-4-7 日本語の地図のLegend(凡例)設定
Legend(凡例)の日本語表示

htdocs/legend_template.html を見ると、MapServerが出力する Legend を利用しているので、mapfileで設定するとCLASS NAMEの日本語がそのまま表示できます。

マップファイル nippon_bmi_tokyo_pgis.map の LEGEND を次のように追加します。

---
LEGEND
TRANSPARENT TRUE
LABEL
TYPE TRUETYPE #フォントのタイプ
FONT vl-gothic #フォントの種類
COLOR 0 0 0 #フォントの色
ENCODING UTF-8 #文字コード
SIZE 10 #フォントの大きさ
OFFSET 0 -4 #文字の位置 数字は左右、上下の順
END
END
---

tokyo_kukaku レイヤのクラス名を"行政区画"に修正します。

---
 LAYER
NAME tokyo_kukaku
GROUP tokyo_kukaku
TYPE LINE
STATUS ON
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=nippon_bmi host=localhost user=user password=password"
DATA "the_geom from tokyo_kukaku"
# DATA "../mapdata/tokyo_bmi/AdmArea.shp"
METADATA
"group_title" "行政区画"
"queryable" "true"
"searchfield" "name"
"fields" "name:Name"
END
CLASS
NAME "行政区画"
STYLE
COLOR 255 255 204
OUTLINECOLOR 204 204 204
END
   LABEL
    MINFEATURESIZE 40
     TYPE TRUETYPE
     FONT vl-gothic
    ENCODING utf-8
     SIZE 8
   END
END
  TEMPLATE name_template.html
 END
---

9 マップデータ 7 - ka-Map 日本語の地図の Search 設定

9-4-6 日本語の地図の Search 設定
Query は、結果を日本語で表示できます。
Search は、抽出がうまくできず、すべてのデータが表示されます。
コードに修正が必要です。

nippon_bmi_tokyo_pgis.mapのgyoseikaiレイヤにSearchに必要な設定を追加します。

---
 LAYER
NAME tokyo_kukaku
GROUP tokyo_kukaku
TYPE LINE
STATUS ON
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=nippon_bmi host=localhost user=user password=password"
DATA "the_geom from tokyo_kukaku"
# DATA "../mapdata/tokyo_bmi/AdmArea.shp"
METADATA
"group_title" "行政区画"
"queryable" "true"
"searchfield" "name"
"fields" "name:Name"
END
CLASS
NAME "kukaku"
STYLE
COLOR 255 255 204
OUTLINECOLOR 204 204 204
END
   LABEL
    MINFEATURESIZE 40
     TYPE TRUETYPE
     FONT vl-gothic
    ENCODING utf-8
     SIZE 8
   END
END
  TEMPLATE name_template.html
 END
---

しかし、これだけでは結果が抽出されません。
これは、ka-Map が utf-8 で入力した文字と、ISO-8859-13 の文字コードのマップデータの比較に限定しているからのようです。

マップデータの文字コードを ka-Map で表示できるように変換するようにしました。
htdocs/tools/search/kaSearch.php ファイルの次の行を修正します。

//iconv("UTF-8", "ISO-8859-13", $_REQUEST['searchstring']);
//$psearch = $searchstring; //Kumar version

次の行の下に//get LAYERENCODING以下を追加

$szSearchfield = $oLayer->getMetaData('searchfield'); //140行あたり
//PRINTING STUFF

//get LAYERENCODING ここから追加
$oLayer = $oMap->getLayer($i);
$szLayerEncode = $oLayer->getMetaData("layer_encoding");
if ($szLayerEncode != '') {
$layerencode = $szLayerEncode;
} else {
$layerencode = 'utf-8';
}
//END get LAYERENCODING ここまで
// コメントアウトした行をここへ
$searchstring = iconv("utf-8", $layerencode, $_REQUEST['searchstring']);
$psearch = $searchstring; //Kumar version
---

すべてのecho <td>"$val"</td>;の前に次の行を追加します。(275行あたり)

$val = iconv($layerencode, "UTF-8", $val);


すべて修正した後の画像です。

9 マップデータ 6 - ka-Map 日本語の地図のQuery設定

9-4-5 日本語の地図のQuery設定

nippon_bmi_tokyo_pgis.map の tokyo_kukaku レイヤにクエリに必要な設定を追加します。

---
LAYER
NAME tokyo_kukaku
GROUP tokyo_kukaku
TYPE LINE
STATUS ON
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=nippon_bmi host=localhost user=user password=password"
DATA "the_geom from tokyo_kukaku"
# DATA "../mapdata/tokyo_bmi/AdmArea.shp"
LABELITEM "name"
  METADATA
   "group_title" "行政界"
   "queryable" "true" #ここを追加
   "fields" "name:区市町村" #ここを追加
  END
CLASS
NAME "kukaku"
STYLE
COLOR 255 255 204
OUTLINECOLOR 204 204 204
END
   LABEL #ここから追加
    MINFEATURESIZE 40
    TYPE TRUETYPE
    FONT vl-gothic
    ENCODING utf-8
    SIZE 8
   END #ここまで
  END
  TEMPLATE name_template.html #ここを追加
 END
---

name_template.htmlの内容は次のようになります。
nippon_bmi_tokyo_pgis.map と同じフォルダにおいてください。

<html>
 <head>
  <title>Name Template</title>
 </head>
 <body>
  <li>[name]
 </body>
</html>

■参考
シェイプファイルで地図表示するときは、結果が文字化けしてしまいます。
これは、ka-Map は文字エンコード utf-8 で処理するのですが、シェイプファイルのデータは Shift-JIS だからです。

シェイプファイルのデータの文字コードを ka-Map で表示できるように次のようにしました。
Search 機能の修正にも必要ですので、ここで設定しておきます。
まず、マップファイル nippon_bmi_tokyo_pgis.map の tokyo_kukaku レイヤのメタデータ(METADATA)にシェイプファイルのデータの文字コード SJIS を指定します。

---
METADATA
 "group_title" "行政界"
 "layer_encoding" "SJIS" #ここを追加
 "queryable" "true"
 "fields" "name:Name"
END
---

htdocs/map_query_float.php ファイルの すべての 「//END METADATA」 の前につぎのように追加します。

---
//get LAYERENCODING ここから追加
$szLayerEncode = $oLayer->getMetaData("layer_encoding");
 if ($szLayerEncode != '') {
  $layerencode = $szLayerEncode;
 } else {
  $layerencode = 'utf-8';
 }
// ここまで
//END METADATA
---

すべての echo"<td>$val</td>"; の前に次の行を追加します。

$val = iconv($layerencode, "UTF-8", $val);


すべて修正した後の画像です。

9 マップデータ 5 - ka-Map GROUPの日本語表示

9-4-4 GROUPの日本語表示

GROUPのタイトルを日本語にします

Main Page/ja-Ka-Map Wiki
http://ka-map.ominiverdi.org/wiki/index.php/Main_Page/ja

の  マップファイル設定 の Adding International character support for layer names レイヤー名に国際文字を使用するには をクリックします。

ここには、レイヤー名に国際文字を使用する方法が英語で書いてあります。
また、[ka-Map-user]メーリングリストも参考にしました。
(1) add a metadata which called "group_title" in each group in .map file(マップファイルのメタデータ metadata に group_title を追加)に書かれている設定でマップファイルに設定します。

nippon_bmi_tokyo_pgis.map の tokyo_kukaku レイヤを次のように追加します。

---
LAYER
NAME tokyo_kukaku
GROUP tokyo_kukaku
TYPE LINE
STATUS ON
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=nippon_bmi host=localhost user=user password=password"
DATA "the_geom from tokyo_kukaku"
# DATA "../mapdata/tokyo_bmi/AdmArea.shp"
METADATA #追加
"group_title" "行政区画" #追加
END #追加
CLASS
NAME "kukaku"
STYLE
COLOR 255 255 204
OUTLINECOLOR 204 204 204
END
END
END
---

(2) in kamap.js file は、Adding International character support for layer nameではなく、メーリングリストを参考に次のように追加します。
(ka-map/htdocs/kaMap.js)

---
this.opacity = (typeof(o.opacity) != 'undefined') ? o.opacity : 100;

this.title = (typeof(o.title) != 'undefined') ? o.title : 'unnamed'; //この行を追加

this.imageformat = (typeof(o.imageformat) != 'undefined') ? o.imageformat : null;
---

(3) add the "title" attribute like... もメーリングリストを参考に次のように追加します。
init.php ファイルに
(ka-map/htdocs/init.php)

---
/* detect layer opacity (default 100% opaque) */
$opacity = $oLayer->getMetaData('opacity');
if ($opacity == '') {
$opacity = 100;
}

$title = $oLayer->getMetaData('group_title'); //この行を追加

/* detect tile source options (cache, redraw, nocache, or auto) */
$tileSource =
strtolower($oLayer->getMetaData('tile_source'));
if(($tileSource != 'cache') && ($tileSource != 'redraw') && ($tileSource != 'refresh') && ($tileSource != 'nocache')) {
$tileSource = 'auto';
}

---
//$dynamicgroup only if present
$dynamicgroup =($szDynamicgroup)?"dynamicgroup:'".$szDynamicgroup."',":'';

$szLayers .= "map.addLayer(new _layer( { ".
"name:'".$groupName."',".
"visible:".$status.",".
"opacity:".$opacity.",".
"title:'".$title."',". //この行を追加
"imageformat:'".$imageformat."',".
"queryable:".$szQueryable.",".
"subgroup:'".$szSubgroup."',".//Added by full (legend Tree)
$dynamicgroup.
"tileSource:'".$tileSource."',".
"redrawInterval:".$redrawInterval.",".
"refreshInterval:".$refreshInterval.",".
"scales: new Array('".implode("','",$groupScaleVis)."')}));";
}
---

(4)in kaLegend.js file を次のように修正します。
(ka-map/htdocs/kaLegend.js)
---
//td.innerHTML = name; //この行のコメントアウト
td.innerHTML = oLayer.title; //この行を追加
---

しかし、これでは、GROUPを設定していないものも含めたすべてのマップファイルのすべてのレイヤのメタデータ METADATA に "group_title" を設定しないと、Map info のレイヤ名が空欄になってしまいます。
そこで、独自に次のように修正してみました。

---
//td.innerHTML = name; //この行のコメントアウト
//ここから追加
if (oLayer.title != '') {
gtitle = oLayer.title;
} else {
gtitle = name;
}
td.innerHTML = gtitle;
//ここまで
---