Dynami c ограничивающий прямоугольник для Mapbox Geocoder - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь применить ограничение поиска Mapbox Geocoder (Mapbox GL JS) в зависимости от видимых в настоящее время границ карты. Текущий код выдает ошибку при попытках поиска («uncaught exception: Object»):

   map.on('zoom', function() {
    var bounds = map.getBounds();
    geocoder.options.bbox = [bounds.getNorthEast().lng, bounds.getNorthEast().lat, bounds.getSouthWest().lng, bounds.getSouthWest().lat];
   });

Возможно ли это вообще? Если так - как исправить код?

изменить:

Решено. Оказалось, что параметр bbox имеет хитрый порядок (особенно для Великобритании с отрицательными и положительными долготами) от минимальных до максимальных значений вместо порядка LonLatBounds (от NE к SW). Если кому-то интересно - правильно работающий код будет

// notice switch from 'zoom' to 'move'
map.on('move', function() {
    var bounds = map.getBounds();

    var minLon = bounds.getNorthEast().lng;
    var maxLon = bounds.getSouthWest().lng;
    if(minLon > maxLon) {
        maxLon = minLon;
        var minLon = bounds.getSouthWest().lng;
    }
    var minLat = bounds.getNorthEast().lat;
    var maxLat = bounds.getSouthWest().lat;
    if(minLat > maxLat) {
        maxLat = minLat;
        var minLat = bounds.getSouthWest().lat;
    }
    if(minLon >= -180 && maxLon <= 180) geocoder.options.bbox = [minLon, minLat, maxLon, maxLat];
});

отредактировать 2: каким-то образом .flat () из-за неисправности выбранного ответа в MS Edge. Будьте осторожны.

1 Ответ

1 голос
/ 12 января 2020

См. Документацию API https://github.com/mapbox/mapbox-gl-geocoder/blob/master/API.md#setbbox правильный способ вызова

geocoder.setBbox([minX, minY, maxX, maxY]);

map.getBounds().toArray() возвращает [sw, ne], поэтому вы должны иметь возможность:

geocoder.setBbox(map.getBounds().toArray().flat());

geocoder.options не задокументировано в API, поэтому нет гарантий, будет ли он работать или будет работать в новых выпусках.

...