JA:Mapnik

From OpenStreetMap Wiki
Jump to: navigation, search
利用できる言語 — Mapnik
Mapnik
Mapnik-logo.png
ウェブサイト http://mapnik.org
版数 2.2.0 (2013-06-03)
ライセンス LGPL
動作環境 win ; macos ; linux

Mapnik は地図をJA:レンダリングするためのオープンソースのツールキットです。 特に、 OpenStreetMap のウェブサイトで5つの主要なスリッピーマップレイヤーをレンダリングするために使われています。様々な地理データ形式と、数多くの種類の地図をデザインできるよう柔軟なスタイルオプションに対応しています。

MapnikはC++で書かれており、高レベルでの、Pythonバインディングがあります。AGGライブラリを使うことで、アンチエイリアスによりサブピクセルまでの正確さで描画します。ESRI shapes、PostGIS、TIFFラスタイメージ、.osmファイル、任意のGDALまたはOGRがサポートするファイルを読むことができます。パッケージはほとんどのLinuxディストリビューション向けに用意され、バイナリは、Mac OS XWindows向けもあります。 Mapnikの使い方について、より詳細を知るには、The Mapink Wikiを見るか、#mapnik channel on freenodeに参加してください。

Mapnik と標準の OSM Mapnik スタイルは別のプロジェクトであることに注意してください。バグ報告または、OSM webサイト上のメインマップ向けの画面デザインについてのご意見は、Mapnik and the Standard OSM Mapnikまでお願いします。Mapnikソフトウェアについての問題報告、新しいアイデア、拡張については、主にGitHub上でお願いします。誰かが同じ問題について、すでに報告しているかどうかをチェックくださるようお願いします。

概要

標準OpenStreetMap Mapnik スタイルの例

Mapnikは、種々のグラフィックフォーマットで、地図イメージを出力できます。それらには、PNG、JPEG、SVGとPDFがあります。OpenStreetMapがMapnikを主に使うことは、JavaScript スリッピーマップインタフェース中で表示される、非常に数多くの 256*256ピクセル タイルのレンダリングの改善に繋がっています。

Mapnik スタイル

Mapnik allows for customization of all the cartographic aspect of a map - data features, icons, fonts, colors, patterns, and even certain effects such as pseudo-3d buildings and drop shadows. This is all controlled by defining datasources and style rules, most commonly in an XML language specific to Mapnik.

Mapnikは、すべての地図製作における観点においてカスタマイズが可能です。それらは、データ機能、アイコン、フォント、色、パターン、さらには疑似3D建造物表示やドロップシャドウのような特定の効果もあります。これは、データソースとスタイルルールを定義することによりすべて制御でき、通常はMapnik特有のXML言語で記述されます。

The Mapnik style rules used for the Standard OpenStreetMap are open-source and can be used as the basis for custom renderings of OSM data (see OSM Standard Mapnik Style below). Other styles are available as well, such as those used to render MapQuest Open.

