AWSでtilemill

EC2インスタンス作成

http://aws.amazon.com/jp/aws-first-step/?utm_source=AWS&utm_medium=jpshortcut&utm_campaign=BA_jphomepage_awsfirststep&utm_content=banner_V01&00N500000026nJd=BA_jphomepage_awsfirststep&utm_content=banner_V01

とりあえず、タイル作成用のEC2インスタンスを作成

ubuntu12.10でマイクロを指定。(設定完了したら、ハイパフォーマンスに変更予定)
security groupには、22,20008,20009を追加

データ格納EBSの作成

EBSを20G作成して、アタッチする。作成時に/dev/sdfに指定しても/dev/xvdfになるので注意

フォーマット&マウント

sudo mkfs -t ext3 /dev/xvdf
sudo mkdir /ebs
sudo mount /dev/xvdf /ebs
emacsのインストール

emacs派なので。

sudo apt-get install emacs

tilemillのインストール

こちらを参考にubuntuにtilemillをインストール
http://mapbox.com/tilemill/docs/linux-install/

このコマンドを打つだけ。

sudo apt-get install python-software-properties
sudo add-apt-repository ppa:developmentseed/mapbox
sudo apt-get update
sudo apt-get install tilemill

tilemillの設定

こちらを参考に設定
http://mapbox.com/tilemill/docs/guides/ubuntu-service/

tilemillのUIはsshで接続したPCのみからブラウザで起動できるように。
また、タイルサーバーは公開するのでip(ドメイン)で指定。
mapboxファイルを/ebsに移動して/usr/share/mapboxにシンボリックリンクを張る。

tilemill.configを編集
sudo emacs /etc/tilemill/tilemill.config

{
  "files": "/usr/share/mapbox",
  "server": true,
  "listenHost":"0.0.0.0",
  "coreUrl":"localhost:20009",
  "tileUrl":"54.249.hoge.hoge:20008"
}

sudo mv /usr/share/mapbox /ebs
sudo ln -s /ebs/mapbox /usr/share/mapbox

chown -R mapbox:mapbox /usr/share/mapbox/
tilemill サーバーの起動
sudo start tilemill

projectデータの転送

あらかじめ作成しておいたtilemillのprojectファイルを/ebs/mapboxの中に転送しておく

AMIの作成

create AMIでtilemillをセットアップしたAMIを作成する

インスタンスタイプの変更

t3.microから作成したAMIでは、m3.2xlargeなどが指定できなかったので、AWSコンソールから
インスタンスをstopしてからインスタンスタイプを変更。これならm3.2xlargeを指定できる。
elastic ip で再指定して、データを格納したebsをattach

タイルの作成

cd /usr/share/tilemill/
sudo node index.js export vegetation /usr/share/mapbox/export/vegetation.mbtiles --format=mbtiles --bbox=122.9,20.4,154,45.6 --minzoom=1 --maxzoom=15 --metatile=2 --scale=1 --scheme=pyramid --log --files=/usr/share/mapbox/
タイルの確認

sqlite3 vegetation.mbtiles
>.tables
>select count(*) from map;
>10493721

sqlite3 vegetation_gird.mbtiles
> select count(*) from grid_data;

タイル作成にまつわるあれこれ

  • さくらVPSのメモリ1Gだと、utfgridを含めて書きだすとSIGKILLで途中で落ちた。
  • mac book air 4Gメモリだと、ところどころタイルができていない場所がある。
    • メモリの問題ではなく、ソースデータsqliteへの同時アクセスの問題なのかも?
    • ソースデータをpostgisにしてmax_connectionsの値を大きくするとどう?
    • utfgridだけで書き出すと?
  • mb-util vegetation.mbtiles vegetation でタイルに書き出そうとする場合、ext3の場合のinode数の制限に引っかかって途中でio errorに。inodeを大きくしてフォーマットしないといけない。
    • s3はinodeの制限が無いようなので、s3fs-cでec2にマウントして、mb-utilでタイルに書き出し。

サイズとスピード比較

m3.2xlarge

