首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于MapboxGL客户端的自托管向量块呈现错误

用于MapboxGL客户端的自托管向量块呈现错误
EN

Stack Overflow用户
提问于 2016-02-26 05:28:08
回答 1查看 1.1K关注 0票数 4

我试图在Node.js中设置一个web服务器,该服务器使用MapboxGL JS在浏览器中提供要显示的向量块。向量块的数据存储在PostGIS数据库中。

我当前的设置似乎是朝着正确的方向发展,因为我可以看到向量块正在加载并显示在浏览器中。然而,呈现的结果是不正确的(这是我的地图的一个部分的屏幕截图):

绿色建筑脚印的上半部分在图像的下半部重复。我也注意到建筑物“改变”的位置时,放大和输出,表明瓷砖以某种方式呈现偏移或一个不正确的程度.导入的数据在SRID 4326中。

这是我的代码:

代码语言:javascript
复制
var zlib = require('zlib');

var express = require('express');
var mapnik = require('mapnik');
var Promise = require('promise');
var SphericalMercator = require('sphericalmercator');

var mercator = new SphericalMercator({
    size: 256 //tile size
});

mapnik.register_default_input_plugins();

var app = express();

app.get('/vector-tiles/:layerName/:z/:x/:y.pbf', function(req, res) {
    var options = {
        x: parseInt(req.params.x),
        y: parseInt(req.params.y),
        z: parseInt(req.params.z),
        layerName: req.params.layerName
    };
    makeVectorTile(options).then(function(vectorTile) {
        zlib.deflate(vectorTile, function(err, data) {
            if (err) return res.status(500).send(err.message);
            res.setHeader('Content-Encoding', 'deflate');
            res.setHeader('Content-Type', 'application/x-protobuf');
            res.send(data);
        });
    });
});

function makeVectorTile(options) {
    var extent = mercator.bbox(options.x, options.y, options.z, false, '4326');

    var map = new mapnik.Map(256, 256);
    map.extent = extent;

    var layer = new mapnik.Layer(options.layerName);
    layer.datasource = new mapnik.Datasource({
        type: 'postgis',
        dbname: 'databasename',
        table: options.layerName,
        user: 'username',
        password: 'password'
    });
    layer.styles = ['default'];
    map.add_layer(layer);
    return new Promise(function (resolve, reject) {
        var vtile = new mapnik.VectorTile(parseInt(options.z), parseInt(options.x), parseInt(options.y));
        map.render(vtile, function (err, vtile) {
            if (err) return reject(err);
            resolve(vtile.getData());
        });
    });
}

自定义向量数据源包括在地图中,如下所示:

代码语言:javascript
复制
var map = new mapboxgl.Map({
    container: 'map',
    style: 'mapbox://styles/mapbox/light-v8',
    zoom: 10,
    center: [13.739910, 51.051151]
});

map.on('style.load', function () {
    map.addSource('local', {
        type: 'vector',
        tiles: ["http://localhost:3333/vector-tiles/building/{z}/{x}/{y}.pbf"]
    });
    map.addLayer({
        "id": "park",
        "source": "local",
        "type": "fill",
        "source-layer": "building",
        "paint": {
            "fill-color": "#5DC73A"
        }
    });
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-01 06:51:32

上述示例代码中的地图使用了不正确的空间参考系统。向量tiles使用Web Mercator投影,但是mapnik是在WGS84中初始化的。当向mercator.bbox方法和mapnik.Map构造函数显式提供constructor时,向量块在客户端中呈现正确:

代码语言:javascript
复制
var extent = mercator.bbox(options.x, options.y, options.z, false, '3857');

var map = new mapnik.Map(256, 256, '+init=epsg:3857');
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35644168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档