前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ubuntu中安装tippecanoe并切片

ubuntu中安装tippecanoe并切片

作者头像
lzugis
发布2022-12-18 18:26:30
1.4K0
发布2022-12-18 18:26:30
举报

概述

本文是一片”水文”,记录一下如何在ubuntu中用tippecanoe制作矢量切片。

实现操作

本示例中ubuntu是在VMware虚拟机中,安装的是18.04.6的版本,你可通过我兰的镜像下载,速度杠杠的。

1.安装git

代码语言:javascript
复制
sudo apt install git

2.clone代码

代码语言:javascript
复制
git clone https://gitee.com/lzugis15/tippecanoe.git

3. make

代码语言:javascript
复制
sudo apt install make      
sudo apt install make-guile

4. g++

代码语言:javascript
复制
sudo apt install g++

5. 其他

代码语言:javascript
复制
// 解决fatal error:sqlite3.h错误
sudo apt-get install libsqlite3-dev

// 解决fatal error:zlib.h错误
sudo apt-get install zlib1g-dev

6. make & install

代码语言:javascript
复制
make
sudo make install
make
make
install
install

7. 切片

经过上面的步骤,安装工作完成了,下面通过一个简单的示例做个切片并验证一下。

代码语言:javascript
复制
tippecanoe -zg -Z2 -o province.mbtiles --coalesce-densest-as-needed --extend-zooms-if-still-dropping province.geojson
image.png
image.png

说明

  1. -zg,最大级别,如果为g,则表示自动计算;
  2. -Z2,最小级别;
  3. -o,指定输出文件名;
  4. 更多详细配置请参阅源代码说明。

8.验证

用node写一个mbtile服务器加以验证。

代码语言:javascript
复制
// 初始化工程
npm init -y
// 添加依赖
npm i @mapbox/mbtiles express -S

新建一个service.js,代码如下:

代码语言:javascript
复制
const express = require("express"), MBTiles = require('@mapbox/mbtiles');

const app = express()

// 自定义跨域中间件
const allowCors = function (req, res, next) {
  res.header('Access-Control-Allow-Origin', req.headers.origin);
  res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  res.header('Access-Control-Allow-Credentials', 'true');
  next();
};
app.use(allowCors);//使用跨域中间件

const port = 13000;
const mbtilesLocation = 'D:\\tile\\vector\\province.mbtiles';

/* Set return header*/
function getContentType(t) {
  let header = {};
  /* Cache*/
  if (t === "json") {
    header["Content-Type"] = "application/json";
    header["Cache-Control"] = "public, max-age=3600";
  }
  /* request specific headers*/
  if (t === "png") {
    header["Content-Type"] = "image/png";
    header["Cache-Control"] = "public, max-age=604800";
  }
  if (t === "jpg") {
    header["Content-Type"] = "image/jpeg";
    header["Cache-Control"] = "public, max-age=604800";
  }
  if (t === "pbf") {
    header["Content-Type"] = "application/octet-stream";
    header["Content-Encoding"] = "gzip";
    header["Cache-Control"] = "public, max-age=604800";
  }

  return header;
}

new MBTiles(mbtilesLocation, function (err, mbtiles) {
  if (err) throw err;
  app.get('/:z/:x/:y.*', function (req, res) {
    const { params } = req
    const { x, y, z } = params
    const extension = params['0']
    res.set(getContentType(extension))
    mbtiles.getTile(z, x, y, function (err, tile, headers) {
      if (err) {
        res.status(404).send('Tile rendering error: ' + err + '\n')
      } else {
        res.send(tile);
      }
    });
  });
});

// actually create the server
app.listen(port, () => {
  console.log(`server started, visit http://localhost:${[port]}`)
});

新建一个map.html,代码如下:

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
    <title>Mapbox GL</title>
    <meta charset='utf-8'>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <link rel="stylesheet" href="lib/mapbox-gl.css" type="text/css">
    <style>
        body { margin: 0; padding: 0; }
        html, body, #map { height: 100%; overflow: hidden }
    </style>
</head>

<body>
<div id='map'></div>
<script src="./lib/mapbox-gl.js"></script>
<script>
    const style = {
        "version": 8,
        "name": "Mapbox Streets",
        "sources": {
            "amap-tile": {
                "type": "raster",
                "scheme": "xyz",
                "tiles": [
                    'http://webrd01.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8',
                    'http://webrd02.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8',
                    'http://webrd03.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8',
                    'http://webrd04.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8',
                ],
                "tileSize": 256
            }
        },
        "layers": [
            {
                "id": "amap-tile",
                "type": "raster",
                "source": "amap-tile",
                "minzoom": 0,
                "maxzoom": 17
            }
        ]
    }
    var map = new mapboxgl.Map({
        container: 'map',
        style: style,
        center: [107.11040599933166, 34.26271532332011],
        zoom: 3
    });

    map.on('load', () => {
        map.addSource('geoserver-tile', {
            "type": "vector",
            "scheme": "xyz",
            "tiles": [
                'http://localhost:13000/{z}/{x}/{y}.pbf'
                // 'http://localhost:63344/sfmap/tile/china/{z}/{x}/{y}.pbf'
            ]
        })
        map.addLayer({
            id: 'geoserver-tile-line',
            type: 'line',
            source: 'geoserver-tile',
            // 'source-layer': 'layer_province',
            'source-layer': 'province',
            paint: {
                'line-color': '#f00',
                'line-width': 1,
                'line-opacity': 1
            }
        })
        map.addLayer({
            id: 'geoserver-tile-line1',
            type: 'fill',
            source: 'geoserver-tile',
            // 'source-layer': 'layer_province',
            'source-layer': 'city_gd',
            paint: {
                'fill-color': '#3c80f6',
                'fill-opacity': 0.2
            }
        })
    })
</script>
</body>
</html>

代码请移步:https://gitee.com/lzugis15/mbtiles-server.git

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 实现操作
    • 1.安装git
      • 2.clone代码
        • 3. make
          • 4. g++
            • 5. 其他
              • 6. make & install
                • 7. 切片
                  • 8.验证
                  相关产品与服务
                  消息队列 TDMQ
                  消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
                  http://www.vxiaotou.com