utfgridのみ png8:t=0:c=64:z=5 :[1h 31m 28s]:zoom 1-15 : size 2.4G (画像を1色にする) --> できていない部分あったので×
imageのみ png8:t=0:c=64:z=5 :[1h 38m 12s] :zoom=1-15:size 4.5G
utfgrid_image_postgis   png8:t=0:c=64:z=5 :[3h 47m 46s] :zoom=11-15:size 7.5G

image zoom=1-15をタイルに展開

4.5G --->おそいので途中でやめ2時間で0.5%ぐらい
全部で10493721タイル
海は103byte 2割
陸は2〜3KB? 8割
合計で7Gぐらいかな。

postgisのインストール

http://trac.osgeo.org/postgis/wiki/UsersWikiPostGIS20Ubuntu1210
sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable
sudo apt-get update
sudo apt-get install postgis

sudo -u postgres createdb template_postgis
sudo -u postgres psql -d template_postgis -c "CREATE EXTENSION postgis;"
sudo -u postgres psql -d template_postgis -c "CREATE EXTENSION postgis_topology;"

postgisのチューニング

http://workshops.opengeo.org/postgis-intro-jp/tuning.html
shared_buffersは3GBにしてみる。

sudo emacs /etc/postgresql/9.1/main/postgresql.conf

http://support.mapbox.com/discussions/tilemill/5301-tilemill-running-on-aws-error-message-sigkill
shmmaxが少ないとrestartでエラーになるので。
sudo sysctl -w kernel.shmmax=5368709120
sudo /etc/init.d/postgresql restart
sudo restart tilemill

 sudo sysctl -w vm.overcommit_memory=2

gdalのインストール

sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable
sudo apt-get update
sudo apt-get install gdal-bin

sqliteからpostgis

postGISにvegetationデータベースを作成してsqliteからコピー

sudo -u postgres createdb -T template_postgis vegetation
sudo -u postgres ogr2ogr -f PostgreSQL PG:dbname=vegetation vegetation.sqlite

postgisのユーザー設定&データ確認

sudo passwd postgres
sudo -u postgres psql
>alter user postgres with password 'postgres';
sudo -u postgres psql -l
sudo -u postgres vegetation
> \d vegetation
> select count(ogc_fid) from vegetation;
>3163106 ならOK

tilemillでのpostgis設定

host=localhost user=postgres password=postgres dbname=vegetation
ogc_fid
wkb_geometry

tilestreamのインストール

tilemillのtileサーバーは、画像もutfgridもTMS。tilejsonは未対応。OpenlayersのutfgrridはXYZなので困る。
tilestreamはXYZ配信で、tilejsonもサポートしている。

sudo apt-get install curl build-essential libssl-dev libsqlite3-0 libsqlite3-dev git-core
#sudo apt-add-repository ppa:chris-lea/node.js これはいまはだめ。nodejsとnodejs-devがconflict
sudo apt-get update
sudo apt-get install nodejs nodejs-dev npm
git clone git@github.com:mapbox/tilestream.git パーミッションでおこられてできないので https://でとってくる。
cd tilestream
npm install
sudo ./index.js --host 54.249.233.106 --tilePort=80 --uiPort=80 --tiles=/ebs/mapbox/export

git cloneできるようにするにはこちら。

https://help.github.com/articles/generating-ssh-keys
postgisのチューニング(結局)

postgresの値とkernel.shmmaxをこれに
http://wiki.openstreetmap.org/wiki/Mapnik/PostGIS
tilemillのcursor_sizeは指定しない。

      • >一応エラーなしで、データはできたみたい。

まだ、まだshmmax,shmall検討の余地あり。

sudo node index.js export vegetation_postgis /usr/share/mapbox/export/vegetation_postgis1-15.mbtiles --format=mbtiles --bbox=122.9,20.4,154,45.6 --minzoom=1 --maxzoom=15 --metatile=2 --scale=1 --scheme=pyramid --log --files=/usr/share/mapbox/

mb-util

本家のmbutilからforkしたものみたい。高機能。gridの出力には対応していない。
sudo apt-get install python-psycopg2
git clone git://github.com/Alpstein/mbutil.git
cd mbutil
./mb-util -h

sqliteでmbfilesを操作

