- PostGIS のインストール を参考に EPEL を yum のパッケージ取得元に追加する
- あとは
$ sudo yum -y install mapserver 
- インストールの確認
# /usr/libexec/mapserver 
This script can only be used to decode form results and should be initiated as a CGI process via a httpd server. CGI 経由で呼ばれていないというエラーが正しく表示された
- projection のデータファイルを追加でダウンロードする必要がある。(proj4 は mapserver に依存してインストールされるが epsg ファイルはインストールされない)
$ sudo yum -y install proj*
Loaded plugins: priorities, refresh-packagekit, security
8956 packages excluded due to repository priority protections
Setting up Install Process
Package proj-4.8.0-3.el6.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package proj-debuginfo.x86_64 0:4.8.0-2.rhel6 will be installed
---> Package proj-devel.x86_64 0:4.8.0-3.el6 will be installed
---> Package proj-epsg.x86_64 0:4.8.0-3.el6 will be installed
---> Package proj-nad.x86_64 0:4.8.0-3.el6 will be installed
---> Package proj-static.x86_64 0:4.8.0-3.el6 will be installed
--> Finished Dependency Resolution
... 
Apache から呼び出す  †
- mapserver を cgi-bin に配置する
$ cd /var/www/cgi-bin/
$ sudo ln -s /usr/libexec/mapserver 
$ sudo chmod 755 mapserver
$ ls -la /var/www/cgi-bin/
合計 8
drwxr-xr-x. 2 root root 4096 11月 24 20:14 2013 .
drwxr-xr-x. 6 root root 4096 11月 12 22:47 2013 ..
lrwxrwxrwx. 1 root root   22 11月 24 20:14 2013 mapserver -> /usr/libexec/mapserver 
- http.conf の編集
$ grep cgi-bin -r /etc/httpd/conf で、どこに cgi-bin 関連の設定があるか調べる。普通に /etc/httpd/conf/httpd.conf だった。
 Symbolic link と CGI の実行を許可する ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
 
 #
 # "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
 # CGI directory exists, if you have that configured.
 #
 <Directory "/var/www/cgi-bin">
 #    AllowOverride None
 #    Options None
     Options FollowSymLinks Includes ExecCGI
     AllowOverride All
     Order allow,deny
     Allow from all
 </Directory>
 
- Apache を自動起動するようにする
$ sudo /sbin/chkconfig httpd --level 35 on
$ sudo /sbin/service httpd start 
- Apache 経由で mapserver を呼んでみる
  mapfile がないというエラーが 正しく 表示された
- mapserver (httpd) が、socket 通信をするのを許可する
- GUIで設定
# yum -y install policycoreutils*
# /usr/bin/system-config-selinux httpd_can_network_connect を on にする  
- CUIの場合
# /usr/sbin/setsebool httpd_can_network_connect true でうまくいくか試してみる。このフラグはリブートすると元に戻る。
 これでうまくいくようなら永続化する# /usr/sbin/setsebool -P httpd_can_network_connect true しばらく処理が終わらないけどビビらないように
- 今どき SELinux を無効化するという選択肢はありえない
 
Postgis に格納されている地理空間情報を画像化する  †
mapfile  †
- データの格納場所と描画方法を定義するファイル
- ALGOL みたいな構造
- 大文字、小文字は区別しない。コメントは # 以降。設定パラメータは "" で囲む*1
- 制限 (変更するためには再コンパイルが必要)
- MAXCLASSES 250
- MAXSTYLES 5
- MAXSYMBOLS 64
 
- MAP ::= <LAYER>*
- LAYER ::= <CLASS>*
- CLASS ::= <STYLE>*
MAP  †
| NAME [name] | 名称 | 
| IMAGETYPE [type] | 出力フォーマット。gif, png, jpeg, wbmp, gtiff, swf | 
| EXTENT [minx] [miny] [maxx] [maxy] | 表示範囲 | 
| SIZE [x] [y] | 出力サイズ | 
| IMAGECOLOR [r] [g] [b] | 背景色。TRASNPARENT ON の場合透過色 | 
| TRANSPARENT [flag] | 背景色を透過色として用いるかどうかのフラグ。on, off | 
| FONTSET [filename] | フォント | 
| LAYER | レイヤ | 
| LEGEND | 凡例 | 
| WEB | WEBオブジェクト | 
| PROJECTION | 投影法 | 
PROJECTION  †
PROJECTION
  "init=epsg:4326"
