基于 Mapnik 的地图服务器

一、简介

该地图服务器是基于优麒麟系统的安装部署!!!

优麒麟设置 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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值