读取mapbox中的GPX文件或第三方URL以添加行

Ama*_*rma 1 javascript mapbox mapbox-gl

我是 Mapbox 的新手。

我想知道如何在 Javascript 中读取 gpx 文件数据。

我从 mapbox 文档中获得了两个链接。

一个是这个 =>

我想要像这个例子一样的结果。如何在此示例中使用我的 gpx 文件?

https://docs.mapbox.com/mapbox-gl-js/example/geojson-line/

& 其一是 =>

我可以在以下示例中将 mvt URL 替换为我的 gpx URL 吗?当我这样做时,它会抛出一些错误message: "Unimplemented type: 4"

我的目标是使用 Javascript 在 Mapbox 上加载 gpx 文件数据。

谢谢

https://docs.mapbox.com/mapbox-gl-js/example/third-party/

tyl*_*ben 5

使用 Mapbox 将 GPX 文件显示在地图上时,我会想到两个选项。这是一个很长的回复,但我想提供一个详细的回复,因为我去年也曾遇到过同样的问题。

选项1

这是最简单的,并且不提供任何编码。如果您只想转换单个 GPX 文件并在地图上显示,您可以使用 Mapbox Studio 来完成这一切。

只需将 GPX 作为图块集上传到 Mapbox Studio ( https://studio.mapbox.com/tilesets/ )。Mapbox 将为您进行必要的转换。上传图块集后,您可以轻松将其添加到 Mapbox 样式 ( https://studio.mapbox.com/ ) 或使用 Mapbox GL JS 添加到地图。

我写的这两篇指南可能会提供一些额外的帮助

选项2

如果添加此 GPX 文件不是一次性任务,并且您需要一遍又一遍地执行此操作,则选项 2 可能是您的最佳选择。此方法涉及您自己进行 GPX 到 GeoJSON 的转换,然后直接使用结果。转换数据后,您可以将结果写入文件,以编程方式或手动将它们上传到 Tilesets(请参阅选项 1),甚至将 GeoJSON 作为 API 响应返回。

我同意莫里茨与图书馆合作的建议togeojson。唯一的额外建议是使用togeojsontmcw 的分支(https://github.com/tmcw/togeojson)。Mapbox 版本不再主动维护。如果您对 GeoJSON 不太熟悉,请查看https://geojson.org/上的规范。我也喜欢这个资源管理器,它允许您向地图添加不同的要素类型(即多边形、线、点等)并查看生成的 GeoJSON 输出。

第 1 步 - 将 GPX 转换为 GeoJSON

const converter = require("@tmcw/togeojson")
const fs = require("fs")
const DOMParser = require("xmldom").DOMParser
const mapboxgl = require("mapbox-gl")

// read in our GPX file and then parse it
const parsedGPX = new DOMParser().parseFromString(
  fs.readFileSync("<PATH_TO_GPX>", "utf8")
)

// convert our gpx to geojson and store the results
const geojson = converter.gpx(parsedGPX)

// do something with the output
// i.e. save the file locally
// upload it to the Mapbox tilesets API, etc
Run Code Online (Sandbox Code Playgroud)

第 2 步 - 显示空间数据

现在您已经有了一些有效的 GeoJSON,您可以显示它了。这是一些伪代码,说明了如何做到这一点。

import mapboxgl from "mapbox-gl"

// this is pseudo code but you could now do something with the geojson like
mapboxgl.accessToken = <YOUR_ACCESS_TOKEN>

const map = new mapboxgl.Map({
  container: "map,
  style: "mapbox://styles/mapbox/streets-v11",
  center: [-87.903982, 43.020403],
  zoom: 12,
})

map.on("load", () => {

  map.addSource("running-routes", {
    type: "geojson",
    // a reference to the converted data
    // could come from a file, API, etc
    data: RunningRoute,
  });

  map.addLayer({
    id: "running-routes-line",
    type: "line",
    source: "running-routes",
    paint: {
      "line-color": "#15cc09",
      "line-width": 4,
    },
  })
})

Run Code Online (Sandbox Code Playgroud)

我写的这两个指南也可能提供一些额外的帮助。