END
どのレイヤも同じ投影法なら設定不要。epsg は小文字。/usr/share/proj/epsg を参照することを示している。Linux ではファイル名は case sensitive
- WGS84(epsg:4326) :: アメリカの測地系。Google Map も WGS84
- JGD2000(epsg:4612) :: 日本測地系2000(世界測地系)。測量法の単位系。国土交通省や自治体が公開しているデータは JGD2000
- JGD2000 と WGS84 の誤差は 1cm 以下なんで、JGD2000 を WGS84 とみなして描画しても問題なかろ
LAYER  †
| NAME [name] | 名称 | 
| STATUS [status] | レイヤの表示状態。on, off, default | 
| TYPE [type] | データ形式。point, line, polygon, circle, annotation, raster, query, chart | 
| CONNECTIONTYPE [type] | 接続形式。local, sde, ogr, postgis, oraclespatial, wms | 
| CONNECTION [con] | データベース接続文字列 | 
| DATA [data] | データ。filename, sde parameter, postgis select/from, oracle select/from | 
| PROCESSING [param] | 処理オプション。oracle, postgis で接続プール :: PROCESSING "CLOSE_CONNECTION=DEFER" | 
| FILTER [where] | データの絞り込み条件。 where節Mapserver 7 から LAYER の FILTER句は where 句ではなくなった → where句について | 
| OFFSITE [r] [g] [b] | 透過色 | 
| TRANSPARENCY [0〜100] | レイヤの透過度 | 
| CLASS | クラス | 
| TEMPLATE [file] | CLASS TEMPLATE | 
| PROJECTION | 投影法 | 
CLASS  †
| NAME [name] | 名称。凡例には表示されない | 
| BACKGROUNDCOLOR [r] [g] [b] | 背景色 | 
| COLOR [r] [g] [b] | 描画色 | 
| EXPRESSION [string] | このクラスの表示条件。データ属性の参照 [属性名]。使える演算子 =, >, <, <=, >=, =, or, and, lt, gt, ge, le, eq, ne, length() | 
| MAXSCALE [double] | このクラスが表示される最大スケール。デフォルトは ∞ | 
| MINSCALE [double] | このクラスが表示される最小スケール。デフォルトは 0 | 
| SYMBOL [symbol] | シンボル。name : シンボル名。filename : gifまたはpng画像ファイル | 
| STYLE | スタイル。ラベルだけのレイヤでも空の STYLE が必要 | 
| LABEL | ラベル | 
STYLE  †
| ANTIALIAS [flag] | 文字と線をアンチエイリアスするか。true, false | 
| BACKGROUNDCOLOR [r] [g] [b] | 背景色 | 
| COLOR [r] [g] [b] | 描画色 | 
| OUTLINECOLOR [r] [g] [b] | 輪郭色 | 
| WIDTH [px] | 輪郭線の幅。デフォルト 1 | 
| SYMBOL [symbol] | シンボル。name : シンボル名。filename : gifまたはpng画像ファイル | 
- http://mapserver.org/mapfile/layer.html
- Mapserver 6 までは、LAYER 節内の FILTER で指定していた
  LAYER 
    NAME countries
    STATUS DEFAULT
    TYPE POLYGON
    CONNECTIONTYPE POSTGIS
    CONNECTION "host=localhost port=5432 dbname=demo user=postgres password=postgres"
    DATA "geom from countries_table" # SQL SELECT Statement
    FILTER 'are=midage and population > 100000'
    CLASS
      ...
    END # End of CLASS
  END # End of LAYER
 
- Mapserver 7 からは PROCESSING "NATIVE_FILTER=..."
  LAYER 
    NAME countries
    STATUS DEFAULT
    TYPE POLYGON
    CONNECTIONTYPE POSTGIS
    CONNECTION "host=localhost port=5432 dbname=demo user=postgres password=postgres"
    DATA "geom from countries_table" # SQL SELECT Statement
    PROCESSING "NATIVE_FILTER=are='midage' and population > 100000"
    CLASS
      ...
    END # End of CLASS
  END # End of LAYER
 - where 句内の '' は PROCESSING 句を "" で囲む
PROCESSING "NATIVE_FILTER=are='midage' and population > 100000" または エスケープ \' するPROCESSING 'NATIVE_FILTER=are=\'midage\' and population > 100000' 
- Mapserver 7 でも FILTER を指定できるが、SQL 文の Result Set からの絞込になる
FILTER ("[type]"='road' and [size]<2)
 
- where 句の中のパラメータを GET パラメータから取得することもできる → GIS Mapserver GETパラメータ
Postgis に格納されているPOINTを別レイヤに表示する  †
SYMBOL  †
ラベル  †
LABEL  †
| ANTIALIAS [flag] | 文字と線をアンチエイリアスするか。true, false | 
| TYPE [type] | bitmap, truetype | 
| FONT [font] | フォント名 (fonts.list で定義したフォント名) | 
| SIZE [px] | フォントサイズ | 
| COLOR [r] [g] [b] | 描画色 | 
| OUTLINECOLOR [r] [g] [b] | アウトライン色 | 
| SHADOWCOLOR [r] [g] [b] | 影の色 | 
| SHADOWSIZE [x] [y] | 影のオフセット | 
| FORCE [flag] | ラベルが重なっても表示するかのフラグ。true, false。デフォルト false | 
| POSITION [position] | ラベルの位置。ul (UPPER-LEFT), uc, ur, cl, cc, cr, ll, lc, lr, auto | 
| ENCODING [chaset] | エンコーディング (内部的に iconv を使っているので、エンコーディング名は iconv と同じ) | 
| WRAP [character] | 改行文字 | 
- OUTLINECOLOR に COLOR の補色を使うのがミソ。
- 普通、陸地と海は補色が使われる
- そのため、陸地の上に置いてはっきり表示される色は、海の上に置くと判別しにくくなる
|  | 陸(白)の上では | 海(青)の上では |  | 文字色(黒) | 判別しやすい | 判別しにくい |  
 
- 文字色の補色で文字の縁取りをしておけば、陸地と海の両方で判別しやすくなる
|  | 陸(白)の上では | 海(青)の上では |  | 文字色(黒) | 判別しやすい | 判別しにくい |  | 縁取り(白) | 判別しにくい | 判別しやすい |  |  |  |  |  | 縁取り付きの文字 | 判別しやすい | 判別しやすい |  
 
- Nさんに教せーてもらった。ありがとう
 
WEB  †
- WEB で、HTML テンプレートに値を埋め込むことができる
- 表示する画像は、Apache から見える一時領域に出力する必要がある
$ sudo mkdir /var/www/html/tmp
$ sudo chown apache /var/www/html/tmp
$ sudo chmod 755 /var/www/html/tmp 
- 画像は定期的に削除する
 /etc/cron.hourly/0mavserv#!/bin/bash
/usr/bin/find /var/www/html/tmp/ -name '*.png' -mmin +5 -exec /bin/rm -f {} \;この例だと、1 時間おきに、作られて 5 分以上経っているファイルを消す
- https://hondou.homedns.org/cgi-bin/mapserver?map=/opt/maps/map04.map
  - 地図上をクリックすることで、拡大・縮小
- 縮尺 300 以下で、ランク 1 の都市名も表示している
 
