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

时间:2018-05-29 14:43:52

标签: 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
        }
    }); 

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

"coordinates": [
[ response.mapPoints[i].lng, response.mapPoints[i].lat ],
[ response.mapPoints[i+1].lng, response.mapPoints[i+1].lat ]
]

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

我是否在正确的轨道上?任何对类似例子的帮助或指示都将不胜感激!

1 个答案:

答案 0 :(得分:0)

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

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

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

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":{...},
    });

});