從包中構建瓦片伺服器
SWITCH2OSM
切換到OPENSTREETMAP
豐富的資料
OpenStreetMap資料豐富而詳細,包含與實地人相關的大量資料 - 收集的資料。
功能包括:
- 道路,鐵路,水路等
- 餐廳,商店,車站,自動取款機等。
- 步行和自行車道。
- 建築物,校園等
從包中構建瓦片伺服器
如果你想建立自己的瓦片伺服器,使用軟體包可以節省大量的安裝工作。
這些軟體包與Ubuntu Linux版本12.04 LTS(精確穿山甲)及以上版本配合使用。安裝完成後,您應該使用標準的OSM Mapnik樣式表使用自己的工作tileer,您可以在其中匯入OSM資料的提取以進行渲染。
它基於OSM自己的瓦片伺服器使用的相同的軟體:
- mod_tile用於服務
- renderd作為渲染守護程序
- mapnik為實際渲染
這些軟體包的主要目的是通過將包裝指令碼儘可能多的自動化來簡化安裝。
安裝
需要將以下命令輸入終端進行設定:
如果您沒有安裝add-apt-repository,請將其新增到:
對於Ubuntu 12.04
sudo apt-get install python-software-properties
對於Ubuntu 12.10及更高版本
sudo apt-get安裝軟體屬性常見新增包含包的儲存庫:
sudo add-apt-repository ppa:kakrueger / openstreetmap
更新本地軟體包列表以獲取新的儲存庫:
sudo apt-get更新
安裝軟體包libapache2-mod-tile及其依賴項。在配置過程中,會詢問幾個問題。要確保自動安裝指令碼可以工作,您應該保留預設值。但是,在關於資料庫使用者的許可權的問題中,您希望在使用者之後新增自己的使用者名稱,該資料由空格分隔,以便能夠在使用者下匯入資料。
sudo apt-get install libapache2-mod-tile
匯入地圖資料
下載要渲染的OpenStreetMap資料(完整的行星檔案可以在planet.openstreetmap.org上找到,國家提要可以在例如download.geofabrik.de上找到)。例如:
wget http://download.geofabrik.de/europe/ireland-and-northern-ireland-latest.osm.pbf
使用osm2pgsql將資料匯入到postgresql資料庫中。osm2pgsql可以使用許多不同的引數,這些引數取決於您可用的硬體和要匯入的資料提取的大小。您需要設定的最有可能的是“-C”,“-slim”和“ - 數字處理”。-C指定Mb osm2pgsql將用於快取資料的數量。所以這取決於你可用的RAM的數量。-slim將完整的osm資料儲存在磁碟上,是更新和低記憶體環境所必需的。-number-processes指定用於匯入過程的某些部分的並行程序數。最佳值主要取決於磁碟系統的速度和可用的處理器核心。
osm2pgsql --slim -C 1500 - 數字處理4 ireland-and-northern-ireland.osm.pbf
根據您正在匯入的提取物的大小和計算機的效能,對於小型提取物,可能需要幾分鐘的時間才能在較慢的硬體上完成行星的幾分鐘。如果您正在匯入完整的行星,強烈建議您設定-C 18000(18 GB的RAM快取,並隨著OSM資料庫的增長而增加)。如果您沒有足夠的記憶體量,這可能會導致您的伺服器在匯入期間進行交換,但在許多情況下,它仍然比為節點快取使用較小的值更快。但是,您需要確保已配置足夠的交換記憶體。
如果要匯入完整的行星檔案,您可能還需要使用-flat-nodes選項。它為某些資料而不是postgis資料庫使用自定義格式檔案,使其更有效率,但對區域提取效率較低。在匯入期間臨時更改PostgreSQL配置也可能是有意義的。(例如,增加檢查點數量,減少共享緩衝區大小。)
匯入時間的大部分以及資料庫的大小都用於建立索引以跟蹤更新。如果您不打算使資料庫連續不間斷地使用“差異檔案”,則可能需要使用-drop選項匯入資料,該 選項將在匯入後刪除“slim-tables”,而不需要渲染並且不建立僅需要支援差異匯入的索引。一旦您每1 - 2周更頻繁地更新一次,可能會更有效地每次完成重新匯入,而不是使用更新。
mod_tile旨在始終提供最新的圖塊(見下文更新)。由於在更改時重新渲染所有已更改的圖塊通常是不可行的,因此mod_tile會在投放時啟動重新渲染過時的圖塊。這樣的mod_tile需要知道什麼時候行星被匯入。這是通過更改檔案planet-import-complete的時間戳來完成的
觸控/ var / lib / mod_tile / planet-import-complete
最後,您需要重新啟動渲染守護程式,之後所有應該準備好。
sudo /etc/init.d/renderd重啟
如果一切正常,您應該有一個工作的tileerver,您可以通過訪問http://localhost/osm/slippymap.html檢視其結果
如果您沒有在本地主機上開啟slippymap.html,並且您只看到粉紅色的圖塊,則需要編輯html頁面,並將localhost替換為“new OpenLayers.Layer.Layer.SMM(”Local Tiles“...”)中正確的伺服器名稱,或將其更改為相對URL。
更新
以下命令說明如何使用最新的OSM資料來保持瓷磚伺服器的最新版本。
使用上述osm2pgsql匯入初始資料庫之後(您將需要在初始匯入中使用-slim選項以允許更新),則需要執行以下步驟
安裝滲透
sudo apt-get安裝滲透
授予使用者www資料更新表的許可權
sudo /usr/bin/install-postgis-osm-user.sh gis www-data
將滲透複製堆疊初始化為資料匯入的資料。選擇行星資料的日期,因為這是差異開始的日期。
sudo -u www-data /usr/bin/openstreetmap-tiles-update-expire 2012-04-21
As the packaged script currently uses an outdated service to determine the correct replication start-point, you will need to manually choose and download the correct state.txt from the base_url (see below) which corresponds to slightly before the age of the extract to make sure all modifications are included in your db. This needs to be copied to /var/lib/mod_tile/.osmosis/state.txt
You will next need to update the default configuration of osmosis. In /var/lib/mod_tile/.osmosis/configuration.txt change the base_url to
“http://planet.openstreetmap.org/replication/minute/”
Update your tileserver by up to an hour and expire the corresponding rendered tiles
sudo -u www-data /usr/bin/openstreetmap-tiles-update-expire
If your tile server is behind more than an hour you will need to call the openstreetmap-tiles-expire script multiple times. If you want to continuously keep your server up to data, you need to add the openstreetmap-tiles-expire script to your crontab.
Keeping the data up-to-date can be resource intense, in particular because after the import you may already be multiple days behind. Consider changing maxInterval in /var/lib/mod_tile/.osmosis/configuration.txt to 21600 (six hours) till you have caught up. Further, add “–number-processes 2” to the osm2pgsql command in /usr/bin/openstreetmap-tiles-update-expire or a higher number if this is appropriate for your hardware.
The initial install installed pre-processed coastlines, from time to time it may make sense to replace the files with new versions:
wget http://tile.openstreetmap.org/processed_p.tar.bz2
and extract it to
/etc/mapnik-osm-data/world_boundaries/
Troubleshooting
There are a number of things that can go wrong. Here are a few of the common problems and there solutions:
Connection to database failed in osm2pgsql
If you are getting the following error message when importing data with osm2pgsql, you have probably forgotten to add your username in the allowed users section during the configuration. Connection to database Failed: FATAL: Ident authentication failed for user “xyz”
You can fix this in one of two ways:
Either you reconfigure the package, this time including both www-data and your own user name in a space separated list,
sudo dpkg-reconfigure openstreetmap-postgis-db-setup
Or, you manually grant permissions to your user account with the following command:
sudo /usr/bin/install-postgis-osm-user.sh gis xyz
Hardware
Hardware requirements can be quite demanding if you want to render larger areas, but aren’t too bad if you are only interested in smaller regions. For a standard desktop (approximately 4 GB of ram, standard harddisk, dual – quad core CPU) probably an extract size of about 100 – 300 Mb is reasonable (import time of the order of an hour).
If you want to import and render the whole world, you will need a considerably beefier server than a typical desktop. E.g. starting from about 24Gb of RAM upwards. It is also strongly recomend to use an SSD for the database or at least a fast RAID array. The full planet import is currently around about 256GB, so to store all of the DB on an SSD, you will likely need a 512GB SSD. An import that is not updated and uses the –drop option on the otherhand likely still fits on a 256GB SSD. You can also selectively put the most important parts of the database on an SSD and the rest on slower disks. Osm2pgsql supports using separate tablespaces for different parts of the database for this purpose.
FAQ
Where are the various files (DB / Tiles, etc.) ?
- Style sheets and coastlines are in /etc/mapnik-osm-data
- Tiles are in /var/lib/mod_tile
- Renderd configuration in /etc/renderd.conf
- mod_tile configuration in /etc/apache2/sites-available/tileserver_site
- Scripts are in /usr/bin
- Database configuration is in /etc/postgresql/X.X/main (where X.X is the PostgreSQL version, for example 9.1)
- osm2pgsql configuration and state.txt is in /var/lib/mod_tile/.osmosis
How do I pre-render tiles ?
You can use render_list to pre-render tiles:
Usage: render_list [OPTION] ... -a, --all render all tiles in given zoom level range instead of reading from STDIN -f, --force render tiles even if they seem current -m, --map=MAP render tiles in this map (defaults to 'default') -l, --max-load=LOAD sleep if load is this high (defaults to 5) -s, --socket=SOCKET unix domain socket name for contacting renderd -n, --num-threads=N the number of parallel request threads (default 1) -t, --tile-dir tile cache directory (defaults to '/var/lib/mod_tile') -z, --min-zoom=ZOOM filter input to only render tiles greater or equal to this zoom level (default is 0) -Z, --max-zoom=ZOOM filter input to only render tiles less than or equal to this zoom level (default is 18)
If you are using –all, you can restrict the tile range by adding these options:
-x, --min-x=X minimum X tile coordinate -X, --max-x=X maximum X tile coordinate -y, --min-y=Y minimum Y tile coordinate -Y, --max-y=Y maximum Y tile coordinate
Without –all, send a list of tiles to be rendered from STDIN in the format X Y Z, e.g.
0 0 1 0 1 1 1 0 1 1 1 1
The above would cause all 4 tiles at zoom 1 to be rendered
Note that you have to set –socket=/var/run/renderd/renderd.sock
Acknowledgements
感謝Kai Krueger維護包裝和準備檔案。