2016-07-29 12 views
1

私はマーカー付きのマップボックスマップを持っています(私はMarkerClusterも使用しています)。 JavaScriptでこれらのHTMLマーカーを取得して(ビューポートから座標ではなく)位置を判断するので、ビューポートにはないマーカーの指標を追加できます。しかし、私がマーカーから離れすぎていると(例えばマップをズームしたりドラッグしたりすると)、マーカはHTMLに表示されません!公式の事例でも同じことが起こるのを見ることができるので、それは正常な動作であるようです。地図の中心から離れすぎると地図のマーカーが消えます

ここに質問があります。この動作を防止し、常にHTMLにマーカーを付ける方法はありますか?ここで

ではJavaScriptです:事前に

var places = { 
    "type": "FeatureCollection", 
    "features": [{ 
     "type": "Feature", 
     "properties": { 
      "description": ">Test 1" 
     }, 
     "geometry": { 
      "type": "Point", 
      "coordinates": [-1.6313898, 47.2005156] 
     } 
    }, { 
     "type": "Feature", 
     "properties": { 
      "description": "Test 2" 
     }, 
     "geometry": { 
      "type": "Point", 
      "coordinates": [2.3279346, 48.8960698] 
     } 
    }, { 
     "type": "Feature", 
     "properties": { 
      "description": "Test 3" 
     }, 
     "geometry": { 
      "type": "Point", 
      "coordinates": [2.7391394, 48.7238554] 
     } 
    }, { 
     "type": "Feature", 
     "properties": { 
      "description": "Test 4" 
     }, 
     "geometry": { 
      "type": "Point", 
      "coordinates": [55.4933757, -20.9034031] 
     } 
    }] 
}; 

L.mapbox.accessToken = 'pk.eyJ1Ijoic3RlcmVvc3VwZXIiLCJhIjoiY2lyM2JnMDIwMDAxM2k0bWNndmUzeTFhbSJ9.UZ-XuPASxGVtYFSqdVyppg'; 

var map = L.mapbox.map('map', null, {minZoom: 3, maxZoom: 16, center: [46, 8], zoom: 5, scrollWheelZoom: false, maxBounds: [[-100.0,-100.0],[100.0,100.0]]}); 
L.mapbox.styleLayer('mapbox://styles/stereosuper/cir3bgtaz001wjcnntu6n2axw').addTo(map); 

var markers = L.mapbox.featureLayer(places); 
var icon = L.divIcon({ iconSize: [30, 30], popupAnchor: [0, -20] }); 
markers.eachLayer(function(l){ l.setIcon(icon); }); 

var clusterPlaces = new L.MarkerClusterGroup({ 
    iconCreateFunction: function(cluster){ 
     return new L.DivIcon({ iconSize: [30, 30], html: '<div class="marker-cluster"><span>'+cluster.getChildCount()+'</span></div>' }); 
    } 
}); 
clusterPlaces.addLayer(markers).addTo(map); 

