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