2013-08-05 15 views
10

Bir sorun önerdim ve yazar Github'da kapattı, ancak hala bir sonuç bırakmayacağım. Boylamlar -180'den 180'e kadar değişir. Ancak bazen, Broşür, 474.2578215 gibi boylamları getBounds() 'dan döndürür, daha sonra tablomda hiçbir şey iade edilmez.Broşür getBounds() 180'den büyük boylamlar geri dönüyor

Şunu söylemiştim: Amaçlanan davranış. Bu, haritayı çok uzaklaştırarak ve/veya haritayı dünyanın başka bir kopyasına sürüklediğinizde ve getBounds boylamları varsayılan olarak sarılmadığında gerçekleşir. İstediğinizi elde etmek için LatLng sarma yöntemini kullanabilirsiniz - ör. bounds.getSouthWest(). wrap().

Tamam. Bu yüzden sarma yöntemini oraya ekledim ve doğru veriler döndü, ancak artık haritada işaretçiler gösterilmeyecek. Muhtemelen bu yüksek sayı aralığı içinde bulunmayan işaretçi konumlarından kaynaklanıyordur (sınırların koordinatlarının ne olduğunu düşünür?)

Sorunun sebebi, yakınlaştırma veya sürükleme işlemidir. Sayfayı yenilediğinde, kullanıcının yakınlaştırma veya sürükleme olayları gerçekleşmediğinde sorun devam eder. Ben init ile sınırlı bir zum var: minZoom: 6, maxZoom: 13.

Dikkat etmeliyim ki, bu kod (değişmemiş) sadece iyi çalışıyordu.

$(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); 
     } 
     } 
     }); 
    } 

sarma() işlevleri doğru koordinatları vermek ve DB doğru araziler döndürür: İşte benim kodudur. Ama bir sebepten dolayı, onlar göstermezler. İşte araziler (map_data kısmını) döndürülür: konsolda

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,…} 

Hiçbir hataları ve dediğim gibi, (getBounds çılgın büyük LON döndürmüyor) bazen hepsi çalışıyor. Öyleyse ne yapıyorum yanlış ve daha da önemlisi, onu nasıl çözebilirim?

cevap

11

Bu, worldCopyJump'ın varsayılan olarak false değerine ayarlı olmasından kaynaklanmaktadır. Bunu true olarak ayarladığınızda, işaretçiler dünya çakışmayacağından doğru şekilde görüntülenecektir.

0

Bu yanlış sınırları hiç deneyimlemedim, ancak bunları en az geçici çözüm olarak programlı olarak sınırlandırmıyor muydu?

İşaretçiler gösterilmiyorsa - haritayı hareket ettirdiğinizde mi oluyor? Eğer öyleyse, büyük olasılıkla 'moveend' olaylarının çakışmasından kaynaklanır. Ortalamada kaç puan olduğunu bilmiyorum ama eğer veri indirme işlemi bitmezse ve işaretçileri eklerse, bir sonraki 'moveend' çağrısı tüm mevcut işaretleyicileri siler ve onları değiştirmeye başlar (aynı zamanda migth sebebi olan 'plotlist'i geçersiz kılar. hatalar daha sonra). Tüm işlemler bittikten ve işaretçiler çizildikten sonra bunları global listeye eklemeyi deneyebilir veya yalnızca yeni kümede olmayan işaretçileri taşıyabilirsiniz.

Yankı Durumda - neden bu katmanları oluşturmak için geojson kullanmıyorsunuz? 'PointToLayer' ve 'onEachFeature' ile işaretçileri/pop-up'ları özelleştirebilir ve sonunda uzun bir işaretçi listesi oluşturabilirsiniz.

+0

Bu sınırlar haritayı sürüklemekten gelir ve broşür tarafından iade edilir. Bu yüzden programatik olarak değiştirebileceğime emin değilim. İşaretçiler, init'te gösterilmez veya sürüklenmez. Döngüden geçen ve her işaretleyiciyi basan konsol.log'um var, bu yüzden bu olayın en azından gerçekleştiğini biliyorum. Eskiden Google Maps kullanıyordum, bu yüzden programlamayı mümkün olduğunca son uygulamamda olduğu gibi koruyordum (sadece geri sıçramam gerekiyorsa). Aynı zamanda geojsonda da iyi değilim, o yüzden nasıl kullanılacağını tam olarak bilmiyorum. –

1

Benzer bir şey görüyordum, bir harita tıklatma olayını event.latlng.lng olarak geri arama yoluyla işliyordum.

event.latlng.wrap().lng 

sabit: - ekleme worldCopyJump: true benim için değil düzeltme bu konunun yaptım ben hala boylam Sonunda büyüktür 180.

değerleri görüyordum, ben latlng nesneye wrap() yöntemi denilen sorun.

İlgili konular