Map.On / Map.off MapboxGL JS - PullRequest
       15

Map.On / Map.off MapboxGL JS

0 голосов
/ 01 июня 2018

Я работаю над картой с Mapbox GL JS, и у меня есть некоторые функции.Я положил их в разные кнопки.У меня есть одна кнопка, которая используется для определения расстояния между двумя точками

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

Как я могу остановить ее?

Я вызываю свою функцию с addEventListenerКажется, что он запускается только тогда, когда он запускает функциональность, а не тогда, когда мне приходится его останавливать.Вот код:

var Dist = document.getElementById('tt');
Dist.addEventListener('click', mesure)

function mesure() {

var distanceContainer = document.getElementById('distance');

// GeoJSON object to hold our measurement features
var geojson = {
    "type": "FeatureCollection",
    "features": []
};

// Used to draw a line between points
var linestring = {
    "type": "Feature",
    "geometry": {
        "type": "LineString",
        "coordinates": []
    }
};


map.addSource('geojson', {
    "type": "geojson",
    "data": geojson
});

// Add styles to the map
map.addLayer({
    id: 'measure-points',
    type: 'circle',
    source: 'geojson',
    paint: {
        'circle-radius': 5,
        'circle-color': '#000'
    },
    filter: ['in', '$type', 'Point']
});
map.addLayer({
    id: 'measure-lines',
    type: 'line',
    source: 'geojson',
    layout: {
        'line-cap': 'round',
        'line-join': 'round'
    },
    paint: {
        'line-color': '#000',
        'line-width': 2.5
    },
    filter: ['in', '$type', 'LineString']
});




map.on('click', function (e) {
    var features = map.queryRenderedFeatures(e.point, { layers: ['measure-points'] });

    // Remove the linestring from the group
    // So we can redraw it based on the points collection
    if (geojson.features.length > 1) geojson.features.pop();

    // Clear the Distance container to populate it with a new value
    distanceContainer.innerHTML = '';

    // If a feature was clicked, remove it from the map
    if (features.length) {
        var id = features[0].properties.id;
        geojson.features = geojson.features.filter(function (point) {
            return point.properties.id !== id;
        });
    } else {
        var point = {
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [
                    e.lngLat.lng,
                    e.lngLat.lat
                ]
            },
            "properties": {
                "id": String(new Date().getTime())
            }
        };

        geojson.features.push(point);
    }

    if (geojson.features.length > 1) {
        linestring.geometry.coordinates = geojson.features.map(function (point) {
            return point.geometry.coordinates;
        });

        geojson.features.push(linestring);

        // Populate the distanceContainer with total distance
        var value = document.createElement('pre');
        value.textContent = 'Total distance: ' + turf.lineDistance(linestring).toLocaleString() + 'km';
        distanceContainer.appendChild(value);
    }

    map.getSource('geojson').setData(geojson);
});

};

Спасибо за вашу помощь

...