海を消したい。今回の海(画像が水色1色)はtile_id==-2583691263
※ただし、琵琶湖などの真ん中も消えるので、そこはあとからフォロー。
tilesはviewなので、それを一旦dumpして、変更して戻す。
sqlite3 vegetation.mbtiles
>.output dump.txt
>.dump tiles
>.quit
dump.txtを編集

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE VIEW tiles AS
    SELECT
        map.zoom_level AS zoom_level,
        map.tile_column AS tile_column,
        map.tile_row AS tile_row,
        images.tile_data AS tile_data
    FROM map
    JOIN images ON map.tile_id !=-2583691263 AND images.tile_id = map.tile_id;
COMMIT;

dump.txtを読み込み
sqlite3 vegetation.mbtiles
>drop view tiles;
>.read dump.txt

おなじくgridデータ

sqlite3 vegetation_grid.mbtiles
>.output dum_grid.txt
>.dump grids
>.quit
dump_grid.txtを編集
map.tile_id >= 0 AND を加える
dump_grid.txtを読み込み
sqlite3 vegetation_grid.mbtiles
>drop view grids;
>.read dump_grid.txt

gridの展開

ebsをxfsフォーマットして、mout
そこに本家mb-utilのタイル出力部分をコメントアウトしてgridだけを出力できるように
jsonpできるように"grid()"が加わって出力されるようになっているので、そこを消す。
※gridディレクトリが存在しているとダメなので消しておく。
>mb-util vegetation_grid.mbtiles /ebs2/grid

ebsからs3へデータ以降

s3fs-cへ直接mb-utilでデータを転送すると、とても遅い上に、途中で切れるのでやめ。
ebsをxfsでフォーマットして(ファイル数の制限がない、動的inode)、s3syncで転送

sudo apt-get install xfsprogs
sudo mkfs.xfs /dev/xvdg
sudo mkdir /ebs2
sudo mount /dev/xvdg /ebs2
sudo /home/ubuntu/mbutil/mb-util --export --flip-y --progress --min-zoom=1 --max-zoom=15 vegetation.mbtiles /ebs2/
wget http://s3.amazonaws.com/ServEdge_pub/s3sync/s3sync.tar.gz
apt-get install ruby1.8
export AWS_ACCESS_KEY_ID='XXXXXXXXXXXXXXXXXXXX'
export AWS_SECRET_ACCESS_KEY='XXXXXXXXXXXXXXXXXXXXXXXXXXX'
export AWS_CALLING_FORMAT="SUBDOMAIN"
ruby s3sync.rb -r /ebs2/ vegetation-tiles:

上だとファイルにアクセスできないので×

ここのプログラムを利用
http://dqn.sakusakutto.jp/2011/11/amazon_s3_perl.html

sudo apt-get install libexpat1-dev
sudo cpan install YAML <--いらないかも?
sudo cpan install XML::Parser
sudo cpan Amazon::S3
sudo apt-get install libparallel-forkmanager-perl*
perl upload.pl /ebs2 s3://vegetation-tiles/ -p 10

publicにする方法がわからないから× -p 10だとメモリが足りなくなってしまう。microだから

s3cmdのパラレル対応

git clone https://github.com/pcorliss/s3cmd-modification.git
./s3cmd put -P --parallel --workers=10 --recursive /ebs2/ s3://v
egetation-tiles

macからだとsshの接続が切れるので、
http://d.hatena.ne.jp/oxon/20120310/1331386468

s3-parallel-put

結局、並列処理できてタイルをs3に高速に転送するのには以下を利用
https://github.com/twpayne/s3-parallel-put
mbutilで展開した場所/ebs2に移動して
/home/ubuntu/s3-parallel-put/s3-parallel-put --bucket=ecoris --grant=public-read --processes=5 . --prefix="vegetation" --content-type="guess" --log-filename=/home/ubuntu/log.txt

s3のCORS設定

http://memocra.blogspot.jp/2012/09/s3cors.html
gridsはCORSに引っかかるのでCORS configurationを設定。
制限したければ、AllowOriginにドメインを設定

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

client zoom で レベル16〜を表示

http://openlayers.org/dev/examples/clientzoom.html