- /opt/map/map04.map
MAP
  IMAGETYPE PNG
  EXTENT -180 -90 180 90 # <Lower Left X> <Lower Left Y> <Upper Right X> <Upper Right Y>
  SIZE   640 320
  IMAGECOLOR 128 128 192
  FONTSET "/opt/maps/fonts.list"
  # WEB
  WEB
    TEMPLATE "/opt/maps/template.html"
    IMAGEPATH "/var/www/html/tmp/"
    IMAGEURL "/tmp/"
    MINSCALEDENOM 200
    MAXSCALEDENOM 1600
  END
  # CIRCLE SYMBOL
  SYMBOL
    NAME "circle"
    TYPE ellipse
    FILLED true
    POINTS
      3 3
    END # End of POINTS
  END # End of SYMBOL
  LAYER 
    NAME countries
    STATUS DEFAULT
    TYPE POLYGON
    CONNECTIONTYPE POSTGIS
    CONNECTION "host=localhost port=5432 dbname=demo user=postgres password=postgres"
    PROCESSING "CLOSE_CONNECTION=DEFER" # DB CONNECTION POOL
    DATA "geom from countries_table" # SQL SELECT Statement
    CLASS
      STYLE
        COLOR 255 255 255
        ANTIALIAS true
      END # End of STYLE
    END # End of CLASS
  END # End of LAYER
  LAYER 
    NAME cities
    STATUS DEFAULT
    TYPE POINT
    CONNECTIONTYPE POSTGIS
    CONNECTION "host=localhost port=5432 dbname=demo user=postgres password=postgres"
    PROCESSING "CLOSE_CONNECTION=DEFER" # DB CONNECTION POOL
    DATA "geom from city_table" # SQL SELECT Statement
    LABELITEM "name"
    CLASS
      EXPRESSION ([scalerank] < 1)
      STYLE
        SYMBOL "circle"
        COLOR 255 102 0
      END # End of STYLE
      LABEL
        TYPE TRUETYPE
        FONT ipa_gothic
        SIZE 10
        COLOR 0 0 0
        OUTLINECOLOR 255 255 255
        SHADOWCOLOR 255 0 0
        SHADOWSIZE 1 1
        FORCE true
        POSITION auto
      END # End of LABEL
    END # End of CLASS
    CLASS
      EXPRESSION ([scalerank] < 3)
      MAXSCALE 300
      STYLE
        SYMBOL "circle"
        COLOR 255 102 0
      END # End of STYLE
      LABEL
        TYPE TRUETYPE
        FONT ipa_gothic
        SIZE 10
        COLOR 0 0 0
        OUTLINECOLOR 255 255 255
        SHADOWCOLOR 255 0 0
        SHADOWSIZE 1 1
        FORCE true
        POSITION auto
      END # End of LABEL
    END # End of CLASS 
    CLASS
      STYLE
        SYMBOL "circle"
        COLOR 255 255 153 
      END # End of STYLE
    END # End of CLASS
  END # End of LAYER
END # End of Map
 
- /opt/map/template.html
<!-- MapServer Template -->
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8"/>
  <title>Map Example</title>
</head>
<body>
  <form name="mapserv" method="GET" action="/cgi-bin/mapserver">
    <input type="hidden" name="map" value="[map]"/>
    <input type="hidden" name="imgext" value="[mapext]"/>
    <div>
      <select name="mode">
        <option value="browse">browser</option>
        <option value="map">map</option>
      </select>
      <select name="zoom">
        <option value="4" [zoom_4_select]>x4</option>
        <option value="3" [zoom_3_select]>x3</option>
        <option value="2" [zoom_2_select]>x2</option>
        <option value="1" [zoom_1_select]>x1</option>
        <option value="-2" [zoom_-2_select]>x-2</option>
        <option value="-3" [zoom_-3_select]>x-3</option>
        <option value="-4" [zoom_-4_select]>x-4</option>
      </select>
      [scaledenom]
      <input type="submit" name="submit" value="reset"/>
    </div>
    <input type="image" name="img" src="[img]" width="640" height="320"/>
  </form>
</body>
</html>
 
WEB  †
| TEMPLATE [path] | テンプレートHTML | 
| IMAGEPATH [path] | 地図画像の仮置きディレクトリ | 
| IMAGEURL [url] | IMAGEPATH の URL | 
| MINSCALEDENOM [double] | 最小倍率 | 
| MAXSCALEDENOM [double] | 最大倍率 | 
MINSCALEDENOM, MAXSCALEDENOM は、LAYER にも指定できる
テンプレートHTML  †
- <!-- MapServer? Template --> は、mapserver の WEB テンプレート宣言。これがないと mapserver がテンプレートと認識しない。
- mapserver は、テンプレート中の [key] を現在表示している地図の属性値に置き換える
- 大抵の場合、[key] は、mapserver の GET パラメータ名と同じ
凡例・縮尺  †
- 縮尺がおかしい。地球一周が約 300 m
地図の縮尺を考慮する必要がある時には、MAP 直下に、UNIT を設定する
| UNIT | feet, inches, kilometers, meters, miles,nauticalmiles。デフォルトは mile |  
 
- https://hondou.homedns.org/cgi-bin/mapserver?map=/opt/maps/map05.map
  
