openstreetmap-tile-server-ubuntu-16-04
2016-10-05 14:19
357 查看
在Ubuntu16-04版本上搭建离线免费地图,具体的步骤如下,也可以直接下载【我的资源】里面的pdf,下载地址为:
http://download.csdn.net/detail/emily201314/9645880
或者直接查看有道笔记分享链接:http://note.youdao.com/noteshare?id=0b23b59ad6615a60eb45ef67670626cd
来源地址:https://www.linuxbabe.com/linux-server/openstreetmap-tile-server-ubuntu-16-04
We will use PostgreSQL to store map data. PostGIS is a geospatial extenstion to PostgreSQL. Run the following commands to install them.
A user named
switch to the
Create a PostgreSQL database user
Create a database named
the owner of the database.
Create hstore and postgis extension.
Exit from the
Create
First switch to
Download the latest CartoCSS map stylesheets to the
http://download.csdn.net/detail/emily201314/9645880
或者直接查看有道笔记分享链接:http://note.youdao.com/noteshare?id=0b23b59ad6615a60eb45ef67670626cd
来源地址:https://www.linuxbabe.com/linux-server/openstreetmap-tile-server-ubuntu-16-04
Step 1: Upgrade Software
sudo apt update sudo apt upgrade
Step 2: Install PostgreSQL Database Server with PostGIS
We will use PostgreSQL to store map data. PostGIS is a geospatial extenstion to PostgreSQL. Run the following commands to install them.sudo apt install postgresql postgresql-contrib postgis postgresql-9.5-postgis-2.2
修改为(一个一个安装):
sudo apt install postgresql
sudo apt install postgresql-contrib
sudo apt install postgis
sudo apt install postgresql-9.5-postgis-2.2
A user named
postgreswill be created during the installation process. This allows the use of peer authentication. Let’s
switch to the
postgresuser:
sudo -u postgres -i
Create a PostgreSQL database user
osm.
createuser osm
Create a database named
gisand at the same time make
osmas
the owner of the database.
-E UTF8specifies the character encoding scheme to be used in the database is UTF8.
createdb -E UTF8 -O osm gis
Create hstore and postgis extension.
psql -c "CREATE EXTENSION hstore;" -d gis psql -c "CREATE EXTENSION postgis;" -d gis
Exit from the
postgresuser.
exit
Create
osmuser on your operating system so the tile server can run as
osmuser.
sudo adduser osm
Step 3: Download Map Stylesheet and Map Data
First switch to osmuser
su - osm
Download the latest CartoCSS map stylesheets to the
osmuser’s home directory.
wget https://github.com/gravitystorm/openstreetmap-carto/archive/v2.41.0.tar.gz[/code]
Extract it.tar xvf v2.41.0.tar.gz
Next, download map data to the osm user’s home directory. Use the below command to download the map data of the whole planet (32G).wget -c http://planet.openstreetmap.org/pbf/planet-latest.osm.pbf[/code]
If you want a map of individual country or state, go to http://download.geofabrik.de. Also, BBBike.org provides extracts
of more than 200 cities and regions world-wide in different formats.
For example, download the map data of Great Britain (847M).wget -c http://download.geofabrik.de/europe/great-britain-latest.osm.pbf[/code]
可以下载中国地图或者是北京地图
wget -c http://download.bbbike.org/osm/bbbike/Beijing/Beijing.osm.pbf
或者是
wget -c http://download.geofabrik.de/asia/china-latest.osm.pbf
Now exit from theosmuser.exitImporting map data takes a lot of RAM. If your physical memory is small, you can easily add a swap file. First we use
Recommendations before Importing Map Datafallocatecommand
to create a file. For example, create a file named swapfile with 2G capacity in root file system:sudo fallocate -l 3G /swapfile
Then make sure only root can read and write to it.sudo chmod 600 /swapfile
Format it to swap:sudo mkswap /swapfile
Output:Setting up swapspace version 1, size = 2097148 KiB no label, UUID=h32b3e10-0779-4865-9ea0-6e2af8f3kea9
Enable the swap filesudo swapon /swapfile
The import process can take some time. It’s recommended to configure SSH keepalive so that you don’t lose the SSH connection. It’s very easy to do. Just open the SSH client configuration file on your local Linux machine.sudo nano /etc/ssh/ssh_config
And paste the following text at the end of the file.ServerAliveInterval 60
Then save the file and connect to your Ubuntu 16.04 serverTo import map data, we need to install
Step 4: Import the Map Data to PostgreSQLosm2pgsqlwhich converts OpenStreetMap data to postGIS-enabled PostgreSQL
databases.sudo apt install osm2pgsql
Switch toosmuser again.su - osm
Run the following command to load map stylesheet and map data into thegisDatabase. Replacegreat-britain-latest.osm.pbfwith
your own map data file.osm2pgsql --slim -d gis -C 3600 --hstore -S openstreetmap-carto-2.41.0/openstreetmap-carto.style great-britain-latest.osm.pbf修改成对应的osm.pbf名字osm2pgsql --slim -d gis -C 3600 --hstore -S openstreetmap-carto-2.41.0/openstreetmap-carto.style china-latest.osm.pbf这个命令耗时特别久,不要慌,等着完成osm2gpsqlwill run in slim mode which is recommended over the normal mode.-dstands
for--database.-Cflag
specify the cache size in MB. Bigger cache size results in faster import speed but you need to have enough RAM to use cache.-Sflag
specify the style file. And finally you need to specify the map data file.
Once the import is complete, exit from theosmuser.exitmod_tile is an Apache module that is required to serve tiles. Currently no binary package is available for Ubuntu. We can compile it from Github repository.
Step 5: Install mod_tile
First install build dependency.sudo apt install git autoconf libtool libmapnik-dev apache2-dev修改为:sudo apt install gitsudo apt install autoconfsudo apt install libtoolsudo apt install libmapnik-devsudo apt install apache2-dev
Then clone the repository from Github.git clone https://github.com/openstreetmap/mod_tile.git cd mod_tile/
Compile and install./autogen.sh ./configure make sudo make install sudo make install-mod_tileInstall required packages.
Step 6: Generate Mapnik Stylesheetsudo apt install curl unzip gdal-bin mapnik-utils node-carto修改为:sudo apt install curlsudo apt install unzipsudo apt install gdal-binsudo apt install mapnik-utilssudo apt install node-carto
Switch to osm user.su - osm
Cd into the carto style directory.cd openstreetmap-carto-2.41.0/
Get shapefiles../get-shapefiles.sh(最终效果)./get-shapefiles.sh命令的内容如下:
#!/bin/sh
set -e -u
UNZIP_OPTS=-qqun
# create and populate data dir
mkdir -p data/
mkdir -p data/world_boundaries
mkdir -p data/simplified-land-polygons-complete-3857
mkdir -p data/ne_110m_admin_0_boundary_lines_land
mkdir -p data/land-polygons-split-3857
# world_boundaries
echo "downloading world_boundaries..."
curl -z "data/world_boundaries-spherical.tgz" -L -o "data/world_boundaries-spherical.tgz" "http://planet.openstreetmap.org/historical-shapefiles/world_boundaries-spherical.tgz"
echo "expanding world_boundaries..."
tar -xzf data/world_boundaries-spherical.tgz -C data/
# simplified-land-polygons-complete-3857
echo "downloading simplified-land-polygons-complete-3857..."
curl -z "data/simplified-land-polygons-complete-3857.zip" -L -o "data/simplified-land-polygons-complete-3857.zip" "http://data.openstreetmapdata.com/simplified-land-polygons-complete-3857.zip
"
echo "simplified-land-polygons-complete-3857..."
unzip $UNZIP_OPTS data/simplified-land-polygons-complete-3857.zip \
simplified-land-polygons-complete-3857/simplified_land_polygons.shp \
simplified-land-polygons-complete-3857/simplified_land_polygons.shx \
simplified-land-polygons-complete-3857/simplified_land_polygons.prj \
simplified-land-polygons-complete-3857/simplified_land_polygons.dbf \
simplified-land-polygons-complete-3857/simplified_land_polygons.cpg \
-d data/
# ne_110m_admin_0_boundary_lines_land
echo "downloading ne_110m_admin_0_boundary_lines_land..."
curl -z data/ne_110m_admin_0_boundary_lines_land.zip -L -o data/ne_110m_admin_0_boundary_lines_land.zip http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_boundary_lines_land.zip
echo "expanding ne_110m_admin_0_boundary_lines_land..."
unzip $UNZIP_OPTS data/ne_110m_admin_0_boundary_lines_land.zip \
ne_110m_admin_0_boundary_lines_land.shp \
ne_110m_admin_0_boundary_lines_land.shx \
ne_110m_admin_0_boundary_lines_land.prj \
ne_110m_admin_0_boundary_lines_land.dbf \
-d data/ne_110m_admin_0_boundary_lines_land/
# land-polygons-split-3857
echo "downloading land-polygons-split-3857..."
curl -z "data/land-polygons-split-3857.zip" -L -o "data/land-polygons-split-3857.zip" "http://data.openstreetmapdata.com/land-polygons-split-3857.zip
"
echo "expanding land-polygons-split-3857..."
unzip $UNZIP_OPTS data/land-polygons-split-3857.zip \
land-polygons-split-3857/land_polygons.shp \
land-polygons-split-3857/land_polygons.shx \
land-polygons-split-3857/land_polygons.prj \
land-polygons-split-3857/land_polygons.dbf \
land-polygons-split-3857/land_polygons.cpg \
-d data/
# antarctica-icesheet-polygons-3857
echo "downloading antarctica-icesheet-polygons-3857..."
curl -z "data/antarctica-icesheet-polygons-3857.zip" -L -o "data/antarctica-icesheet-polygons-3857.zip" "http://data.openstreetmapdata.com/antarctica-icesheet-polygons-3857.zip
"
echo "expanding antarctica-icesheet-polygons-3857..."
unzip $UNZIP_OPTS data/antarctica-icesheet-polygons-3857.zip \
antarctica-icesheet-polygons-3857/icesheet_polygons.shp \
antarctica-icesheet-polygons-3857/icesheet_polygons.shx \
antarctica-icesheet-polygons-3857/icesheet_polygons.prj \
antarctica-icesheet-polygons-3857/icesheet_polygons.dbf \
-d data/
# antarctica-icesheet-outlines-3857
echo "downloading antarctica-icesheet-outlines-3857..."
curl -z "data/antarctica-icesheet-outlines-3857.zip" -L -o "data/antarctica-icesheet-outlines-3857.zip" "http://data.openstreetmapdata.com/antarctica-icesheet-outlines-3857.zip
"
echo "expanding antarctica-icesheet-outlines-3857..."
unzip $UNZIP_OPTS data/antarctica-icesheet-outlines-3857.zip \
antarctica-icesheet-outlines-3857/icesheet_outlines.shp \
antarctica-icesheet-outlines-3857/icesheet_outlines.shx \
antarctica-icesheet-outlines-3857/icesheet_outlines.prj \
antarctica-icesheet-outlines-3857/icesheet_outlines.dbf \
-d data/
#index
echo "indexing shapefiles"
shapeindex --shape_files \
data/simplified-land-polygons-complete-3857/simplified_land_polygons.shp \
data/land-polygons-split-3857/land_polygons.shp \
data/antarctica-icesheet-polygons-3857/icesheet_polygons.shp \
data/antarctica-icesheet-outlines-3857/icesheet_outlines.shp \
data/ne_110m_admin_0_boundary_lines_land/ne_110m_admin_0_boundary_lines_land.shp
#finish
echo "...done!"
Now build the Mapnik xml stylesheet.carto project.mml > style.xml
sudo apt-get -y install fonts-wqy-zenhei
sudo apt-get install unifont
sudo apt-get install ttf-unifont
下载字体保存在/usr/share/fonts/truetype路径下
替换会出现中文乱码不显示问题,需要替换生成的样式文件
Exit from theosmuser.exitEdit renderd config file.
Step 7: Configuring renderdsudo nano /usr/local/etc/renderd.conf
In the[default]section, change the value of XML and HOST to the following.XML=/home/osm/openstreetmap-carto-2.41.0/style.xml HOST=localhost
In [mapnik] section, change the value of plugins_dir.plugins_dir=/usr/lib/mapnik/3.0/input/
Save the file.
Install renderd init script by copying the sample init script.
cd ~sudo cp mod_tile/debian/renderd.init /etc/init.d/renderd
Grant execute permission.sudo chmod a+x /etc/init.d/renderd
Edit the init script filesudo nano /etc/init.d/renderd
Change the following variable.DAEMON=/usr/local/bin/$NAME DAEMON_ARGS="-c /usr/local/etc/renderd.conf" RUNASUSER=osm
Save the file.
Create the following file and set osm the owner.sudo mkdir -p /var/lib/mod_tile sudo chown osm:osm /var/lib/mod_tile
Then start renderd servicesudo systemctl daemon-reload sudo systemctl start renderd sudo systemctl enable renderdInstall apache web server
Step 8: Configure Apachesudo apt install apache2
Create a module load file.sudo nano /etc/apache2/mods-available/mod_tile.load
Paste the following line into the file.LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so
Create a symlink.sudo ln -s /etc/apache2/mods-available/mod_tile.load /etc/apache2/mods-enabled/
Then edit the default virtual host file.sudo nano /etc/apache2/sites-enabled/000-default.conf
Past the following line in <VirtualHost *:80>LoadTileConfigFile /usr/local/etc/renderd.conf ModTileRenderdSocketName /var/run/renderd/renderd.sock # Timeout before giving up for a tile to be rendered ModTileRequestTimeout 0 # Timeout before giving up for a tile to be rendered that is otherwise missing ModTileMissingRequestTimeout 30
Save and close the file. Restart Apache.sudo systemctl restart apache2
Then in your web browser address bar, typeyour-server-ip/osm_tiles/0/0/0.png
You should see the tile of world map. Congrats! You just successfully built your own OSM tile server.Tiled web map is also known as slippy map in OpenStreetMap terminology. There are two free and open source JavaScript map libraries you can use for your tile server: OpenLayer and Leaflet.
Display Your Tiled Web Map
The advantage of Leaflet is that it is simple to use and your map will be mobile-friendly.在Openlayer中显示
OpenLayer
cd /var/www/html
wget https://github.com/openlayers/ol3/releases/download/v3.18.2/v3.18.2-dist.zip
unzip 'v3.18.2.zip'
保证ol.css、ol.js下载保存到/var/www/html目录下
cp /var/www/html/v3.18.2-dist/ol.css /var/www/html/ol.css
cp /var/www/html/v3.18.2-dist/ol.js /var/www/html/ol.js
sudo nano /var/www/html/info.html
添加
<!DOCTYPE html>
<html>
<head>
<title>Accessible Map</title>
<link rel="stylesheet" href="ol.css" type="text/css">
<script src="ol.js"></script>
<style>
a.skiplink {
position: absolute;
clip: rect(1px, 1px, 1px, 1px);
padding: 0;
border: 0;
height: 1px;
width: 1px;
overflow: hidden;
}
a.skiplink:focus {
clip: auto;
height: auto;
width: auto;
background-color: #fff;
padding: 0.3em;
}
#map:focus {
outline: #4A74A8 solid 0.15em;
}
</style>
</head>
<body>
<a class="skiplink" href="#map">Go to map</a>
<div id="map" class="map" tabindex="0"></div>
<button id="zoom-out">Zoom out</button>
<button id="zoom-in">Zoom in</button>
<script>
var map = new ol.Map({
layers: [
new ol.layer.Tile({
source: new ol.source.OSM({
url: 'http://192.168.175.100/osm_tiles/{z}/{x}/{y}.png'
})
})
],
target: 'map',
controls: ol.control.defaults({
attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
collapsible: false
})
}),
view: new ol.View({
center: [12973503.936793,4833266.172531],
zoom:5
})
});
document.getElementById('zoom-out').onclick = function() {
var view = map.getView();
var zoom = view.getZoom();
view.setZoom(zoom - 1);
};
document.getElementById('zoom-in').onclick = function() {
var view = map.getView();
var zoom = view.getZoom();
view.setZoom(zoom + 1);
};
</script>
</body>
</html>
To display your slippy map with OpenLayer, first create a web folder.sudo mkdir /var/www/osm
Then download JavaScript and CSS from openlayer.org and extract it to the web root folder.
Next, create theindex.htmlfile.sudo nano /var/www/osm/index.html
Paste the following HTML code in the file. Replace red-colored text and adjust the longitude, latitude and zoom level according to your needs.<!DOCTYPE html> <html> <head> <title>Accessible Map</title> <link rel="stylesheet" href="http://your-ip/ol.css" type="text/css"> <script src="http://your-ip/ol.js"></script> <style> a.skiplink { position: absolute; clip: rect(1px, 1px, 1px, 1px); padding: 0; border: 0; height: 1px; width: 1px; overflow: hidden; } a.skiplink:focus { clip: auto; height: auto; width: auto; background-color: #fff; padding: 0.3em; } #map:focus { outline: #4A74A8 solid 0.15em; } </style> </head> <body> <a class="skiplink" href="#map">Go to map</a> <div id="map" class="map" tabindex="0"></div> <button id="zoom-out">Zoom out</button> <button id="zoom-in">Zoom in</button> <script> var map = new ol.Map({ layers: [ new ol.layer.Tile({ source: new ol.source.OSM({ url: 'http://your-ip/osm_tiles/{z}/{x}/{y}.png' }) }) ], target: 'map', controls: ol.control.defaults({ attributionOptions: /** @type {olx.control.AttributionOptions} */ ({ collapsible: false }) }), view: new ol.View({ center: [244780.24508882355, 7386452.183179816], zoom:5 }) }); document.getElementById('zoom-out').onclick = function() { var view = map.getView(); var zoom = view.getZoom(); view.setZoom(zoom - 1); }; document.getElementById('zoom-in').onclick = function() { var view = map.getView(); var zoom = view.getZoom(); view.setZoom(zoom + 1); }; </script> </body> </html>
Save and close the file. Now you can view your slippy map by typing your server IP address in browser.your-ip/index.html or your-ipTo display your slippy map with Leftlet, first create a web folder.
Leafletsudo mkdir /var/www/osm
Then download JavaScript and CSS from leftletjs.com and extract it to the web root folder.
cd /var/www/html
wget http://cdn.leafletjs.com/leaflet/v1.0.0/leaflet.zip
unzip 'leaflet.zip'
sudo nano /var/www/html/show.html
添加
<html>
<head>
<title>My first osm</title>
<link rel="stylesheet" type="text/css" href="leaflet.css"/>
<script type="text/javascript" src="leaflet.js"></script>
<style>
#map{width:100%;height:100%}
</style>
</head>
<body>
<div id="map"></div>
<script>
var map = L.map('map').setView([12973503.936793,4833266.172531],5);
L.tileLayer('http://192.168.175.100/osm_tiles/{z}/{x}/{y}.png',{maxZoom:18}).addTo(map);
</script>
</body>
</html>
Next, create theindex.htmlfile.sudo nano /var/www/osm/index.html
Paste the following HTML code in the file. Replace red-colored text and adjust the longitude, latitude and zoom level according to your needs.<html> <head> <title>My first osm</title> <link rel="stylesheet" type="text/css" href="leaflet.css"/> <script type="text/javascript" src="leaflet.js"></script> <style> #map{width:100%;height:100%} </style> </head> <body> <div id="map"></div> <script> var map = L.map('map').setView([53.555,9.899],5); L.tileLayer('http://your-ip/osm_tiles/{z}/{x}/{y}.png',{maxZoom:18}).addTo(map); </script> </body> </html>
Save and close the file. Now you can view your slippy map by typing your server IP address in browser.your-ip/index.html or your-ip
To pre-render tiles instead of rendering on the fly, userender_listcommand. Pre-rendered tiles will be cached
in/var/lib/mod_tiledirectory.-zand-Zflag
specify the zoom level.render_list -m default -a -z 0 -Z 10
This tutorial is made available with the help from Miles B. Dyson.
问题一:若是显示China地图,地标在浏览器会出现乱码问题
1.查看错误
su osm -c "renderd -f -c /usr/local/etc/renderd.conf"
里面会提示有哪些字体找不到
2.下载以下字体:
sudo apt-get -y install fonts-wqy-zenhei
sudo apt-get install unifont
sudo apt-get install ttf-unifont
下载字体保存在/usr/share/fonts/truetype路径下
3.修改/home/osm/openstreetmap-carto-2.41.0/style.xml样式表,将错误中提示找不到的字体样式全部改成可以找到的字体样式
4.删除缓存
sudo rm -rf /var/lib/mod_tile/default/*
5.打开浏览器重新访问地图
缓存tiles到/var/lib/mod_tile目录下,方便以后加载
render_list -m default -a -z 0 -Z 18
相关文章推荐
- 搭建Openstreetmap地图服务器(Ubuntu 16.04LTS)
- ubuntu16.04下的OpenStreetMap离线地理编码服务器的搭建(Nominatim)
- TileCache+MapServer+OpenLayers使用方法
- OpenStreetMap
- UbuntuServer10.10下安装OpenWebAnalytics (2)
- 共享免费世界地图OpenStreetMap(OSM)
- 每日一读 Packtpub.OpenStreetMap(1)
- [网播][podcast] Born to MISrepresent 第十四集:行者常至,为者常成:Schee 谈 Open Street Map 及 hopen.data 渴望开放资料计划
- OpenStreetMap初探(六)——获取地图数据
- 如何解决sql连接错误HResult 0x2, Level 16, State 1 Could not open a connection to SQL Server [2].
- UbuntuServer10.10下安装OpenWebAnalytics (1)
- Bing Maps进阶系列八:在Bing Maps中集成OpenStreetMap地图
- OpenStreetMap和OpenRouteService
- OpenStreetMap初探(一)——了解OpenStreetMap
- OpenStreetMap初探(五)——地图编辑之JOSM
- 如何解决sql连接错误HResult 0x2, Level 16, State 1 Could not open a connection to SQL Server [2].
- Bing Maps进阶系列八:在Bing Maps中集成OpenStreetMap地图
- Bing Maps进阶系列八:在Bing Maps中集成OpenStreetMap地图 推荐
- ArcGIS Editor for OpenStreetMap
- 每日一读 Packtpub.OpenStreetMap(3)