我有一个带有多个标记的应用,用于显示旅行。每个标记都是一个步骤,我想在每个标记之间创建一条路径,跟随标记(下一步)。
为此,我现在有了这段代码:
$(document).ready(function() {
var map;
var directions;
// token access for MAPBOX GL
mapboxgl.accessToken = 'pk.eyJ1IjoiYW50b3RvIiwiYSI6ImNpdm15YmNwNTAwMDUyb3FwbzlzeWluZHcifQ.r44fcNU5pnX3-mYYM495Fw';
// generate map
var map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v10',
center: [-96, 37.8],
zoom: 5
});
// center map on selected marker
map.on('click', 'markers', function (e) {
map.flyTo({center: e.features[0].geometry.coordinates});
});
// change mouse action on enter / leave in marker
map.on('mouseenter', 'markers', function () {
map.getCanvas().style.cursor = 'pointer';
});
map.on('mouseleave', 'markers', function () {
map.getCanvas().style.cursor = '';
});
$.ajax({
dataType: 'json',
url: grabTravelData(),
success: function(data) {
geojson = data;
map.addSource("markers", {
"type": "geojson",
"data": {
"type": "FeatureCollection",
"features": data
}
});
map.addLayer({
"id": "markers",
"type": "circle",
"source": "markers",
"paint": {
"circle-radius": 7,
"circle-color": "#ff7e5f"
},
});
// center map on markers
var bounds = new mapboxgl.LngLatBounds();
data.forEach(function(feature) {
bounds.extend(feature.geometry.coordinates);
});
map.fitBounds(bounds);
for(var i = 0; i < data.length; i++) {
var last = data.length - 1
var from = data[i];
var to = data[i + 1];
if(i != last) {
apiCall(from.geometry.coordinates[0], from.geometry.coordinates[1], to.geometry.coordinates[0], to.geometry.coordinates[1], mapboxgl.accessToken, i);
} else {
apiCall(from.geometry.coordinates[0], from.geometry.coordinates[1], from.geometry.coordinates[0], from.geometry.coordinates[1], mapboxgl.accessToken, i);
}
}
}, error: function(data) {
console.log(data + ' error');
}
});
function apiCall(from_one, from_two, to_one, to_two, token, number) {
$.get("https://api.mapbox.com/directions/v5/mapbox/driving/" + from_one + "," + from_two + ";" + to_one + "," + to_two + "?access_token=" + token, function(data) {
var naming = "route-" + number;
map.on('load', function () {
map.addSource(naming, {
"type": "geojson",
"data": {
"type": "Feature",
"properties": {},
"geometry": {
"type": "LineString",
"coordinates": data.routes[0].geometry
}
}
});
map.addLayer({
"id": naming,
"type": "line",
"source": naming,
"layout": {
"line-join": "round",
"line-cap": "round"
},
"paint": {
"line-color": "#ff7e5f",
"line-width": 8
}
});
});
}
}
但是这些路线没有出现在地图上,我在这一行上阅读了API文档://这个API不能通过JavaScript SDK获得
所以也许我不能调用API。 使用此代码,我有一个很好的结果:
结果是带有几何的json ......所以在文档中写的结果很好。
也许有人知道我应该如何在地图上显示路线?如果我无法使用API调用,我应该如何修改代码以使用Directions Plugin?
答案 0 :(得分:5)
您的问题是directions API默认返回以折线编码的几何图形,这些几何图形不是geojson要素。
要解决这个问题,您可以为您的网址指定&geometries=geojson
查询参数,它会以正确的格式返回您可以轻松显示的数据。
另外一件事,在地图完成加载后,我似乎更好地做你的ajax。
// This is the token from their docs, don't be evil
mapboxgl.accessToken = 'pk.eyJ1IjoiYXBlcmN1IiwiYSI6ImNpZ3M0ZDZ2OTAwNzl2bmt1M2I0dW1keTIifQ.I5BD9uEHdm_91TiyBEk7Pw'
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v9',
center: [18.0944238, 42.65066059999999],
zoom: 9,
})
map.on('load', () => {
$.get(`https://api.mapbox.com/directions/v5/mapbox/driving/18.0944238,42.65066059999999;15.981919,45.8150108?access_token=${mapboxgl.accessToken}&geometries=geojson`, data => {
map.addLayer({
id: 'route',
type: 'line',
source: {
type: 'geojson',
data: {
type: 'Feature',
properties: {},
geometry: data.routes[0].geometry,
},
},
layout: {
'line-join': 'round',
'line-cap': 'round',
},
paint: {
'line-color': '#ff7e5f',
'line-width': 8,
},
})
})
})
html, body, #map {
height: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://api.tiles.mapbox.com/mapbox-gl-js/v0.37.0/mapbox-gl.js"></script>
<link href="https://api.tiles.mapbox.com/mapbox-gl-js/v0.37.0/mapbox-gl.css" rel="stylesheet"/>
<body>
<div id='map'></div>
</body>