- /opt/map/map05.map
MAP
  IMAGETYPE PNG
  EXTENT -180 -90 180 90 # <Lower Left X> <Lower Left Y> <Upper Right X> <Upper Right Y>
  SIZE   640 320
  IMAGECOLOR 128 128 192
  FONTSET "/opt/maps/fonts.list"
  UNITS dd
  # WEB
  WEB
    TEMPLATE "/opt/maps/template05.html"
    IMAGEPATH "/var/www/html/tmp/"
    IMAGEURL "/tmp/"
    MINSCALEDENOM 200
    MAXSCALEDENOM 177732952
  END
  # SCALE BAR
  SCALEBAR
    UNITS kilometers
    BACKGROUNDCOLOR 255 128 128
    COLOR 0 0 0
    TRANSPARENT on
    STYLE 0
    STATUS embed
    LABEL
      COLOR 0 0 0
      SIZE tiny
    END # End of LABEL
  END # End of SCALEBAR
  
  LEGEND
    KEYSIZE 40 20
    KEYSPACING 10 10 
    OUTLINECOLOR 0 0 0
    IMAGECOLOR 220 220 255
    STATUS ON
    LABEL
      TYPE TRUETYPE
      FONT ipa_gothic
      COLOR 0 0 0
      SIZE 12
      POSITION CL
      PARTIALS FALSE
      BUFFER 3
    END # End of LABEL
  END # End of LEGEND
  # CIRCLE SYMBOL
  SYMBOL
    NAME "circle"
    TYPE ellipse
    FILLED true
    POINTS
      3 3
    END # End of POINTS
  END # End of SYMBOL
  LAYER 
    NAME countries
    STATUS DEFAULT
    TYPE POLYGON
    CONNECTIONTYPE POSTGIS
    CONNECTION "host=localhost port=5432 dbname=demo user=postgres password=postgres"
    PROCESSING "CLOSE_CONNECTION=DEFER" # DB CONNECTION POOL
    DATA "geom from countries_table" # SQL SELECT Statement
    CLASS
      NAME "LAND"
      STYLE
        COLOR 255 255 255
        ANTIALIAS true
      END # End of STYLE
    END # End of CLASS
  END # End of LAYER
  LAYER 
    NAME cities
    STATUS DEFAULT
    TYPE POINT
    CONNECTIONTYPE POSTGIS
    CONNECTION "host=localhost port=5432 dbname=demo user=postgres password=postgres"
    PROCESSING "CLOSE_CONNECTION=DEFER" # DB CONNECTION POOL
    DATA "geom from city_table" # SQL SELECT Statement
    LABELITEM "name"
    CLASS
      NAME "LARGE CITY"
      EXPRESSION ([scalerank] < 1)
      STYLE
        SYMBOL "circle"
        COLOR 255 102 0
      END # End of STYLE
      LABEL
        TYPE TRUETYPE
        FONT ipa_gothic
        SIZE 10
        COLOR 0 0 0
        OUTLINECOLOR 255 255 255
        SHADOWCOLOR 255 0 0
        SHADOWSIZE 1 1
        FORCE true
        POSITION auto
      END # End of LABEL
    END # End of CLASS
    CLASS
      NAME "BIG CITY"
      EXPRESSION ([scalerank] < 3)
      MAXSCALE 45000000
      STYLE
        SYMBOL "circle"
        COLOR 255 102 0
      END # End of STYLE
      LABEL
        TYPE TRUETYPE
        FONT ipa_gothic
        SIZE 10
        COLOR 0 0 0
        OUTLINECOLOR 255 255 255
        SHADOWCOLOR 255 0 0
        SHADOWSIZE 1 1
        FORCE true
        POSITION auto
      END # End of LABEL
    END # End of CLASS 
    CLASS
      NAME "CITY"
      STYLE
        SYMBOL "circle"
        COLOR 255 255 153 
      END # End of STYLE
    END # End of CLASS
  END # End of LAYER
END # End of Map
 
- /opt/map/template05.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8"/>
  <title>Map Example</title>
</head>
<body>
  <form name="mapserv" method="GET" action="/cgi-bin/mapserver">
    <input type="hidden" name="map" value="[map]"/>
    <input type="hidden" name="imgext" value="[mapext]"/>
    <div>
      <select name="mode">
        <option value="browse">browser</option>
        <option value="map">map</option>
      </select>
      <select name="zoom">
        <option value="4" [zoom_4_select]>x4</option>
        <option value="3" [zoom_3_select]>x3</option>
        <option value="2" [zoom_2_select]>x2</option>
        <option value="1" [zoom_1_select]>x1</option>
        <option value="-2" [zoom_-2_select]>x-2</option>
        <option value="-3" [zoom_-3_select]>x-3</option>
        <option value="-4" [zoom_-4_select]>x-4</option>
      </select>
      [scaledenom]
      <input type="submit" name="submit" value="reset"/>
    </div>
    <input type="image" name="img" src="[img]" width="640" height="320"/>
    <img src="[legend]"/>
  </form>
</body>
</html>
 
SCALEBAR  †
| ALIGN [align] | left, center, right | 
| BACKGROUNDCOLOR [r] [g] [b] | スケールバーの背景色 | 
| COLOR [r] [g] [b] | スケールバーの前景色 | 
| LABEL | ラベル | 
| STATUS [flag] | on, off, embedded。on は、スケールバーの画像を生成する。embedded は、地図画像の上に重ね合わせる | 
| STYLE [style] | 0, 1 | 
| TRANSPARENT [flag] | on, off。描画していないところを透過色にする | 
| UNIT | feet, inches, kilometers, meters, miles,nauticalmiles。デフォルトは mile | 
- STATUS on 
 の場合には、テンプレート HTML に、<img src="[scalebar]" border="0"/> で、一時領域に出力した画像を参照する。
LEGEND  †
| KEYSIZE [x] [y] | シンボルを囲む矩形の大きさ。デフォルト 20,10 | 
| KEYSPACING [x] [y] | シンボルと名称の間隔。デフォルト 5,5 | 
| OUTLINECOLOR [r] [g] [b] | 凡例の枠の色 | 
| IMAGECOLOR [r] [g] [b] | 凡例の背景色 | 
| LABEL | ラベル | 
| STATUS [flag] | on, off, embedded。on は、スケールバーの画像を生成する。embedded は、地図画像の上に重ね合わせる | 
レイヤコントロール、IMPORT  †
- https://hondou.homedns.org/cgi-bin/mapserver?map=/opt/maps/map06.map
- Natural Earth で、データを仕入れて追加した。モスクワの周りの交通網が美しいな
- LAYER の STATUS 属性で、レイヤの描画を切り替える
- DEFAULT : 無条件で表示
- ON/OFF : GET パラメータの layer に、レイヤ名がある場合表示される。ない場合には表示されない。
 
- レイヤ描画の ON/OFF は、[レイヤ名_check] で参照できる
- template06.html
<!-- MapServer Template -->
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8"/>
  <title>Map Example</title>
  <script type="text/javascript">
function doSubmit() {
  document.mapserv.submit();
}
  </script>
