Анимируйте иконку с помощью серьезного массива Lat / lon - Mapbox js - PullRequest
0 голосов
/ 12 декабря 2018

Я изменяю приведенный ниже скрипт, чтобы посмотреть, как я могу переместить иконку, следуя массиву лат / долгота, но он всегда говорит об ошибке, но я предоставляю как массив

Может ли кто-нибудь помочь мне, пожалуйстачтобы понять что я делаю не так?Я переворачиваю этот пример https://www.mapbox.com/mapbox-gl-js/example/animate-marker/

Error : 
lng_lat.js:121 Uncaught Error: `LngLatLike` argument must be specified as a LngLat instance, an object {lng: <lng>, lat: <lat>}, an object {lon: <lng>, lat: <lat>}, or an array of [<lng>, <lat>]
    at Function.yu.convert (lng_lat.js:121)
    at o.setLngLat (marker.js:251)
    at animateMarker (animate.html:33) 

Модифицированный код: -

<html>
<head>
    <meta charset='utf-8' />
    <title>Animate a marker</title>
    <meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
    <script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.51.0/mapbox-gl.js'></script>
    <link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.51.0/mapbox-gl.css' rel='stylesheet' />
    <style>
        body { margin:0; padding:0; }
        #map { position:absolute; top:0; bottom:0; width:100%; }
    </style>
</head>
<body>

<div id='map'></div>
<script>
mapboxgl.accessToken = '';
var map = new mapboxgl.Map({
    container: 'map',
    style: 'mapbox://styles/mapbox/streets-v9',
    center: [90.35388165034988, 23.725173272533567],
    zoom: 10
});

var marker = new mapboxgl.Marker();

function animateMarker() {
    var radius = 20;

    // Update the data to a new position based on the animation timestamp. The
    // divisor in the expression `timestamp / 1000` controls the animation speed.
    marker.setLngLat([
	
 [90.35388165034988, 23.725173272533567],
 [90.37379437008741, 23.732873570085644] ,
 [90.38563900508132, 23.72297310398119],
 [90.35388165034988, 23.725173272533567],
 [90.35388165034988, 23.725173272533567]
	 
    ]);

    // Ensure it's added to the map. This is safe to call if it's already added.
    marker.addTo(map);

    // Request the next frame of the animation.
    requestAnimationFrame(animateMarker);
}

// Start the animation.
requestAnimationFrame(animateMarker);
</script>

</body>
</html>

1 Ответ

0 голосов
/ 12 декабря 2018

Вы можете передать только одну координату setLngLat.Вы не можете передать массив.Вот грубый пример, где внутри функции анимации мы используем время, чтобы выбрать позицию из массива точек и передать эту одну позицию маркеру.

var controlPoints = [
 [90.35388165034988, 23.725173272533567],
 [90.37379437008741, 23.732873570085644] ,
 [90.38563900508132, 23.72297310398119],
 [90.35388165034988, 23.725173272533567],
 [90.35388165034988, 23.725173272533567]
];

function animateMarker(timestamp) {
    // stay at each point for 1 second, then move to the next
    // (lower 1000 to 500 to move 2x as fast)
    var position = Math.floor(timestamp / 1000) % controlPoints.length;
    marker.setLngLat(controlPoints[position])

    // Ensure it's added to the map. This is safe to call if it's already added.
    marker.addTo(map);

    // Request the next frame of the animation.
    requestAnimationFrame(animateMarker);
}

Эта анимация будетсырой.В идеале вы должны взять эти контрольные точки и создать полилинию или линейное кольцо, тогда ваша анимационная функция будет интерполировать вдоль полилинии с заданной скоростью (например, 30 км / с).В итоге вы получите очень хорошую анимацию, которая будет следовать по пути контрольных точек.

...