添加新的属性值到矢量贴图层功能



我使用@mapbox/vector-tile从.mbtiles文件中读取VectorTiles。现在,对于贴图层的特性,我需要添加一个新的属性值。目前我有,例如,id: 123, name: "abc"在我的属性中,我想添加年龄:"33"。我能读取属性,但不能添加新属性。这是我的代码:

const express = require("express");
const path = require("path");
const vtpbf = require('vt-pbf')
const MBTiles = require('@mapbox/mbtiles');
const { VectorTile } = require('@mapbox/vector-tile');
const Pbf = require('pbf');
const app = new express();
app.get('/tiles/:z/:x/:y.vector.pbf', async (req, res) => {
let { z, x, y } = req.params;
new MBTiles(path.join(__dirname, `shapes_uf.mbtiles`) + "?mode=ro", function(err, mbtiles) {
mbtiles.getInfo(function(err, info) {
const layerName = info.vector_layers[0].id;
if (err) {
return res.status(400).send(`Make sure ${path.basename(fileName)} is valid MBTiles.`)
}
mbtiles.getTile(z, x, y, function (err, data, headers) {
if (err) {
return res.status(404).send(err.message)
} else {
const tile = new VectorTile(new Pbf(data))
const featureLength = tile.layers[layerName].length;
for (let x = 0; x < featureLength; x += 1) {
console.log("current properties: ", tile.layers[layerName].feature(x).properties)
tile.layers[layerName].feature(x).properties["age"] = "33";
// nothing changed here!
}
res
.setHeader(
'Content-Type',
'application/x-protobuf'
)
.status(200).send(data)
}
});
});
})
})
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log("Server listening on ", port);
});

谢谢!

我找到了一个使用@mapbox/tile-decorator包的解决方案,如下所示:

const express = require("express");
const path = require("path");
const MBTiles = require('@mapbox/mbtiles');
const { updateLayerProperties, read, write } = require('@mapbox/tile-decorator')
function toBuffer(arrayBuffer) {
const buffer = Buffer.alloc(arrayBuffer.byteLength);
const view = new Uint8Array(arrayBuffer);
for (let i = 0; i < buffer.length; ++i) {
buffer[i] = view[i];
}
return buffer;
}
const app = new express();
app.get('/tiles/:z/:x/:y.vector.pbf', async (req, res) => {
let { z, x, y } = req.params;
let tileSource = "shapes_uf";
if (z > 7) {
tileSource = "municipios_br";
}
new MBTiles(path.join(__dirname, `${tileSource}.mbtiles`) + "?mode=ro", function(err, mbtiles) {
if (err) {
console.log("Error loading tiles: ", err.message)
}
mbtiles.getTile(z, x, y, function (err, data, headers) {
console.log(data)
if (err) {
// console.log("err: ", err)
return res.status(404).send(err.message)
} else {
const tile = read(data);
for (let x = 0; x < tile.layers.length; x += 1) {
const newData = []
for (let x = 0; x < tile.layers[x].values.length; x += 1) {
newData.push({ age: "33"})
}
updateLayerProperties(tile.layers[x], newData)
}
const resp = write(tile)
res
.setHeader(
'Content-Type',
'application/x-protobuf'
)
.status(200).send(toBuffer(resp))
}
});
});
})
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log("Server listening on ", port);
});

最新更新