Листовка getBounds() возвращает долготы больше 180

Я предложил проблему, и автор закрыл ее на Github, но я по-прежнему не имел никакого вывода. Длины колеблются от -180 до 180. Но иногда Лифлет возвращает долготы, например 474.2578215, из getBounds(), которые, конечно, ничто не возвращается в моей базе данных.

Мне сказали: это предполагало поведение. Это происходит, когда вы увеличиваете масштаб слишком далеко и/или перетаскиваете карту на другие копии мира, а longBounds долготы не обертываются по умолчанию. Вы можете использовать метод обвязки LatLng, чтобы получить то, что вы хотите - например. bounds.getSouthWest(). завернуть().

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

Я не уверен, что изменение масштаба или перетаскивание является причиной проблемы. Проблема сохраняется при обновлении страницы, когда пользователь не выполняет масштабирование или перетаскивание событий. У меня есть зум ограничен в init с помощью: minZoom: 6, maxZoom: 13.

Я также должен отметить, что этот код (неизменный) использовался для работы просто отлично. Вот мой код:

    $(document).ready(function(){ initmap(); });

var map;
var plotlist;
var plotlayers=[];

function initmap(){
    // set up the map
    map = new L.Map('map');

    //get our map
    var osmUrl='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
    var osmAttrib='&copy; <a href = "http://www.openstreetmap.org/copyright">  OpenStreetMap </a> contributors';
    var osm = new L.TileLayer(osmUrl, {minZoom: 6, maxZoom: 13, 
             attribution: osmAttrib});      

    map.setView(new L.LatLng(<?=$slat;?>, <?=$slng;?>),9);
    map.attributionControl.setPrefix('');
    map.addLayer(osm);
    getGameMarkers();
    map.on('moveend', onMapMove);
}

   function onMapMove(e){
      getGameMarkers();
   }

 function getGameMarkers(){
     var center = map.getCenter();
     var zoo = map.getZoom();
     var bounds = map.getBounds();
     console.log(bounds);

       var min = bounds.getSouthWest().wrap();
   var max = bounds.getNorthEast().wrap();

   $.ajax({type: "GET", url: "./ajax/markers.php", dataType: "json", data: "clat="+center.lat+"&clng="+center.lng+"&zoom="+zoo+"&minlat="+min.lat+"&minlng="+min.lng+"&maxlat="+max.lat+"&maxlng="+max.lng+cookiestr, 
    success: function(data){
         if (data.showmap == 1) {
           plotlist = data.map_data;    
           removeMarkers();
           for (i=0;i<plotlist.length;i++) {
                var iconic = String(plotlist[i].icon);
                var plotmark = new  L.marker([plotlist[i].lat,plotlist[i].lng], {icon: L.icon({iconUrl: iconic, iconSize: [32, 32]}) }).bindPopup(plotlist[i].html);
                map.addLayer(plotmark);
                plotlayers.push(plotmark);
            }

           $("#content").html(data.html);
        }else {
          $("#map_content").show(); 
          $("#map_content").html(data.main_content);
          $("#content").html(data.side_content);
        }
        } 
      });
  }

Функции wrap() дают правильные координаты, и DB возвращает правильные графики. Но по какой-то причине они не отображаются. Ниже приведены возвращаемые участки (часть map_data):

map_data: [{lat:36.672825, lng:-76.541748, icon:./img/avicon3.png,…},…]
           0: {lat:36.672825, lng:-76.541748, icon:./img/avicon3.png,…}
           1: {lat:36.901314, lng:-76.041870, icon:./img/avicon2.png,…}
           2: {lat:37.101192, lng:-76.264343, icon:./img/avicon3.png,…}
           3: {lat:37.300274, lng:-75.673828, icon:./img/avicon3.png,…}
           4: {lat:37.348328, lng:-76.830139, icon:./img/avicon3.png,…}
           5: {lat:37.2481003, lng:-76.1194000, icon:./img/bicon3.png,…}
           6: {lat:37.0298691, lng:-76.3452225, icon:./img/ricon.png,…}
           7: {lat:37.6087608, lng:-77.3733063, icon:./img/ricon.png,…}
           8: {lat:37.7440300, lng:-77.1316376, icon:./img/ricon.png,…}
           9: {lat:37.5917015, lng:-77.4207993, icon:./img/bicon2.png,…}
          10: {lat:37.5206985, lng:-77.3783112, icon:./img/ricon.png,…}
          11: {lat:37.3306999, lng:-77.3227615, icon:./img/ricon.png,…}
          12: {lat:37.1228981, lng:-75.9063034, icon:./img/bicon2.png,…}

Нет ошибок в консоли, и, как я уже сказал, иногда все работает (когда getBounds не возвращает сумасшедшего большого LON). Так что, черт возьми, я делаю неправильно, и что еще более важно, как мне его решить?

Ответ 1

Это связано с тем, что по умолчанию для worldCopyJump установлено значение false. Установите его в true, и маркеры будут отображаться правильно, так как мир не будет перекрываться.

Ответ 2

Я видел подобную вещь, за исключением того, что я обрабатывал событие клика с помощью обратного вызова как event.latlng.lng. Добавление worldCopyJump: true сделало не исправление этой проблемы для меня - я все еще видел значения долготы больше 180.

В конце я вызвал метод wrap() для объекта latlng:

event.latlng.wrap().lng

который исправил проблему.

Ответ 3

Я никогда не испытывал этих неправильных границ, но не ограничил бы их программным путем как минимум временное решение?

Что касается маркеров, которые не отображаются - это происходит, когда вы перемещаете карту? Если это так, это, скорее всего, вызвано перекрытием событий "moveend". Я не знаю, сколько очков в среднем, но если загрузка данных не заканчивается и добавить маркеры, следующий вызов "moveend" удалит все существующие маркеры и начнет их заменять (также он переопределит "список сюжетов", который вызывает мигт ошибки позже). Вы можете попробовать добавить их в глобальный список после завершения всех операций и рисования маркеров или вы можете перемещать только маркеры не в новый набор.

В sidenote - почему бы не использовать geojson для создания этих слоев? С помощью "pointToLayer" и "onEachFeature" вы можете настраивать маркеры/всплывающие окна и иметь один слой в конце, а не длинный список маркеров.