map.on('moveend', function(e){ 
    var htmlMarkers = $('.leaflet-marker-icon'), 
     xCenter = $(window).width()/2, yCenter = $(window).height()/2; 

    if($('.map-indicator').length){ 
     $('.map-indicator').remove(); 
    } 

    htmlMarkers.each(function(i){ 
     var thisMarker = $(this), 
      thisCluster = thisMarker.find('span').length, 
      thisMarkerHtml = thisCluster ? thisMarker.find('span').html() : 1; 
     var top = thisMarker.offset().top, left = thisMarker.offset().left; 
     var indicator = '<button class="map-indicator map-indicator-'+i+'"><span>'+thisMarkerHtml+'</span></button>'; 
     var newLeft, newTop, angle, distance; 
     var mapHtml = $('#map'); 

     if(top + thisMarker.height() < 0){ 
      mapHtml.append(indicator) 
      if(left > xCenter){ 
       distance = (left-xCenter) * (yCenter/(yCenter-top)); 
       angle = Math.atan(distance/yCenter)*180/Math.PI; 
       newLeft = xCenter + distance; 
       if(newLeft > $(window).width() - 40) newLeft = $(window).width() - 40; 
      }else{ 
       distance = (xCenter-left) * (yCenter/(yCenter-top)); 
       angle = - Math.atan(distance/yCenter)*180/Math.PI; 
       newLeft = xCenter - distance; 
       if(newLeft < 40) newLeft = 40; 
      } 
      $('.map-indicator-'+i).css({'top': '10px', 'left': newLeft + 'px', 'bottom': 'auto', 'right': 'auto', '-webkit-transform': 'rotate('+angle+'deg)', 'transform': 'rotate('+angle+'deg)'}).addClass('top').removeClass('bottom', 'left', 'right'); 
     }else if(top > $(window).height()){ 
      mapHtml.append(indicator) 
      if(left > xCenter){ 
       distance = (left-xCenter) * (yCenter/(yCenter+(top-$(window).height()))); 
       angle = - Math.atan(distance/yCenter)*180/Math.PI; 
       newLeft = xCenter + distance; 
       if(newLeft > $(window).width() - 40) newLeft = $(window).width() - 40; 
      }else{ 
       distance = (xCenter-left) * (yCenter/(yCenter+(top-$(window).height()))); 
       angle = Math.atan(distance/yCenter)*180/Math.PI; 
       newLeft = xCenter - distance; 
       if(newLeft < 40) newLeft = 40; 
      } 
      $('.map-indicator-'+i).css({'bottom': '10px', 'left': newLeft + 'px', 'top': 'auto', 'right': 'auto', '-webkit-transform': 'rotate('+angle+'deg)', 'transform': 'rotate('+angle+'deg)'}).addClass('bottom').removeClass('top', 'left', 'right'); 
     }else if(left + thisMarker.width() < 0){ 
      mapHtml.append(indicator) 
      if(top < yCenter){ 
       distance = (yCenter-top) * (xCenter/(xCenter-left)); 
       angle = Math.atan(distance/xCenter)*180/Math.PI; 
       newTop = yCenter - distance; 
       if(newTop < 0) newTop = 0; 
      }else{ 
       distance = (top-yCenter) * (xCenter/(xCenter-left)); 
       angle = - Math.atan(distance/xCenter)*180/Math.PI; 
       newTop = yCenter + distance; 
       if(newTop > $(window).height()) newTop = $(window).height() - thisMarker.height(); 
      } 
      $('.map-indicator-'+i).css({'top': newTop, 'left': '10px', 'bottom': 'auto', 'right': 'auto', '-webkit-transform': 'rotate('+angle+'deg)', 'transform': 'rotate('+angle+'deg)'}).addClass('left').removeClass('bottom', 'top', 'right'); 
     }else if(left > $(window).width()){ 
      mapHtml.append(indicator) 
      if(top < yCenter){ 
       distance = (yCenter-top) * (xCenter/(xCenter+(left-$(window).width()))); 
       angle = - Math.atan(distance/xCenter)*180/Math.PI; 
       newTop = yCenter - distance; 
       if(newTop < 0) newTop = 0; 
      }else{ 
       distance = (top-yCenter) * (xCenter/(xCenter+(left-$(window).width()))); 
       angle = Math.atan(distance/xCenter)*180/Math.PI; 
       newTop = yCenter + distance; 
       if(newTop > $(window).height()) newTop = $(window).height() - thisMarker.height(); 
      } 
      $('.map-indicator-'+i).css({'top': newTop, 'left': 'auto', 'bottom': 'auto', 'right': '10px', '-webkit-transform': 'rotate('+angle+'deg)', 'transform': 'rotate('+angle+'deg)'}).addClass('right').removeClass('bottom', 'left', 'top'); 
     } 

     $('.map-indicator-'+i).on('click', function(e){ 
      var coordinates = map.layerPointToLatLng(thisMarker.context._leaflet_pos); 
      map.panTo(coordinates); 
     }); 
    }); 
}); 

おかげで(私はmapbox.jsとleaflet.markerclusterを使用)

あなたは絶対的に正しい推測

答えて

2

は、Leaflet.markerclusterプラグインは、デフォルトのマーカーとクラスターによって削除されますあなたのビューポートから遠く離れています。

この動作を無効にするためにマーカークラスタグループを作成するときは、removeOutsideVisibleBoundsオプションを使用できます。

高ズームでは、Leaflet.markerclusterが回避しようとするものの1つである地図上にたくさんのマーカーがあるため、ブラウザのパフォーマンスが低下する可能性があることに注意してください。

+0

私が探していたもの!どうもありがとう! – shwarp

関連する問題