目录
一、简介
该地图服务器是基于优麒麟系统的安装部署!!!
优麒麟设置 root 密码:
sudo passwd root
升级系统
sudo apt update
sudo apt upgrade
二、安装 PostgreSQL 数据库和 PostGIS 扩展
sudo apt install postgresql
sudo apt install postgresql-contrib
sudo apt install postgis postgresql-postgis
安装语言
export LANGUAGE="en_US.UTF-8"
export LANG="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
sudo locale-gen en_US.UTF-8
sudo dpkg-reconfigure locales
ubuntu 下 postgres 用户并登录 PostgreSQL 服务器
sudo -u postgres -i
执行 psql 命令,并设置 postgres 用户登录密码
psql postgres
postgres=# \password
Enter new password:
Enter it again:
postgres=#\q
创建用户 osm
createuser osm
然后创建一个名为 gis 的数据库,同时将 osm 作为数据库的所有者,-E UTF8 指定要在数据库中使用的字符编码方案是 UTF8
createdb -E UTF8 -O osm gis
接下来,为 gis 数据库创建 postgis 和 hstore 扩展
psql -c "CREATE EXTENSION postgis;" -d gis
psql -c "CREATE EXTENSION hstore;" -d gis
将 osm 设置为表所有者
psql -c "ALTER TABLE spatial_ref_sys OWNER TO osm;" -d gis
退出 postgres 用户
exit
创建 ubuntu 的 osm 用户便后续使用
sudo adduser osm
三、下载地图样式表和上传地图数据
切换 osm 用户
su - osm
将最新的 CartoCSS 地图样式表下载到 osm 用户的主目录
wget https://github.com/gravitystorm/openstreetmap-carto/archive/v4.20.0.tar.gz
tar -zxvf v4.20.0.tar.gz
上面下载可能会连接不上,网盘下载地址:https://pan.baidu.com/s/1hXcGhUM9tL3kQpiZgSnmKQ
提取码:ovac
上传地图数据到 osm 用户的目录,osm 地图数据下载地址
http://download.geofabrik.de/asia.html
退出 osm 用户
exit
四、将地图数据导入 PostgresSQL
需安装工具:osm2pgsql
sudo apt install osm2pgsql
运行以下命令以将地图样式表和地图数据加载到 gis 数据库中,用你自己的地图数据文件替换,最后,需要指定地图数据文件的位置。
su - osm
osm2pgsql --slim -d gis --hstore --multi-geometry --number-processes 8 --tag-transform-script /home/osm/openstreetmap-carto-4.20.0/openstreetmap-carto.lua --style /home/osm/openstreetmap-carto-4.20.0/openstreetmap-carto.style /home/osm/china-latest.osm.pbf
退出osm用户
exit
相关说明:
参数 | 说明 |
---|---|
-username | 指定数据库用户 |
-slim | 以苗条模式而不是普通模式运行,如果要在将来使用OSM更改文件(OSC)更新地图数据,则需要此选项 |
-d | 选择数据库 |
-hstore | 将不带列的标记添加到PostgreSQL表的其他hstore(键/值)列 |
-multi-geometry | 在postgresql表中生成多几何特征 |
-style | 指定样式文件的位置 |
–number-processes | 服务器上的CPU核心数 |
-C | 选项以兆字节为单位指定缓存大小,较大的缓存大小导致更快的导入速度,但你需要有足够的RAM来使用缓存 |
添加中文支持
sudo apt-get -y install fonts-wqy-zenhei
sudo apt-get -y install unifont
sudo apt-get -y install ttf-unifont
五、生成 Mapnik Stylesheet
安装必要软件
sudo apt install -y curl
sudo apt install -y gdal-bin
sudo apt install -y mapnik-utils
sudo apt install -y npm
切换至osm用户,在 openstreetmap-carto-4.20.0
目录下创建 data 文件夹用于存放下载的边界文件
边界文件下载:https://pan.baidu.com/s/1nAqH9g1CHEUV0YwwjYZDVw
提取码:wosp
su - osm
cd openstreetmap-carto-4.20.0
mkdir data
#上传如下边界文件到data目录下并解压
antarctica-icesheet-outlines-3857.zip
antarctica-icesheet-polygons-3857.zip
land-polygons-split-3857.zip
ne_110m_admin_0_boundary_lines_land.zip
simplified-land-polygons-complete-3857.zip
world_boundaries-spherical.tgz
构建 style.xml 样式文件
carto project.mml > style.xml
六、安装 mapnik
安装 mapnik 、TileStrata 及其插件
apt install -y npm
npm install -y carto
npm install -y mapnik
npm install -y tilestrata
npm install -y tilestrata-disk
npm install -y tilestrata-mapnik
七、地图生成
1、安装 Express 框架
Express 框架可以使用国内的 npm 镜像安装,速度会非常快
npm install express --registry=https://registry.npm.taobao.org
创建项目结构:创建 atlas 项目文件夹,并在项目文件夹中创建子文件夹 public 、server
#在项目中创建package.json:
npm init --yes
mkdir -p /home/osm/atlas/public/css
mkdir -p /home/osm/atlas/public/js
mkdir -p /home/osm/atlas/server
2、创建地图前端页面
将 OpenLayers 的 js 和 css 文件上传到对应的文件夹下
js、css 下载地址:https://pan.baidu.com/s/1mZkBbYZmSB1w1yxIqsXkoA
提取码:ijbh
在/home/osm/atlas/public
目录下创建 index.html
文件
<!Doctype html>
<html xmlns=http://www.w3.org/1999/xhtml>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1">
<meta content=always name=referrer>
<title>离线地图</title>
<link href="/css/ol.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/js/ol.js" charset="utf-8"></script>
</head>
<body>
<div id="map" style="width: 100%"></div>
<script>
var tileStrataMapLayer = new ol.layer.Tile({
source: new ol.source.XYZ({
url: 'http://192.168.138.226:8080/t/map/{z}/{x}/{y}/tile.png'
})
});
new ol.Map({
layers: [
tileStrataMapLayer
],
view: new ol.View({
center: [104.06, 30.67],
projection: 'EPSG:4326',
zoom: 14
}),
target: 'map'
});
</script>
</body>
</html>
在/home/osm/atlas/server
目录下创建 server.js
var tilestrata = require('tilestrata');
var disk = require('tilestrata-disk');
var mapnik = require('tilestrata-mapnik');
var express = require('express');
var strata = tilestrata();
var router = express.Router();
//layer名称不能为空
strata.layer('map')
.route('tile.png') //route方法中不能使用正则表达式
.use(disk.cache({dir: './tilecache'})) //设置瓦片缓存在当前目录的tilecache之目录中
.use(mapnik({
pathname: '/home/osm/openstreetmap-carto-4.20.0/style.xml'
}));
router.use(tilestrata.middleware({
server: strata
}));
module.exports = router;
在项目根目录 /home/osm/atlas
下创建 map.js
var express = require('express');
var path = require('path');
var server = require('./server/server.js');
var app = express();
app.use(express.static(path.join(__dirname, 'public')));
app.use('/t', server);
app.get('/', function(req, res){
res.sendfile('./public/index.html');
});
app.listen(8080);
3、启动地图
在浏览器中访问服务 http://localhost:port
node map.js
地图样式如下
4、nodejs 服务后台持续运行三种方法
(1)nodejs 自带 node.js
自带服务 nohub,不需要安装别的包
- 缺点:存在无法查询日志等问题,关闭终端后服务也就关闭了
nohup node map.js &
(2)使用 pm2
工具
pm2 是一个进程管理工具,可以用它来管理你的 node 进程,并查看 node 进程的状态
npm install -g pm2 // -g 全局安装
pm2 start map.js // 启动
pm2 stop map.js // 停止
pm2 stop all // 停止所有
pm2 restart map.js // 重启
pm2 restart all // 重启所有
pm2 delete map.js // 关闭
pm2 start map.js -i max //启动 使用所有CPU核心的集群
(3)使用 forever
工具
forever 是一个 nodejs 守护进程,完全由命令行操控。forever 会监控 nodejs 服务,并在服务挂掉后进行重启。
1、安装 forever
npm install -g forever
2、启动服务
service forever start
3、使用 forever 启动 js 文件
forever start map.js
4、停止 js 文件
forever stop map.js
5、启动js文件并输出日志文件
forever start -l forever.log -o out.log -e err.log map.js
6、重启js文件
forever restart map.js
7、查看正在运行的进程
forever list