#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()"/>都市
<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
#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]]