</head>
<body>
  <form name="mapserv" method="GET" action="/cgi-bin/mapserver">
    <input type="hidden" name="map" value="[map]"/>
    <input type="hidden" name="imgext" value="[mapext]"/>
    <div>
      <select name="mode">
        <option value="browse">browser</option>
        <option value="map">map</option>
      </select>
      <select name="zoom">
        <option value="4" [zoom_4_select]>x4</option>
        <option value="3" [zoom_3_select]>x3</option>
        <option value="2" [zoom_2_select]>x2</option>
        <option value="1" [zoom_1_select]>x1</option>
        <option value="-2" [zoom_-2_select]>x-2</option>
        <option value="-3" [zoom_-3_select]>x-3</option>
        <option value="-4" [zoom_-4_select]>x-4</option>
      </select>
      [scaledenom]
      <input type="submit" value="reset"/>
    </div>
    <input type="image" name="img" src="[img]" width="640" height="320"/>
    <img src="[legend]"/>
    <div>
      <input type="checkbox" name="layer" value="cities" [cities_check] onclick="doSubmit()"/>都市 
      <input type="checkbox" name="layer" value="rivers" [rivers_check] onclick="doSubmit()"/>河川 
      <input type="checkbox" name="layer" value="lakes"  [lakes_check]  onclick="doSubmit()"/>湖沼 
      <input type="checkbox" name="layer" value="roads"  [roads_check]  onclick="doSubmit()"/>道路 
      <input type="checkbox" name="layer" value="rails"  [rails_check]  onclick="doSubmit()"/>鉄道 
    </div>
  </form>
</body>
</html>
 
- map06.map
MAP
  IMAGETYPE PNG
  EXTENT -180 -90 180 90 # <Lower Left X> <Lower Left Y> <Upper Right X> <Upper Right Y>
  SIZE   640 320
  IMAGECOLOR 128 128 192
  FONTSET "/opt/maps/fonts.list"
  UNITS dd
  # WEB
  WEB
    TEMPLATE "/opt/maps/template06.html"
    IMAGEPATH "/var/www/html/tmp/"
    IMAGEURL "/tmp/"
    MINSCALEDENOM 200
    MAXSCALEDENOM 177732952
  END
  # SCALE BAR
  SCALEBAR
    UNITS kilometers
    BACKGROUNDCOLOR 255 128 128
    COLOR 0 0 0
    TRANSPARENT on
    STYLE 0
    STATUS embed
    LABEL
      COLOR 0 0 0
      SIZE tiny
    END # End of LABEL
  END # End of SCALEBAR
  
  LEGEND
    KEYSIZE 40 20
    KEYSPACING 10 10 
    OUTLINECOLOR 0 0 0
    IMAGECOLOR 255 255 255
    STATUS ON
    LABEL
      TYPE TRUETYPE
      FONT ipa_gothic
      COLOR 0 0 0
      SIZE 12
      POSITION CL
      PARTIALS FALSE
      BUFFER 3
    END # End of LABEL
  END # End of LEGEND
  INCLUDE "map06_countries.map"
  INCLUDE "map06_lakes.map"
  INCLUDE "map06_rivers.map"
  INCLUDE "map06_cities.map"
  INCLUDE "map06_roads.map"
  INCLUDE "map06_rails.map"
END # End of Map
 
- map06_countries.map
LAYER
  NAME countries
  STATUS DEFAULT
  TYPE POLYGON
  CONNECTIONTYPE POSTGIS
  CONNECTION "host=localhost port=5432 dbname=demo user=postgres password=postgres"
  PROCESSING "CLOSE_CONNECTION=DEFER" # DB CONNECTION POOL
  DATA "geom from countries_table" # SQL SELECT Statement
  CLASS
    NAME "陸地"
    STYLE
      COLOR 255 255 255
      ANTIALIAS true
    END # End of STYLE
  END # End of CLASS
END # End of LAYER
 
- map06_lakes.map
LAYER 
  NAME lakes
  STATUS ON
  TYPE POLYGON
  CONNECTIONTYPE POSTGIS
  CONNECTION "host=localhost port=5432 dbname=demo user=postgres password=postgres"
  PROCESSING "CLOSE_CONNECTION=DEFER" # DB CONNECTION POOL
  DATA "geom from lakes_table" # SQL SELECT Statement
  CLASS
    NAME "湖沼"
    STYLE
      COLOR 128 128 255
      # ANTIALIAS true
    END # End of STYLE
  END # End of CLASS
END # End of LAYER
 
- map06_rivers.map
LAYER 
  NAME rivers
  STATUS ON
  TYPE LINE
  CONNECTIONTYPE POSTGIS
  CONNECTION "host=localhost port=5432 dbname=demo user=postgres password=postgres"
  PROCESSING "CLOSE_CONNECTION=DEFER" # DB CONNECTION POOL
  DATA "geom from rivers_table" # SQL SELECT Statement
  LABELITEM "name"
  CLASS
    NAME "河川"
    EXPRESSION ([scalerank] < 5)
    STYLE
      WIDTH 1
      ANTIALIAS TRUE
      COLOR 128 128 255
      OUTLINECOLOR 0 0 0
    END # End of STYLE
  END # End of CLASS
END # End of LAYER
 
- map06_cities.map
SYMBOL
  NAME "circle"
  TYPE ellipse
  FILLED true
  POINTS
    3 3
  END # End of POINTS
END # End of SYMBOL
LAYER    
  NAME cities
  STATUS ON
  TYPE POINT
  CONNECTIONTYPE POSTGIS
  CONNECTION "host=localhost port=5432 dbname=demo user=postgres password=postgres"
  PROCESSING "CLOSE_CONNECTION=DEFER" # DB CONNECTION POOL
  DATA "geom from city_table" # SQL SELECT Statement
  LABELITEM "name"
  CLASS
    NAME "主要都市"
    EXPRESSION ([scalerank] < 1)
    STYLE
      SYMBOL "circle"
      COLOR 255 102 0
    END # End of STYLE
    LABEL
      TYPE TRUETYPE
      FONT ipa_gothic
      SIZE 10
      COLOR 0 0 0
      OUTLINECOLOR 255 255 255
      SHADOWCOLOR 255 0 0
      SHADOWSIZE 1 1
      FORCE true
      POSITION auto
    END # End of LABEL
  END # End of CLASS
  CLASS
    NAME "大都市"
    EXPRESSION ([scalerank] < 3)
    MAXSCALE 40000000
    STYLE
      SYMBOL "circle"
      COLOR 255 64 64
    END # End of STYLE
    LABEL
      TYPE TRUETYPE
      FONT ipa_gothic
      SIZE 10
      COLOR 0 0 0
      OUTLINECOLOR 255 255 255
      SHADOWCOLOR 255 0 0
      SHADOWSIZE 1 1
      FORCE true
      POSITION auto
    END # End of LABEL
  END # End of CLASS 
  CLASS
    NAME "人工密集地帯"
    STYLE
      SYMBOL "circle"
      COLOR 255 255 128
    END # End of STYLE
  END # End of CLASS
