使用数组中的坐标在 mapbox-gl 中绘制一条线?

Joe*_*oey 3 mapbox-gl-js

我正在尝试使用 api 请求中的坐标在 mapbox 上画一条线。API 调用检索地图点纬度和经度值的数组。我曾尝试使用此网站上的示例创建 geojson 线: https: //www.mapbox.com/mapbox-gl-js/example/geojson-line/但是这个示例和我发现的每个其他示例仅显示添加图层到包含硬编码坐标的地图,而不是稍后从另一个源检索的坐标。

我最初认为可行的只是以适当的格式创建一个纬度/经度数组,然后在添加图层时将该数组等于坐标,如下所示:

    var lineArray = [];
    for(var i = 0; i < response.mapPoints.length; i++)
    {
        lineArray[i] = " [" + response.mapPoints[i].lng + ", " + response.mapPoints[i].lat + "]";
    }
    map.addLayer({
        "id": "route",
        "type": "line",
        "source": {
            "type": "geojson",
            "data": {
                "type": "Feature",
                "properties": {},
                "geometry": {
                    "type": "LineString",
                    "coordinates": [
                        lineArray
                    ]
                }
            }
        },
        "layout": {
            "line-join": "round",
            "line-cap": "round"
        },
        "paint": {
            "line-color": "#888",
            "line-width": 8
        }
    }); 
Run Code Online (Sandbox Code Playgroud)

打印出来后,lineArray 看起来是正确的。我能够使用 for 循环创建一条小线,并将添加层代码更改为如下所示:

"coordinates": [
[ response.mapPoints[i].lng, response.mapPoints[i].lat ],
[ response.mapPoints[i+1].lng, response.mapPoints[i+1].lat ]
]
Run Code Online (Sandbox Code Playgroud)

然而,这花了太长时间,因为我一次使用数千个坐标,并且必须循环遍历每个坐标才能画线。

我走在正确的轨道上吗?任何对类似示例的帮助或指导将不胜感激!

pat*_*per 5

您可以使用Turf.js从位置数组创建 LineString 要素 ( http://turfjs.org/docs/#lineString ),并使用此 LineString 作为线图层的源:

示例(基于https://www.mapbox.com/mapbox-gl-js/example/geojson-line/):

http://jsbin.com/beziyolisu/1/edit?html,输出

var positions =[
                [lon_1, lat_1],
                ...
                [lon_n, lat_n]
               ]; 

var linestring = turf.lineString(positions);

map.on('load', function () {

    map.addLayer({
        "id": "route",
        "type": "line",
        "source": {
            "type": "geojson",
            "data": linestring
        },
        "layout": {...},
        "paint":{...},
    });

});
Run Code Online (Sandbox Code Playgroud)