#contents
 *インストール (Scientific Linux 6.4) [#u8cd9330]
 +[[PostGIS のインストール>GIS PostGIS#e4cc5be9]] を参考に 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 から呼び出す [#s575fb34]
 +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 だった。&br;
 Symbolic link と CGI の実行を許可する
 #code(plain){{{
  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 を呼んでみる
 #ref(apache01.png)
 #br
 mapfile がないというエラーが ''正しく'' 表示された
 +mapserver (httpd) が、socket 通信をするのを許可する
 --GUIで設定
  # yum -y install policycoreutils*
  # /usr/bin/system-config-selinux
 httpd_can_network_connect を on にする
 #ref(apache02.png)
 #br
 --CUIの場合
  # /usr/sbin/setsebool httpd_can_network_connect true
 でうまくいくか試してみる。このフラグはリブートすると元に戻る。&br;
 これでうまくいくようなら永続化する
  # /usr/sbin/setsebool -P httpd_can_network_connect true
 しばらく処理が終わらないけどビビらないように
 --今どき SELinux を無効化するという選択肢はありえない
 *Postgis に格納されている地理空間情報を画像化する [#gf5a5b7b]
 -Postgis については → [[GIS PostGIS]]
 -/opt/maps/map01.map を作成する。posgtis のパスワードなどが書かれているので、ブラウザから見られない場所に置く。
 -https://hondou.homedns.org/cgi-bin/mapserver?map=/opt/maps/map01.map&layer=all&mode=map
 #ref(apache03.png)
 #br
 #code(python){{{
 MAP
   IMAGETYPE PNG
   EXTENT -180.00 -90.00 180.00 90.00 # <Lower Left X> <Lower Left Y> <Upper Right X> <Upper Right Y>
   SIZE   640 320
   IMAGECOLOR 128 128 192
 
   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
     CLASS
       STYLE
         COLOR 255 255 255
         ANTIALIAS true
       END # End of STYLE
     END # End of CLASS
   END # End of LAYER
 END # End of MAP
 }}}
 **mapfile [#n848d5cf]
 -データの格納場所と描画方法を定義するファイル
 -ALGOL みたいな構造
 -大文字、小文字は区別しない。コメントは # 以降。設定パラメータは "" で囲む((全ての設定パラメータを""で囲むことを推奨))
 -制限 (変更するためには再コンパイルが必要)
 --MAXCLASSES 250
 --MAXSTYLES 5
 --MAXSYMBOLS 64
 -MAP ::= <LAYER>*
 -LAYER ::= <CLASS>*
 -CLASS ::= <STYLE>*
 **MAP [#oa819985]
 |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|投影法|
 -mapfile のルート要素
 **PROJECTION [#q8ac2e39]
  PROJECTION
    "init=epsg:4326"
  END
 どのレイヤも同じ投影法なら設定不要。&color(red){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 [#ida24083]
 |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句について>#where]]|
 |OFFSITE [r] [g] [b]|透過色|
 |TRANSPARENCY [0~100]|レイヤの透過度|
 |CLASS|クラス|
 |TEMPLATE [file]|CLASS TEMPLATE|
 |PROJECTION|投影法|
 **CLASS [#sea26f0e]
 |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 [#u54a95c6]
 |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画像ファイル|
 *&aname(where){where句について}; [#a65a8223]
 -http://mapserver.org/mapfile/layer.html
 -Mapserver 6 までは、LAYER 節内の ''FILTER'' で指定していた
 #code(bash){{{
   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=..."''
 #code(bash){{{
   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 からの絞込になる
 --Mapserver 7 でも FILTER を指定できるが、SQL 文の Result Set からの絞込になる
  FILTER ("[type]"='road' and [size]<2)
 -where 句の中のパラメータを GET パラメータから取得することもできる → [[GIS Mapserver GETパラメータ]]
 *Postgis に格納されているPOINTを別レイヤに表示する [#dd4ddf8e]
 -Natural Earth から、人口密集地帯のデータをダウンロードして、postgis に登録する
 -POINT の描画
 --POLYGON の描画では、COLOR を指定することにより形を描画した
 --POINT の場合は、指定された地点に SYMBOL で定義された図形を表示する
 -人口ランクによって、描画 CLASS を分ける。CLASS EXPRESSION を使う
 -https://hondou.homedns.org/cgi-bin/mapserver?map=/opt/maps/map02.map&layer=all&mode=map
 #ref(apache04.png)
 #br
 #code(python){{{
 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
 
   # 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
     CLASS
       EXPRESSION ([scalerank] < 3)
       STYLE
         SYMBOL "circle"
         COLOR 255 102 0
       END # End of STYLE
     END # End of CLASS
     CLASS
       EXPRESSION ([scalerank] < 6)
       STYLE
         SYMBOL "circle"
         COLOR 255 204 0
       END # End of STYLE
     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
 }}}
 **SYMBOL [#mee81d0d]
 -Cartographical Symbol Construction with MapServer, http://mapserver.org/mapfile/symbology/construction.html
 -簡単な図形なら定義できるみたい
 -まぁ、円・正方形くらいなら SYMBOL で作ったらいいけど、もうちょっと複雑なのにしたければ PNG 画像を使ったほうがいいかな
 *ラベル [#tb969b1e]
 -city_table の name 列の内容を表示する
 --ラベルとして表示するデータは、ひとつのレイヤに一種類。 [LAYER]-[LABELITEM] に列名 ("name") を指定する。
 --指定したラベルを [LAYER]-[CLASS]-[LABEL] で描画する。こちらは複数指定できるので、条件( EXPRESSION )によって色やフォントを変えることができる
 -[MAP]-[FONTSET] に、fonts.list を指定する。
 --fonts.list には、利用するフォントの一覧を記載する。
 --/opt/maps/fonts.list 
  ipa_gothic      /usr/share/fonts/ipa-gothic/ipag.ttf
 -https://hondou.homedns.org/cgi-bin/mapserver?map=/opt/maps/map03.map&layer=all&mode=map
 #ref(apache05.png)
 #br
 #code(python){{{
 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"
 
   # 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)
       STYLE
         SYMBOL "circle"
         COLOR 255 102 0
       END # End of STYLE
     END # End of CLASS
     CLASS
       EXPRESSION ([scalerank] < 6)
       STYLE
         SYMBOL "circle"
         COLOR 255 204 0
       END # End of STYLE
     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
 }}}
 **LABEL [#e1b8eed2]
 |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。&color(red){デフォルト false};|
 |POSITION [position]|ラベルの位置。ul (UPPER-LEFT), uc, ur, cl, cc, cr, ll, lc, lr, auto|
 |ENCODING [chaset]|エンコーディング (内部的に iconv を使っているので、エンコーディング名は iconv と同じ)|
 |WRAP [character]|改行文字|
 -&color(red){OUTLINECOLOR に COLOR の&wiki(補色);を使うのがミソ。};
 --普通、陸地と海は補色が使われる
 --そのため、陸地の上に置いてはっきり表示される色は、海の上に置くと判別しにくくなる
 ||陸(白)の上では|海(青)の上では|
 |文字色(黒)|判別しやすい|判別しにくい|
 --文字色の補色で文字の縁取りをしておけば、陸地と海の両方で判別しやすくなる
 ||陸(白)の上では|海(青)の上では|
 |文字色(黒)|判別しやすい|判別しにくい|
 |縁取り(白)|判別しにくい|判別しやすい|
 ||||
 |縁取り付きの文字|判別しやすい|判別しやすい|
 --Nさんに教せーてもらった。ありがとう
 *WEB [#ie4b86d4]
 -WEB で、HTML テンプレートに値を埋め込むことができる
 -表示する画像は、Apache から見える一時領域に出力する必要がある
  $ sudo mkdir /var/www/html/tmp
  $ sudo chown apache /var/www/html/tmp
  $ sudo chmod 755 /var/www/html/tmp
 -画像は定期的に削除する&br;
 /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
 #ref(apache06.png)
 #br
 #ref(apache07.png)
 --地図上をクリックすることで、拡大・縮小
 --縮尺 300 以下で、ランク 1 の都市名も表示している
 -/opt/map/map04.map
 #code(python){{{
 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
 #code(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 [#g46b9ab6]
 |TEMPLATE [path]       |テンプレートHTML|
 |IMAGEPATH [path]      |地図画像の仮置きディレクトリ|
 |IMAGEURL [url]        |IMAGEPATH の URL|
 |MINSCALEDENOM [double]|最小倍率|
 |MAXSCALEDENOM [double]|最大倍率|
 MINSCALEDENOM, MAXSCALEDENOM は、LAYER にも指定できる
 **テンプレートHTML [#a6a4f508]
 -<!-- MapServer Template --> は、mapserver の WEB テンプレート宣言。これがないと mapserver がテンプレートと認識しない。
 -mapserver は、テンプレート中の [key] を現在表示している地図の属性値に置き換える
 -大抵の場合、[key] は、mapserver の GET パラメータ名と同じ
 --http://mapserver.org/mapfile/template.html
 --http://mapserver.org/cgi/controls.html
 --地図の中心座標のパラメータ名が違う。GET パラメータは ''imgext''。テンプレートの key 名は [[mapext]]
 *凡例・縮尺 [#d06b2c99]
 -縮尺がおかしい。地球一周が約 300 m
 #ref(apache08.png)
 地図の縮尺を考慮する必要がある時には、MAP 直下に、UNIT を設定する
 |UNIT|feet, inches, kilometers, meters, miles,nauticalmiles。デフォルトは mile|
 -https://hondou.homedns.org/cgi-bin/mapserver?map=/opt/maps/map05.map
 #ref(apache09.png)
 #br
 #ref(apache10.png)
 -/opt/map/map05.map
 #code(python){{{
 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
 #code(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 [#l324080b]
 |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 &br;
 の場合には、テンプレート HTML に、<img src="[scalebar]" border="0"/> で、一時領域に出力した画像を参照する。
 **LEGEND [#we5c1cfa]
 |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 は、地図画像の上に重ね合わせる|
 -STATUS on &br;
 の場合には、テンプレート HTML に、<img src="[legend]" border="0"/> で、一時領域に出力した画像を参照する。
 -凡例の説明には CLASS の NAME が使われる。日本語の場合には
  LABEL
    ENCODING "UTF-8" 
  END
 などと、ENCODING を指定する。
 *レイヤコントロール、IMPORT [#me6f4b14]
 -https://hondou.homedns.org/cgi-bin/mapserver?map=/opt/maps/map06.map
 #ref(apache11.png)
 -Natural Earth で、データを仕入れて追加した。モスクワの周りの交通網が美しいな
 -LAYER の STATUS 属性で、レイヤの描画を切り替える
 --DEFAULT : 無条件で表示
 --ON/OFF : GET パラメータの layer に、レイヤ名がある場合表示される。ない場合には表示されない。
 -レイヤ描画の ON/OFF は、[レイヤ名_check] で参照できる
 -template06.html
 #code(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()"/>都市&nbsp;
       <input type="checkbox" name="layer" value="rivers" [rivers_check] onclick="doSubmit()"/>河川&nbsp;
       <input type="checkbox" name="layer" value="lakes"  [lakes_check]  onclick="doSubmit()"/>湖沼&nbsp;
       <input type="checkbox" name="layer" value="roads"  [roads_check]  onclick="doSubmit()"/>道路&nbsp;
       <input type="checkbox" name="layer" value="rails"  [rails_check]  onclick="doSubmit()"/>鉄道&nbsp;
     </div>
   </form>
 </body>
 </html>
 }}}
 -map06.map
 #code(python){{{
 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
 #code(python){{{
 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
 #code(python){{{
 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
 #code(python){{{
 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
 #code(python){{{
 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
 #code(python){{{
 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
 #code(python){{{
 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) として公開する [#med093b1]
 -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
 #ref(apache12.png)
 -http://mapserver.org/ogc/wms_server.html
 --map file の WEB に METADATA 要素を追加する。Projection や URL を設定する
 --map file の ROOT に PROJECTION が必要
 --LAYER にも METADATA 要素を追加する。WMS として公開するレイヤの名称を設定する。
 -map07.map
 #code(python){{{
 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
 #code(python){{{
 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
 --これは必須のパラメター
 --http://mapserver.org/ogc/wms_server.html#test-with-a-getmap-request
 *Open Layers から WMS を使う [#g294c0d5]
 -OpenLayers の配置
 --http://openlayers.org/
 --OpenLayers.js と img/ theme/ を Web サーバに配置する
  $ tar xvzf OpenLayers-2.13.1.tar.gz 
  $ cd OpenLayers-2.13.1
  $ sudo cp OpenLayers.js /var/www/html/
  $ sudo cp -Rv img/ /var/www/html
  $ sudo cp -Rv theme/ /var/www/html
 -http://app.example.com/openlayers.html
 #ref(apache13.png)
 すげーな。書いたコードはこんだけ
 -openlayers.html
 #code(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 [#i16a41d9]
 -http://www.mapserver.org/mapcache/install.html#apache-module-specific-instructions
 -さすがに OpenLayers をガンガン使うときに、毎回画像を作ると遅い
 -Map Cache は WMS のキャッシュとして働く。一度作った画像は最大 1 日間キャッシュにとっておいて、同じ画像が要求された場合にはキャッシュを返す
 -Map Cache は、Apache の module として動く。CGI として動かすことも可能
 -キャッシュの格納方法には、ファイル、SQLite、BDB、Memcached などを使える。今日日実サービスでは Memcached 一択かな。Amazon ElastiCache とか
 **インストール [#j882b6c1]
 +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"
 --OGR(GDAL) を無効化しないと、
  /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/libgdal.so: undefined reference to `PQresultStatus'
  /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/libgdal.so: undefined reference to `PQresultErrorMessage'
  /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/libgdal.so: undefined reference to `PQnfields'
  ...
 GDAL は、必須ではないからいいや
 --Memcached バインディングは、デフォルトでは無効なので有効化する
 +最後に ldconfig で、/usr/local/lib/libmapcache.so をシステムに認識させる&br;
 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 への組み込み [#s1df9930]
 +/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
 #ref(apache14.png)
 **mapcache.xml について [#q44f4be7]
 #graphviz{{{
 digraph {
 node [shape = box, fontname = "sans-serif", fontsize = 10];
 "<mapcache>" -> "<grid>";
 "<mapcache>" -> "<source>";
 "<mapcache>" -> "<cache> *1";
 "<mapcache>" -> "<cache> *2";
 "<mapcache>" -> "<format>";
 "<mapcache>" -> "<tileset>";
 "<mapcache>" -> "* Services *";
 "<mapcache>" -> "* Misc *";
 
 "name=\"myG\"" [shape = ellipse];
 "<grid>" -> "name=\"myG\"";
 "<grid>" -> "<size>256 256</size>";
 "<grid>" -> "<extent>-180 -90 180 90</extent>";
 "<grid>" -> "<srs>epsg:4326</srs>";
 "<grid>" -> "<srsalias>WGS84</srsalias>";
 "<grid>" -> "<units>m|dd|ft</units>";
 "<grid>" -> "<resolutions>999 999 999</resolutions>";
 "<grid>" -> "<metadata>";
 "<metadata>" -> "<title>";
 "<metadata>" -> "<WellKnownScaleSet>";
 
 "name=\"vmap0\"" [shape = ellipse];
 "type=\"wms\"" [shape = ellipse];
 "<source>" -> "name=\"vmap0\"";
 "<source>" -> "type=\"wms\"";
 "<source>" -> "<getmap>";
 "<getmap>" -> "<FORMAT>image/png</FORMAT>";
 "<getmap>" -> "<LAYERS>basic</LAYERS>";
 "<source>" -> "<http>";
 "<http>" -> "<url>http://vmap0.tiles.osgeo.org/wms/vmap0</url>";
 "<http>" -> "<headers>";
 "<http>" -> "<connection_timeout>30</connection_timeout>";
 
 "name=\"disk\"" [shape = ellipse];
 "type=\"disk\"" [shape = ellipse];
 
 "<cache> *1" -> "name=\"disk\"";
 "<cache> *1" -> "type=\"disk\"";
 "<cache> *1" -> "<base>/tmp</base>";
 "<cache> *1" -> "<symlink_blank/>";
 
 "name=\"memcache\"" [shape = ellipse];
 "type=\"memcache\"" [shape = ellipse];
 
 "<cache> *2" -> "name=\"memcache\"";
 "<cache> *2" -> "type=\"memcache\"";
 "<cache> *2" -> "<server>";
 "<server>" -> "<host>localhost</host>";
 "<server>" -> "<port>11211</port>";
 
 "name=\"PNGQ_FAST\"" [shape = ellipse];
 "type=\"PNG\"" [shape = ellipse];
 "<format>" -> "name=\"PNGQ_FAST\"";
 "<format>" -> "type=\"PNG\"";
 "<format>" -> "<compression>fast|best</compression>";
 "<format>" -> "<colors>2 to 256</colors>";
 
 "name=\"test\"" [shape = ellipse];
 "<tileset>" -> "name=\"test\"";
 "<tileset>" -> "<source>vmap0</source>";
 "<tileset>" -> "<cache>memcache</cache>";
 "<tileset>" -> "<grid>WGS84</grid>";
 "<tileset>" -> "<format>PNG</format>";
 "<tileset>" -> "<metatile>5 5</metatile>";
 "<tileset>" -> "<metabuffer>10</metabuffer>";
 "<tileset>" -> "<expires>3600</expires>";
 "<tileset>" -> "<auto_expire>86400</auto_expire>";
 "<tileset>" -> "<dimensions>";
 }
 }}}
 #graphviz{{{
 digraph {
 node [shape = box, fontname = "sans-serif", fontsize = 10];
 "* Services *" -> "<services type=\"wms\" enabled=\"true\">";
 "* Services *" -> "<services type=\"wmts\" enabled=\"true\"/>";
 "* Services *" -> "<services type=\"kml\" enabled=\"true\"/>";
 "* Services *" -> "<services type=\"gmaps\" enabled=\"true\"/>";
 "* Services *" -> "<services type=\"ve\" enabled=\"true\"/>";
 "* Services *" -> "<services type=\"demo\" enabled=\"true\"/>";
 
 "<services type=\"wms\" enabled=\"true\">" -> "<full_wms>error|assemble|forward</full_wms>";
 "<services type=\"wms\" enabled=\"true\">" -> "<resample_mode>nearest|bilinear</resample_mode>";
 "<services type=\"wms\" enabled=\"true\">" -> "<format>PNGQ_FAST</format>";
 }
 }}}
 #graphviz{{{
 digraph {
 node [shape = box, fontname = "sans-serif", fontsize = 10];
 "* Misc *" -> "<errors>log|report|empty_img|report_img</errors>";
 "* Misc *" -> "<lock_dir>/tmp</lockdir>";
 "* Misc *" -> "<lock_retry>10000</lock_retry>";
 "* Misc *" -> "<log_level>debug|info|notice|warn(default)|error|crit|alert|emerge</log_level>";
 }
 }}}
 -[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 に接続する [#qb81d757]
 -めちゃめちゃ速いですやん !!!
 -はまるところ、
 --mapcache.xml を変更したら apache を再起動
 --Apache 起動時に mapcache.xml の文法エラーが出る
 --Openlayers からの参照方法は http://app.example.com/mapcache/?LAYERS=test 。LAYERS には、mapserver の レイヤーではなく、mapcache の tileset 名を指定する。
 -/opt/mapcache/mapcache.xml 
 #code(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
 #code(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 [#s8a2fd3c]
 -memcahed を起動 [[SL64 memcached]]
 -mapcache.xml に memcache の設定をする
    <cache name="disk" type="disk">
       <base>/tmp</base>
       <symlink_blank/>
    </cache>
    <cache name="memcache" type="memcache">
      <server>
        <host>localhost</host>
        <port>11211</port>
      </server>
    </cache>
 -tileset.cache を disk から memcache に変更すれば OK
 -初回読み込み(キャッシュへの積み込み)は、disk のほうが若干速い。
 -キャッシュからの読み出しは memcached のほうが断然速い
 *%%他の WMS を参照する%% [#w7d4bba3]
 -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 はこんなかんじにするらしい
 #code(python){{{
 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
 }}}
 *サンプルアプリ [#fff1fd2f]
 -ソースコード
 --https://github.com/kagyuu/DockerExam/tree/master/ubuntu_mapserver
 -サイト
 --http://hondou.homedns.org/mapserver/
 ----
 [[GIS]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Short-URL:
ISBN10
ISBN13
9784061426061