END # End of LAYER
 
- map06_roads.map
LAYER
  NAME roads
  STATUS ON
  TYPE LINE
  CONNECTIONTYPE POSTGIS
  CONNECTION "host=localhost port=5432 dbname=demo user=postgres password=postgres"
  PROCESSING "CLOSE_CONNECTION=DEFER" # DB CONNECTION POOL
  DATA "geom from roads_table" # SQL SELECT Statement
  CLASS
    NAME "道路"
    EXPRESSION ([scalerank] < 5)
    STYLE
      WIDTH 1
      ANTIALIAS TRUE
      COLOR 255 128 128
      OUTLINECOLOR 0 0 0
    END # End of STYLE
  END # End of CLASS
END # End of LAYER
 
- map06_rails.map
LAYER
  NAME rails
  STATUS ON
  TYPE LINE
  CONNECTIONTYPE POSTGIS
  CONNECTION "host=localhost port=5432 dbname=demo user=postgres password=postgres"
  PROCESSING "CLOSE_CONNECTION=DEFER" # DB CONNECTION POOL
  DATA "geom from railroads_table" # SQL SELECT Statement
  CLASS
    NAME "鉄道"
    EXPRESSION ([scalerank] < 6)
    STYLE
      WIDTH 1
      ANTIALIAS TRUE
      COLOR 0 255 0
      OUTLINECOLOR 0 0 0
    END # End of STYLE
  END # End of CLASS
END # End of LAYER
 
地図情報を WMS (Web Map Service) として公開する  †
- https://hondou.homedns.org/cgi-bin/mapserver?map=/opt/maps/map07.map&SERVICE=wms&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image/png&SRS=EPSG:4326&LAYERS=countries,lakes,rivers,cities,roads,rails&BBOX=125,30,150,50&WIDTH=550&HEIGHT=450
- http://mapserver.org/ogc/wms_server.html
- map file の WEB に METADATA 要素を追加する。Projection や URL を設定する
- map file の ROOT に PROJECTION が必要
- LAYER にも METADATA 要素を追加する。WMS として公開するレイヤの名称を設定する。
 
- map07.map
MAP
  IMAGETYPE PNG
  EXTENT -180 -90 180 90 # <Lower Left X> <Lower Left Y> <Upper Right X> <Upper Right Y>
  SIZE   640 320
  IMAGECOLOR 128 128 192
  FONTSET "/opt/maps/fonts.list"
  UNITS dd
  PROJECTION
    "init=epsg:4326"
  END
  # WEB
  WEB
    TEMPLATE "/opt/maps/template06.html"
    IMAGEPATH "/var/www/html/tmp/"
    IMAGEURL "/tmp/"
    MINSCALEDENOM 200
    MAXSCALEDENOM 177732952
    METADATA
      "wms_title"          "MapServer Tutorial"
      "wms_onlineresource" "http://app.example.com/cgi-bin/mapserver?map=/opt/maps/map07.map"
      "wms_srs"            "EPSG:4326"
      "wms_abstract"       "Cities are joint point of rivers and road and railroads"
      "wms_enable_request" "*"
    END # End of METADATA
  END # End of WEB
  INCLUDE "map07_countries.map"
  INCLUDE "map07_lakes.map"
  INCLUDE "map07_rivers.map"
  INCLUDE "map07_cities.map"
  INCLUDE "map07_roads.map"
  INCLUDE "map07_rails.map"
END # End of Map
 
- map07_countries.map
LAYER
  NAME countries
  METADATA
    "wms_title" "countries"
  END
  STATUS DEFAULT
  TYPE POLYGON
  CONNECTIONTYPE POSTGIS
  CONNECTION "host=localhost port=5432 dbname=demo user=postgres password=postgres"
  PROCESSING "CLOSE_CONNECTION=DEFER" # DB CONNECTION POOL
  DATA "geom from countries_table" # SQL SELECT Statement
  CLASS
    NAME "陸地"
    STYLE
      COLOR 255 255 255
      ANTIALIAS true
    END # End of STYLE
  END # End of CLASS
END # End of LAYER
 (他も LAYER にも同様に METADATA を追加する)
- WMS のメタ情報を取得 (きちんと設定できているか確認)
$ curl "http://app.example.com/cgi-bin/mapserver?map=/opt/maps/map07.map&SERVICE=wms&VERSION=1.1.1&REQUEST=GetCapabilities"
<?xml version='1.0' encoding="ISO-8859-1" standalone="no" ?>
<!DOCTYPE WMT_MS_Capabilities SYSTEM "http://schemas.opengis.net/wms/1.1.1/WMS_MS_Capabilities.dtd"
 [
 <!ELEMENT VendorSpecificCapabilities EMPTY>
 ]>  <!-- end of DOCTYPE declaration -->
<WMT_MS_Capabilities version="1.1.1">
<!-- MapServer version 6.0.3 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=CAIRO 
SUPPORTS=FREETYPE SUPPORTS=ICONV SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER
SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER SUPPORTS=FASTCGI SUPPORTS=THREADS SUPPORTS=GEOS
INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE -->
<Service>
  <Name>OGC:WMS</Name>
  <Title>MapServer Tutorial</Title>
  <Abstract>Cities are joint point of rivers and road and railroads</Abstract> 
