无法从 Mapbox 获取 Mt.Everest RGB 瓦片数据(未找到)
Cannot get Mt.Everest RGB Tile Data from Mapbox (Not Found)
我一直在寻找重新开始 JS Everest Flight Sim 的工作。最初我曾尝试使用 DEM 高程数据创建自己的高程网格和图块并将其映射到顶点 Z 轴。
我决定将 Mapbox RGB 瓦片用于高程数据是一种更好的方法。不幸的是,我似乎无法让它工作。奥马哈内布拉斯加州文档示例有效,但现在是珠穆朗玛峰磁贴。
我也在这里提出了这个问题:https://github.com/mapbox/sphericalmercator/issues/43
也许 Mapbox 的人可以给我一些见解:)
import fs from "fs";
import dotenv from "dotenv";
import fetch from "node-fetch";
import SphericalMercator from "@mapbox/sphericalmercator";
dotenv.config();
const queryMapbox = async () => {
const merc = new SphericalMercator({
size: 256,
});
const xyFromLatLong = (lat, long, merc) => {
return merc.forward([long, lat]);
};
const zoom = 14;
const long = 86.922623;
const lat = 27.986065;
const xyPos = xyFromLatLong(lat, long, merc);
console.log({ xyPos });
try {
// Example from Docs - Omaha, Nebraska
// const response = await fetch(
// `https://api.mapbox.com/v4/mapbox.terrain-rgb/14/12558/6127.pngraw?access_token=${process.env.ACCESS_TOKEN}`
// );
// const filename = "omaha-rgb.png"
const response = await fetch(
`https://api.mapbox.com/v4/mapbox.terrain-rgb/${zoom}/${xyPos[0].toFixed(0)}/${xyPos[1].toFixed(0)}.pngraw?access_token=${process.env.ACCESS_TOKEN}`
);
const filename = "everest-rgb.png"
await new Promise((resolve, reject) => {
const fileStream = fs.createWriteStream(`./data/${filename}`);
response.body.pipe(fileStream);
response.body.on("error", (err) => {
reject(err);
});
fileStream.on("finish", function () {
resolve();
});
});
console.log({ response });
// console.log({ res });
} catch (err) {
console.error(err);
}
};
queryMapbox(); // Test
我认为您使用了错误的库将 lon、lat 转换为 tile x、y。 The documentation 提到了一些库,包括这个:
tilebelt: a set of JavaScript utilities for requesting and working with tiles.
示例:
const tilebelt = require("@mapbox/tilebelt");
console.log(tilebelt.pointToTile(86.922623, 27.986065, 14));
// Output:
// [ 12147, 6864, 14 ]
有了这些 x 和 y,URL 将是这样的:
https://api.mapbox.com/v4/mapbox.terrain-rgb/14/12147/6864.pngraw?access_token=YOUR_MAPBOX_ACCESS_TOKEN
我一直在寻找重新开始 JS Everest Flight Sim 的工作。最初我曾尝试使用 DEM 高程数据创建自己的高程网格和图块并将其映射到顶点 Z 轴。
我决定将 Mapbox RGB 瓦片用于高程数据是一种更好的方法。不幸的是,我似乎无法让它工作。奥马哈内布拉斯加州文档示例有效,但现在是珠穆朗玛峰磁贴。
我也在这里提出了这个问题:https://github.com/mapbox/sphericalmercator/issues/43 也许 Mapbox 的人可以给我一些见解:)
import fs from "fs";
import dotenv from "dotenv";
import fetch from "node-fetch";
import SphericalMercator from "@mapbox/sphericalmercator";
dotenv.config();
const queryMapbox = async () => {
const merc = new SphericalMercator({
size: 256,
});
const xyFromLatLong = (lat, long, merc) => {
return merc.forward([long, lat]);
};
const zoom = 14;
const long = 86.922623;
const lat = 27.986065;
const xyPos = xyFromLatLong(lat, long, merc);
console.log({ xyPos });
try {
// Example from Docs - Omaha, Nebraska
// const response = await fetch(
// `https://api.mapbox.com/v4/mapbox.terrain-rgb/14/12558/6127.pngraw?access_token=${process.env.ACCESS_TOKEN}`
// );
// const filename = "omaha-rgb.png"
const response = await fetch(
`https://api.mapbox.com/v4/mapbox.terrain-rgb/${zoom}/${xyPos[0].toFixed(0)}/${xyPos[1].toFixed(0)}.pngraw?access_token=${process.env.ACCESS_TOKEN}`
);
const filename = "everest-rgb.png"
await new Promise((resolve, reject) => {
const fileStream = fs.createWriteStream(`./data/${filename}`);
response.body.pipe(fileStream);
response.body.on("error", (err) => {
reject(err);
});
fileStream.on("finish", function () {
resolve();
});
});
console.log({ response });
// console.log({ res });
} catch (err) {
console.error(err);
}
};
queryMapbox(); // Test
我认为您使用了错误的库将 lon、lat 转换为 tile x、y。 The documentation 提到了一些库,包括这个:
tilebelt: a set of JavaScript utilities for requesting and working with tiles.
示例:
const tilebelt = require("@mapbox/tilebelt");
console.log(tilebelt.pointToTile(86.922623, 27.986065, 14));
// Output:
// [ 12147, 6864, 14 ]
有了这些 x 和 y,URL 将是这样的:
https://api.mapbox.com/v4/mapbox.terrain-rgb/14/12147/6864.pngraw?access_token=YOUR_MAPBOX_ACCESS_TOKEN