標準のOpenStreetMap向けMapnikスタイルルールはオープンソースであり、OSMデータをカスタムレンダリングするための基盤として使われます([以下の、[JA:Mapnik#OSM_Standard_Mapnik_Style|OSM 標準 Mapnik スタイル]] を参照)。加えて、その他のスタイルをthose used to render MapQuest Openなどで入手できます。

Mapnikスタイルの作成を手助けする、たくさんの外部ツールがあります。Cascadenik, SpreadnikTileMillは、MapnikのビルトインXML言語よりもより簡単に読み書き可能な、よりコンパクトなスタイル言語を提供します。Quantumnikと呼ばれるQGIS プラグインも、よりグラフィカルなインタフェースを使ってMapnikスタイルを作成します。

データソース

Mapnikのデータソースは異なったソースを使うことができます。それらは、OSMデータの直接処理、PostGISデータベース、shapefilesやその他です。

PostGIS

This is the most common approach for rendering OSM data with Mapnik. OSM can be loaded by a tool such as osm2pgsql or Imposm and accessed via SQL queries and GIS functions defined in a Mapnik style. This approach can be used for more advanced renderings, and is the main datasource used by the Standard OpenStreetMap layer.

これは、最も一般的な、Mapinkを使ってOSMデータをレンダリングする方法です。OSMはosm2pgsqlImposmのようなツールを使ってロードされ、SOLクエリとMapnikスタイル中で定義されたGIS関数を経由してアクセスされます。この方法は、より高度なレンダリング用にも使う事ができ、その主要データソースは標準OpenStreetMapレイヤで使われます。

Shapefile

Shapefiles are a common storage and exchange format for geographic data. In addition to PostGIS, the Standard OpenStreetMap style uses several shapefiles to render the map. For example, land masses are drawn using shapefiles generated from the natural=coastline ways by the Coastline Error Checker. See Coastline#Rendering.

Shapefilesは、地図データのための、共通的な保存および交換形式です。更にPostGISに対しては、標準OpenStreetMapスタイルはマップを描画するためにいくつかのshapefilesを使います。たとえば、陸地は Coastlineエラーチェッカによって、natural=coastlineウェイから生成されたshapelinesを使う事によって描画されます。Coastline#Renderingを参照してください。

GeoTIFF

Mapnikは、ラスタイメージとしてGeoTIFFもレンダリングできます。これは一般的に、reliefマップ用に使われます。ステップバイステップのチュートリアルはHillshading with Mapnikを参照してください。

ラスタイメージ

GeoTIFFと同じような方法で、Mapnikは、地図情報を含まない形でビットマップイメージをレンダリングすることもできます。それらのイメージの境界ボックス(★要確認)は、別のパラメータで指定するこ必要があります。

OSM XML

MapnikはOSM XMLファイルから制限付きで直接レンダリングする機能がありますが、これは、一般的には推奨されてはいません。今のところ、これはMapikのインストールをテストするためと、マップのアドホックなレンダリングのためには便利です。 Mapnik: Rendering OSM XML data directlyを参照してください。

導入

数多くのプラットフォームに対する、インストールについての詳細は、Mapnik Github wiki上で保守されています。

OSM 標準 Mapnik スタイル

You can set up a copy of the Standard OpenStreetMap Mapnik style for your own rendering. You can either render it as-is, or make modifications for your own custom map.

固有のレンダリングのために、標準OpenStreetMap Mapnikスタイルのコピーを設定できます。そのままか、固有のカスタムマップ用に変更をして描画するかの、どちらかを選べます。

必要となるソフトウェアの設定

Standard OSM Mapnik style requires Mapnik version 2.0 or higher. You will also need to set up a few other things:

標準OSM Mapnikスタイルは、Mapnikバージョン 2.0あるいはそれ以上を必要とします。また、そのほかにいくつかのソフトウェアを導入/設定する必要があります。

  • a PostGISを有効にしたPostgreSQL データベース(設定手順)
  • osm2pgsql (設定手順)
  • OSM Mapnik スタイルファイル (以下の手順を参照)

OSM Mapnikスタイルファイルを入手するためには、an archive of the projectからダウンロード、解凍するか、以下のようにバージョンコントロールシステムからチェックアウトします:

git clone git://github.com/openstreetmap/mapnik-stylesheets.git
# or
svn export http://svn.openstreetmap.org/applications/rendering/mapnik

必要とするデータのダウンロード

OSMデータの完全なコピーか、smaller extractをダウンロードすることができます。Smaller extractsは、全地球データが24GBくらいなので、まず最初に使うものとして推奨されます。より小さな領域は、普通のデスクトップやラップトップコンピュータ上で容易にインポートできるもので、テストには便利です。これらは、もしも限定された地域の地図のみが必要な場合にも便利に使えます。

注意:もしも全地球版をロードしようとしている場合、データは非常に大きなディスク領域を必要とします。2012年8月時点では、完全な、'slim node' PostgreSQL インポートは、すべてのテーブルとインデックス用として、少なくとも330GBを必要とします。

全地球版またはそれより小さな領域か、どちらかのダウンロードをする時、PBF Formatを使う事は、ファイルサイズが小さくなり、より処理時間が短くなるので推奨されます。

PostGISデータベースに格納されるデータを追加するにあたり、標準OSM Mapnikスタイルはいくつかの外部shapefilesに依存します。それらをダウンロードして、mapnik-stylesheetsディレクトリに格納してください:

以下の端末コマンドでそれらのファイルを解凍することができます:

cd ~/mapnik-stylesheets # or whatever directory you put the project in
tar xzf world_boundaries-spherical.tgz
tar xjf processed_p.tar.bz2 -C world_boundaries
tar xjf shoreline_300.tar.bz2 -C world_boundaries
unzip ne_110m_admin_0_boundary_lines_land.zip -d world_boundaries
unzip ne_10m_populated_places.zip -d world_boundaries
cd world_boundaries
ln -s ne_110m_admin_0_boundary_lines_land.shp 110m_admin_0_boundary_lines_land.shp
ln -s ne_110m_admin_0_boundary_lines_land.dbf 110m_admin_0_boundary_lines_land.dbf

注意: なぜnaturalearthファイルへシンボリックリンクするかについての説明については、 http://wiki.openstreetmap.org/wiki/Talk:Mapnik#Download_required_data の議論ページを参照してください。

注意2: OSM Mapnikスタイルファイルは、shapefilesのダウンロードと解凍を行うシェルスクリプト "get-coastlines.sh" を含んでいます。

The above should leave you with all the shapefiles in the world_boundaries directory. You don't need the tgz, bz2 or zip files any more, maybe tuck them out of the way for now.

上記は、world_boundariesディレクトリ中のすべてのshapefilesを残すべきである、ということです。tgz、bz2あるいはzipファイル等はもはや必要なく、maybe tuck them out of the way for now.(★要確認)

PostGIS データベースへの投入

ダウンロードした全地球、あるいは一部分のファイルを、Mapnikがレンダリングできるように、PostGISデータベース中に投入する必要があります。これは、(mapnikを動かすユーザで)ターミナルから、osm2pgsqlを使って処理します。

osm2pgsql -d gis -U gisuser --slim -m planet-latest.osm.pbf

もしも、PostgreSQLデータベースを異なった形で設定している場合、-d (データベース)と、 -U (ユーザ名)を使って適切な設定にしてください。

もしも、osm2pgsqlをパッケージからインストールした場合、インポートスタイルは期限切れにになっているかもしれません。[1]から最新のバージョンをダウンロードして、mapnikのスタイルシートディレクトリに格納し、この、最新版のファイルを指し示すように、osm2pgqslに対して、 -Sオプションを追加してください(必要に応じてディレクトリを直してください)。

osm2pgsql -S ~/mapnik-stylesheets/default.style -d gis -U gisuser --slim -m planet-latest.osm.pbf

Another potentially useful option is the -b (--bbox) parameter, which you can use to limit your import to a specific bounding box smaller than your overall data file. For example, to just import London from a larger extract of Great Britain, the command might be:

そのほかに便利なオプションとしては、-b (--bbox)パラメータというものがあり、これは、全体のデータファイルよりも小さな、特定のbounding boxのサイズにインポートを制限します。たとえば、英国全体のファイルから倫敦のみをインポートする場合、コマンドは以下のようになります:

osm2pgsql -b -0.5,51.25,0.5,51.75 -d gis -U gisuser --slim -m great_britain.osm.pbf

Mapnikスタイルの設定

The OSM Standard Mapnik style is built up out of a core osm.xml file and many additional XML include files in the inc/ directory. These files won't work out of the box - you'll need to check some configurations and run a build script first. (This is to account for different database setups and directory structures.)

OSM標準Mapnikスタイルは、コアosm.xmlファイルと、inc/ ディレクトリ中にある、たくさんの追加XMLインクルードファイルから生成されて、構築されます。これらのファイルはboxの外側では動作しません(★要確認)。いくつかの設定をチェックし、buildスクリプトを最初に動作させる必要があります(これは、異なったデータベースの設定と、ディレクトリ構造を考慮するためです)。

The build script is generate_xml.py. You can see the options it takes with:

buildスクリプトはgenerate_xml.py</codeです。このオプションは以下のようにして確認出来ます(★要確認):

./generate_xml.py -h

スクリプトが提供する既定値が使用する環境に適しているかどうかを調べてください。既定値がない値については値を設定する必要があります。たとえば:

./generate_xml.py --host localhost --user gisuser --dbname gis \
  --symbols ./symbols/ --world_boundaries ./world_boundaries/

This command takes the .template files from inc/ and creates non-template versions of those files, with your settings. If you can not or do not want to run the script, you can do this by hand as well.

このコマンドは inc/からの .template ファイルを使い、設定に従って、それらのファイルの非テンプレートバージョンを生成します。もしも、スクリプトを動作できない、あるいはさせたくない場合、手動でこの作業を行うこともできます。

以下は既定値を使う例です(ユーザとパスワードは必要に応じて変更してください):

./generate_xml.py --host localhost --port 5432 --dbname gis --user `whoami` --password ''

以下は空白のパスワードとローカル接続の例です(必要に応じてユーザを変更してください):

./generate_xml.py --dbname gis --user `whoami`

If you've checked out the project from version control, you can safely update it (eg. 'git pull' or 'svn update') without disrupting your settings. If there is ever a new option added to the .template files, only then do you need to run the generate_xml.py script again.

もしもバージョンコントロールシステムからプロジェクトをチェックアウトした場合、既存の設定を壊すことなく、安全にアップデートができます(すなわち、'git pull' または 'svn update')。もしも、新しいオプションが、 .template ファイルに追加された場合、generate_xml.py スクリプトを再実行する必要があるのみです。(★要確認)

Unifont fallback サポート

Mapnik includes a font to support a very wide range of writing systems, but the Standard OSM Stylesheet does not use this by default. To add support for this (and avoid broken labels in places like East Asia) you need to edit the file <code>inc/fontset-settings.xml.inc to uncomment the lines that contain "unifont Medium".

Mapnikは、とても広範囲な表記体系をサポートするためのフォントを含んでいますが、標準OSMスタイルシートは既定値ではこれを使いません。これのサポートを追加するために(そして、東アジアのような地域でラベルが壊れるのを防ぐ為)、inc/fontset-settings.xml.incファイルを編集し、"unifont Medium"が含まれている行のコメントを外す必要があります。

名前が地域化されたレンダリング

標準nameタグの代わりに、言語固有の name:*タグ(有効な場合)をレンダリングするためには、データを前処理するか、PostGISデータベースを後で修正するかの、どちらかで行えます。詳細はRegionalisedmapを参照してください。

タイルレンダリングスクリプト

Because Mapnik is a map rendering library, rendering images is usually handled by external programs. The OSM Standard Mapnik style includes a few Python scripts to help out with rendering. There are also external programs that can handle rendering Mapnik styles, such as Tirex, Mod tile, TileStache, and TileCache.

Mapnikはマップをレンダリングするライブラリであるため、レンダリングイメージは通常外部のプログラムによって取り扱われます。OSM標準Mapnikスタイルは、レンダリングを支援する、いくつかののPythonスクリプトが含まれています。また、たとえばTirex, Mod tile, TileStacheTileCacheのようなMapnikスタイルを取り扱うことのできる外部プログラムもあります。

The generate_tiles.py' and generate_tiles_multiprocess.py scripts generates tiles which can be served by a suitable server and displayed by Leaflet, OpenLayers, and other things. To run one of them with its default settings:

generate_tiles.pygenerate_tiles_multiprocess.py スクリプトは、適切なサーバによって提供されてタイルの生成を行い、Leaflet, OpenLayersやその他のものによって表示されます。それらのどれかを、既定値で動かすためには:

MAPNIK_MAP_FILE="osm.xml" MAPNIK_TILE_DIR="tiles/" ./generate_tiles.py

とします。

The program will render tiles for a set of bounding boxes and zoom levels defined in the script. You can change these by editing the script.

プログラムは、スクリプトで定義されたズームレベルで、ひとまとまりの領域をレンダリングします。スクリプトを修正することで、それらを変更できます。

最適化

複数のプロセス

If you have multi-core machine, you can speed-up generate_tiles.py by dividing up an area for e.g. four squares and run few instances in the same time. Further speed improvements are possible by reducing disk I/O bottlenecks (iowait time). These bottlenecks can for example be found with iofile.d; on Mac OS X this returns Spotlight, and Postgress statistics collector as parallel disk I/O consumers.

もしも、マルチコアマシンを使用している場合、エリアごとに分割することで、generate_tiles.pyを高速化できます。たとえば、4つの矩形領域といくつかのインスタンスを同じ時刻に動かします。さらに高速化をするためには、ディスク I/O のボトルネック(iowait時間)を減少することにより改善できます。それらのボトルネックは、たとえば、iofile.dに説明があります。Mac OS X上ではこれはSpotlightを返し、Postgresの統計情報収集子はパラレルディスクI/Oコンシュマーとして返します(★要修正★)。

ディスク使用量の削減

もしも、全地球(すなわち、 bbox = (-180.0, -90.0, 180.0, 90.0))をレンダリングしようとした場合、劇的にディスク使用量を減らす、いくつかの方法があります。

  1. 使う予定のあるタイルだけがあることを確認します。
    1. たとえば、ズームレベル10において、最大のx座標とy座標の値は1023です。そのため、最後のタイルはTILEDIR/10/1023/1023.pngになるべきです。
    2. しかしながら、それを超えたxとyの値を描画することがあります(yの値が1300くらいまでなったこともあります)。
    3. 最初に、それらを各ズームレベルで削除します。
  2. より高位のズームレベル(8かそこら)において、多くのタイルは重複しているでしょう(すなわち、何もない海とか湖とか、地物が何もない陸地とか)。
    1. OSがサポートしている場合、ある1セットの空白な水域と陸地タイルに対して、シンボリックリンクを作成出来ます。
    2. さらに、もしも使用するOSが、ハードリンクを使えるのであれば、これは、タイルが103B(★要確認)しか使わないので、セクタサイズが4Kの最新のHDDでは、さらに多くのスペースを節約できます。

節約の実例(ユーザathlon02における例):

  1. ズームレベル9で、使用するディスクスペースは3.8 GB(メモリが足りているなら)でした。それが今では1.4 GBになっています。
  2. ズームレベル10で、使用するディスクスペースは、最初は12-13 GBくらいでした。それが今では4.58 GBになっています。
  3. この値は環境によって異なることがあります。

Mapnik 2 へのアップグレード

もしもバージョン2.0より古いMapnikバージョン用にスタイルシートを作成していたら、Mapnik 2.0以降でレンダリングするため、それをアップデートする必要があります。スタイルシートに対する、いくつかの仕様変更が行われています。それらは新しいバージョンのmapnikに含まれているアップグレードスクリプトで自動的に適用することが可能です。Mapnik 2 wiki pageの、アップグレードガイド節を参照してください。

起こりうる問題

インポートの問題

ロックアウト

しばらく経ってから、インポートが以下のようなエラーメッセージで終了します:

ANALYZE planet_osm_line;
 failed: ERROR:  deadlock detected
DETAIL:  Process 28511 waits for AccessExclusiveLock on relation 1064115 of database 18309; blocked by process 12776.
Process 12776 waits for ShareLock on transaction 572766655; blocked by process 28511.

Error occurred, cleaning up

This seems to be a fault in some versions of PostgreSQL and is caused when an auto-vacuum is attempted during the ANALYZE. The solution is to disable all auto-vacuums on the database. The data is not updated after the import so the vacuum process does nothing useful. In the postgresql.conf file set the option:

これは、ある種のPostgreSQLバージョンが異常終了したように見え、それは、自動バキュームがANALYZE中に発生した時に引き起こるものです。解決方法は、データベース上の、すべての自動バキュームを無効にすることです。データはインポート後アップデートされないので、バキュームプロセスは意味がありません。postgresql.confファイルにおいて、以下のオプションを設定します:

autovacuum = off

次に、データベースサーバを再起動します。

sudo /etc/init.d/postgresql-8.1 restart

Note: In Debian/Ubuntu you also need to update /etc/cron.d/postgresql-common to comment out the two pg_maintenance tasks (add a '#' in front of them) which would otherwise cause vacuums to occur at regular intervals:-

注意:Debian/Ubuntuでは、一定の時間間隔で、バキュームを実行する、2つのpg_maintenance タスクをコメントアウトするために、 (各行の先頭に '#'を追加して)/etc/cron.d/postgresql-commonを修正する必要もあります。

# Run VACUUM ANALYSE on all databases every 5 hours if pg_autovacuum is not
# running
# 2 0,5,10,15,20 * * 1-6 root if [ -x /usr/sbin/pg_maintenance ]; then /usr/sbin/pg_maintenance --analyze >/dev/null; fi

# On Sunday you may wish to run a VACUUM FULL ANALYSE as well
# If you do not run a 24/7 site, you may want to uncomment the next line 
# so as to do a regular VACUUM FULL.  If you need 24/7 connectivity, save
# VACUUM FULL for when you think you really need it.
# 10 3 * * Sun root if [ -x /usr/sbin/pg_maintenance ]; then /usr/sbin/pg_maintenance --full --analyze >/dev/null; fi

Don't forget to reenable them if you're doing anything else with postgres, or performance will slowly degrade.

postgresで他に何もしていないのなら、これらを再び有効にすることを忘れないでください。さもなければ、性能はだんだん低下するでしょう。

アクセス拒否

Using projection SRS 900913 (Spherical Mercator)
Setting up table: planet_osm_point
NOTICE:  table "planet_osm_point" does not exist, skipping
NOTICE:  table "planet_osm_point_tmp" does not exist, skipping
SELECT AddGeometryColumn('planet_osm_point', 'way', 900913, 'POINT', 2 );
 failed: ERROR:  permission denied for relation spatial_ref_sys
CONTEXT:  SQL statement "SELECT SRID FROM spatial_ref_sys WHERE SRID =  $1 "
PL/pgSQL function "addgeometrycolumn" line 74 at SQL statement
SQL statement "SELECT AddGeometryColumn('','', $1 , $2 , $3 , $4 , $5 )"
PL/pgSQL function "addgeometrycolumn" line 4 at SQL statement

The user is not allowed to modify the gis database. You have to run osm2pgsql as the user you created in the postgresql database setup.

ユーザがgisデータベースを変更することを許可されていません。osm2pgsqlを実行するユーザはpostgresqlデータベースをセットアップしたユーザである必要があります。

レンダリングの問題

Mapnik wiki Troubleshooting page も参照してください。

マップが空

もしも作成したタイルかイメージが海岸線を表示していているのに、道、道の名前、町やその他の地物が欠けている場合、データベースユーザが実際にログインできるかどうか検証してください。スクリプトやMapnikは、データの読み出しに失敗してもなにも表示しないので、そのため、海岸線は描画されますが、その他のデータは欠落します。その他としては、PostGISサポートなしでMapnikが構築された場合が考えられます。

認証の失敗

以下のエラーは、ある種のunixディストリビューションで起こることがあります:

 untimeError: PSQL error:
 FATAL:  Ident authentication failed for user "username" (encountered during parsing of layer 'leisure')

On most Unix installs postgres is setup in the default configuration to work using the 'ident same user' authentication. To use this remove the following params from the config: user, port, host, password. Delete all the parameter lines for these, for example:

ほとんどのUnixマシンでは、postgresは、'ident same user'認証を使って動作するように、既定値が設定されています。これを使うために、configから user, port, host, passwordパラメータを取り去ってください。それらからすべてのパラメータ行を取り去る例は以下の通りです(★要確認):

 ./generate_xml.py --accept-none --dbname gis --symbols ./symbols/ --world_boundaries ./world_boundaries/

Then mapnik will connect the same way as if you ran "psql gis" from the command line (without specifying a host, username or password).

その後、mapnikは、コマンド行から(ホスト名、ユーザ名またはパスワードなして)、"psql gis"を動かしていたと同じように、コネクトします。

参照