- WMSを読み出す
http://app.example.com/cgi-bin/mapserver?map=/opt/maps/map07.map&SERVICE=wms&VERSION=1.1.1&REQUEST=GetMap
&FORMAT=image/png&SRS=EPSG:4326&LAYERS=countries,lakes,rivers,cities,roads,rails
&BBOX=125,30,150,50&WIDTH=550&HEIGHT=450 
Open Layers から WMS を使う  †
- OpenLayers? の配置
- http://app.example.com/openlayers.html
すげーな。書いたコードはこんだけ
- openlayers.html
<!DOCTYPE html>
<html lang="ja">
  <meta charset="UTF-8"/>
  <title>Openlayers Example</title>
  <style type="text/css">
    #map {
      width  : 800px;
      height : 500px;
      border : 1px solid black;
    }
  </style>
  <body>
    <div id="map"></div>
  </body>
  <script src="OpenLayers.js"></script>
  <script type="text/javascript">
    var lon = 140.0;
    var lat = 35.0;
    var zoom = 5;
    var map = new OpenLayers.Map('map');
    var localWMS = new OpenLayers.Layer.WMS(
      "Local WMS layers",
      "http://app.example.com/cgi-bin/mapserver?map=/opt/maps/map07.map",
      {layers: ['countries','lakes','rivers','cities','roads','rails'], transparent: false},
      {isBaseLayer: true}
    );
    map.addLayer(localWMS);
    map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
    map.addControl(new OpenLayers.Control.LayerSwitcher());
  </script>
</html>
 
Map Cache  †
インストール  †
- Scientific Linux 6.4 の場合 (EPEL は設定済みとする)
- ライブラリの取得
$ sudo yum -y install httpd-devel libpng-devel libjpeg-devel libcurl-devel
$ sudo yum -y install pcre-devel pixman-devel
$ sudo yum -y install fcgi-devel gdal-devel geos-devel sqlite-devel libtiff-devel libgeotiff-devel db4-devel
$ sudo yum -y install git cmake make gcc gcc-c++
$ sudo yum -y install memcached libmemcached libmemcached-devel 
- ビルド
$ git clone git://github.com/mapserver/mapcache.git
$ cd mapcache
$ mkdir build
$ cd build
$ cmake .. -DWITH_MEMCACHE=1 -DWITH_OGR=0
-- * Configured options for the mapcache library
--  * Mandatory components
--   * png: /usr/lib64/libpng.so
--   * jpeg: /usr/lib64/libjpeg.so
--   * Curl: /usr/lib64/libcurl.so
--   * Apr: /usr/lib64/libapr-1.so
--  * Optional components
--   * PIXMAN: /usr/lib64/libpixman-1.so
--   * SQLITE: /usr/lib64/libsqlite3.so
--   * Berkeley DB: disabled
--   * Memcache: /usr/lib64/libaprutil-1.so
--   * TIFF: disabled
--   * GeoTIFF: disabled
--   * Experimental TIFF write support: disabled
--   * PCRE: disabled
--   * Experimental mapserver support: disabled
-- * Seeder Configuration Options:
--   * GEOS: /usr/lib64/libgeos_c.so
--   * OGR: disabled
-- * CGI Configuration Options:
--   * FastCGI: /usr/lib64/libfcgi.so
-- * Apache Module support status:
--   * Mapcache Version String: mod_mapcache/1.3dev
--   * Module will be installed to : /usr/lib64/httpd/modules
-- Configuring done
-- Generating done
-- Build files have been written to: /home/kagyuu/mapcache/build
$ make
$ sudo make install
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/lib/libmapcache.so
-- Installing: /usr/local/bin/mapcache_seed
-- Removed runtime path from "/usr/local/bin/mapcache_seed"
-- Installing: /usr/local/bin/mapcache.fcgi
-- Removed runtime path from "/usr/local/bin/mapcache.fcgi"
-- Installing: /usr/lib64/httpd/modules/mod_mapcache.so
-- Removed runtime path from "/usr/lib64/httpd/modules/mod_mapcache.so" 
- 最後に ldconfig で、/usr/local/lib/libmapcache.so をシステムに認識させる
 Redhat 系では /usr/local/lib が、共有ライブラリのディレクトリになっていないので追加する。local.conf を追記する$ cat /etc/ld.so.conf.d/local.conf 
/usr/local/lib 共有ライブラリとして認識させる$ sudo ldconfig
$ ldconfig -v | grep mapcache
	libmapcache.so -> libmapcache.so
$ ldd /etc/httpd/modules/mod_mapcache.so 
	linux-vdso.so.1 =>  (0x00007fff6bd58000)
	libmapcache.so => /usr/local/lib/libmapcache.so (0x00007f096ae59000)
	libpng12.so.0 => /usr/lib64/libpng12.so.0 (0x00007f096ac33000)
       ...
Apache への組み込み  †
- /etc/httpd/conf/httpd.conf にモジュールを追加
LoadModule mapcache_module modules/mod_mapcache.so 
- /etc/httpd/conf.d/mapcache.conf を作成
- Apache2.2
<IfModule mapcache_module>
  <Directory /opt/mapcache>
    Order Allow,Deny
    Order allow,deny
    Allow from all
   </Directory>
   MapCacheAlias /mapcache "/opt/mapcache/mapcache.xml"
</IfModule>
- Apache2.4
<IfModule mapcache_module>
  <Directory /opt/mapcache>
    Require all granted
   </Directory>
   MapCacheAlias /mapcache "/opt/mapcache/mapcache.xml"
</IfModule>
- 2.4 で 2.2 の設定をすると「AH01630: client denied by server configuration」
 
- サンプル用のキャッシュ設定で動かす
$ sudo mkdir /opt/mapcache
$ sudo cp /home/kagyuu/mapcache/mapcache.xml /opt/mapcache/
$ sudo chown -R apache:apache /opt/mapcache/
$ sudo chmod -R 755 /opt/mapcache/ mapcache.xml は、github から clone してきたもの
- 再起動してインストールを確認
$ sudo /sbin/service httpd restart http://app.example.com/mapcache/demo
mapcache.xml について  †



- [grid] には、キャッシュするタイルの設定を行う
- 組み込み設定 WGS84, g, GoogleMapCompatible? が用意されている
- ちゃんと調べてきちんと設定しないと動かないので、あるもの(奇特な専門家が公開してくれているもの)を使ったほうが良さそう
- [units] : m = meters / dd = decimal degree / ft = feet
- [resolutions] : zoom レベルに対応する縮尺。これ調べるの大変
 
- [source]-[http]-[url] には、パラメータ名無しの URL を指定する。
- GET パラメータは、[source]-[getmap] に記述する。GET パラメータは大文字小文字関係有り
- [getmap] には、デフォルトで <REQUEST>GetMap?<REQUEST><SERVICE>WMS</SERVICE><STYLE></STYLE><VERSION>1.1.0</VERSION> が設定されている
 
