2014-09-25 19 views
6

Piszę stronę, na której można zobaczyć oba szczegóły dotyczące obszaru i mapy. Szczegóły znajdują się na jednej karcie, a mapa na innej. Odpowiednia część kodu HTML znajduje się poniżej, a klasy pochodzą z Bootstrap.Rysowanie mapy OpenLayers 3 w ukrytym elemencie

<div class="col-xs-8"> 
    <ul class="nav nav-tabs"> 
     <li class="active"><a href="#tab-details" data-toggle="tab">Details</a></li> 
     <li><a href="#tab-map" data-toggle="tab">Map</a></li> 
    </ul> 
    <div class="tab-content"> 
     <div id="tab-details" class="tab-pane fade in active"></div> 
     <div id="tab-map" class="tab-pane fade"> 
      <div id="map-container" class="map"></div> 
     </div> 
    </div> 
</div> 

Warstwa kafli pochodzi z OSM, a warstwa wektorowa jest ładowana za pośrednictwem adresu URL obsługującego plik KML. Czyni to za pomocą OpenLayers 3.0.0 następująco:

function ShowMap() { 
    var area = $('#AreaCode').val(); 
    $('#map-container').empty(); 
    if (area != null && area != '') { 
     var kmlUrl = '/kml?code=' + area; 
     var tile = new ol.layer.Tile({ source: new ol.source.OSM() }); 
     var vectorSource = new ol.source.KML({ url: kmlUrl, projection: 'EPSG:3857' }); 
     var vector = new ol.layer.Vector({ source: vectorSource }); 
     vector.setOpacity(.3); 
     var map = new ol.Map({ 
      target: 'map-container', 
      layers: [tile, vector], 
      view: new ol.View({ 
       center: [0, 0], 
       zoom: 2 
      }) 
     }); 

     vector.addEventListener("change", function(event) { 
      map.getView().fitExtent(vectorSource.getExtent(), map.getSize()); 
     }); 
    } 
} 

$('#tab-map-link').on('shown.bs.tab', function(event) { 
    ShowMap(); 
}); 

Czyni mapę kiedy karta mapa kliknięciu powodując małe opóźnienie. Czy istnieje sposób jej załadowania, nawet jeśli karta nie jest wybrana? Jeśli spróbuję tego i nie przerysuję po wybraniu karty mapy, wówczas płótno pozostanie puste, gdy przełączyłem się na kartę mapy i pokazane są tylko przyciski powiększania i pomniejszania.

Czy istnieje sposób renderowania mapy w elemencie, który nie jest widoczny?

+0

jestem trochę późno, aby zobaczyć to, ale czy próbowałeś renderowanie go w pełnym rozmiarze, ale poza ekranem (np. za pomocą 'left: -3000px'), a następnie przestawienie go na pozycję po przejściu do zakładki? – kwah

+0

@kwah. Dzieki za sugestie. Byłbym prawie zapomniany o tym problemie. Kod i tak przesunął się nieco dalej (zużycie GeoJSON obliczone z kolumny geometrii PostgreSQL, a nie KML z kolumny tekstowej MySQL). Zaakceptowałem opóźnienie i nie jest to wielka sprawa, ale spróbuję obejść, jeśli ponownie przyjrzę się problemowi. –

Odpowiedz

6

można zainicjować mapę w ukrytym pojemniku, a następnie, gdy karta jest aktywna, można zadzwonić updateSize na mapie:

map.updateSize() 
+0

Dzięki, to zadziała dobrze w wielu przypadkach, ale u mnie występują problemy. Problem polega na tym, że teraz tworzę źródło wektorowe i wywołuję fitExtent, aby powiększyć do wektora. Jest to resetowane, gdy wywołuję map.updateSize(). Udostępnienie mapy i źródła do zdarzenia zmiany zakładki (pokazane na .bs.tab) oznacza wprowadzenie zmiennych globalnych tam, gdzie są one obecnie lokalne. Zamierzam zaktualizować moje pytanie z dalszymi szczegółami. –

Powiązane problemy