- [format] には PNG, JPEG, MIXED が使える
- <format name="mypng" type="PNG"><compression>fast|best</compression><colors> 2 to 256</colors></format>
- <format name="myjpg" type="JPEG"><quality>0 to 100</quality><photometric>ycbcr|rgb</photometric></format>
- <format name="mymix" type="MIXED"><transparent>mypng</transparent><opaque>JPEG</opaque></format>
 
- [tileset] には、キャッシュするタイルの設定を行う
- [dimensions] はオプション。よくわからないので要らないかな
 
- [service] には、mapcache がクライアントからどう見えるか
- [full_wms] : error = 一律404Error (default) / assemble = キャッシュ / forward
- [resample_mode] : nearest = fast but poor quality / bilinear = slow but good quality
 
- [errors] : log = 500エラー / report = エラーメッセージ / empty_img = 空の画像 / report_img = エラー画像。実運用では empty_img がお勧めだそうだ。mapcache でエラーが起きても、クライアント側は、なんとなくそれなりに動く。
自分の WMS に接続する  †
- めちゃめちゃ速いですやん !!!
- はまるところ、
- /opt/mapcache/mapcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<mapcache>
   <cache name="disk" type="disk">
      <base>/tmp</base>
      <symlink_blank/>
   </cache>
   <source name="vmap0" type="wms">
      <getmap>
         <params>
           <MAP>/opt/maps/map07.map</MAP>
           <LAYERS>countries,rivers,lakes,roads,rails,cities</LAYERS>
         </params>
      </getmap>
      
      <http>
         <url>http://app.example.com/cgi-bin/mapserver</url>
         <headers>
           <User-Agent>mod_mapcache</User-Agent>
         </headers>
      </http>
   </source>
   
   <tileset name="test">
      <source>vmap0</source>
      <cache>disk</cache>
      <grid>WGS84</grid>
      <format>PNG</format>
      <metatile>5 5</metatile>
      <metabuffer>10</metabuffer>
      <expires>3600</expires>
   </tileset>
   <default_format>PNG</default_format>
   <service type="wms" enabled="true">
      <full_wms>assemble</full_wms>
      <resample_mode>bilinear</resample_mode>
      <format>PNG</format>
      <maxsize>4096</maxsize>
   </service>
   <service type="wmts" enabled="true"/>
   <service type="tms" enabled="true"/>
   <service type="kml" enabled="true"/>
   <service type="gmaps" enabled="true"/>
   <service type="ve" enabled="true"/>
   <service type="mapguide" enabled="true"/>
   <service type="demo" enabled="true"/>
   <errors>report</errors>
   <lock_dir>/tmp</lock_dir>
   <log_level>debug</log_level>
</mapcache>
 
- /var/www/html/openlayers2.html
<!DOCTYPE html>
<html lang="ja">
  <meta charset="UTF-8"/>
  <title>Openlayers Example</title>
  <style type="text/css">
    #map {
      width  : 800px;
      height : 500px;
      border : 1px solid black;
    }
  </style>
  <body>
    <div id="map"></div>
  </body>
  <script src="OpenLayers.js"></script>
  <script type="text/javascript">
    var lon = 140.0;
    var lat = 35.0;
    var zoom = 5;
    var map = new OpenLayers.Map('map',{
      displayProjection: new OpenLayers.Projection("EPSG:4326")
    });
    var localWMS = new OpenLayers.Layer.WMS(
      "Local WMS layers",
      "http://app.example.com/mapcache/?",
      {layers: 'test'},
      {isBaseLayer: true,
       units:"dd", 
       maxExtent: new OpenLayers.Bounds(-180,-90,180,90),
       projection: new OpenLayers.Projection("EPSG:4326")
      }
    );
    map.addLayer(localWMS);
    map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
    map.addControl(new OpenLayers.Control.LayerSwitcher());
  </script>
</html>
 → Openlayers3 の対応 GIS Mapserver EPSG3857対応
memcached  †
他の WMS を参照する  †
- 2013 年末現在、まともな公開WMSは、Open Street Map くらい
- NASA JPL の衛星写真も 2010 年ころに WMS サービスを終了していたらしい
[~]$ curl "http://wms.jpl.nasa.gov/wms.cgi?REQUEST=GetMap&LAYERS=us_landsat7&STYLES=&FROMAT=png&TRANSPARENT=true"
<?xml version='1.0' encoding="UTF-8" standalone="no" ?>
<!DOCTYPE ServiceExceptionReport SYSTEM "http://wms.jpl.nasa.gov/exception_1_1_1.dtd ">
<ServiceExceptionReport version="1.1.1">
<ServiceException>
This server no longer provides full WMS services!
</ServiceException>
</ServiceExceptionReport> ぐぬぬ
- クライアント側(OpenLayers?)で合成するかな
- 試せていないけど、mapfile はこんなかんじにするらしい
MAP
  IMAGETYPE PNG
  EXTENT -180 -90 180 90 # <Lower Left X> <Lower Left Y> <Upper Right X> <Upper Right Y>
  SIZE   640 320
  IMAGECOLOR 128 128 192
  FONTSET "/opt/maps/fonts.list"
  UNITS dd
  PROJECTION
    "init=epsg:4326"
  END
 
  LAYER
    NAME "landsat"
    TYPE RASTER
    OFFSITE 0 0 0
    STATUS DEFAULT
    CONNECTION "http://wms.jpl.nasa.gov/wms.cgi?REQUEST=GetMap&LAYERS=us_landsat7&STYLES=&FROMAT=png&TRANSPARENT=true"
    CONNECTIONTYPE WMS
    METADATA
      "wms_title"          "LandSat"
      "wms_srs"            "epsg:4326"
      "wms_name"           "us_landsat7"
      "wms_server_version" "1.1.1"
      "wms_format"         "image/png"
    END # End of Metadata
    PROJECTION
      "init=epsg:4326"
    END
  END # End of Layer
END # End of Map
 
サンプルアプリ  †
GIS