2011-10-12 11 views
6

Mój kod pokazuje znaczniki z GeoJSON, kiedy jestem powiększony do poziomu 10 powiększenia, ładuje się plik GeoJSON, ale jak mogę uniknąć same znaczniki? Czy istnieje sposób sprawdzenia, czy istnieje już znacznik w określonym miejscu? KodOpenLayers, i GeoJSON, nie mnożymy znaczników na tych samych współrzędnych

map.events.register("zoomend", null, function(){ 

     if(map.zoom == 10) 
     { 
     var bounds = map.getExtent(); 
     console.log(bounds); 
     var ne = new OpenLayers.LonLat(bounds.right,bounds.top).transform(map.getProjectionObject(),wgs84); 
     var sw = new OpenLayers.LonLat(bounds.left,bounds.bottom).transform(map.getProjectionObject(),wgs84); 
     var vectorLayer = new OpenLayers.Layer.Vector(); 
     map.addLayer(vectorLayer); 
     $.getJSON('ajax.php?a=markers&type=json&sw=('+sw.lon+','+sw.lat+')&ne=('+ne.lon+','+ne.lat+')',function(data){ 
     //$.getJSON('test.json',function(data){ 
      var geojson_format = new OpenLayers.Format.GeoJSON({ 
       'externalProjection': wgs84, 
       'internalProjection': baseProjection 
       }); 
      vectorLayer.addFeatures(geojson_format.read(data)); 
     }); 
     } 
    }); 

Odpowiedz

4

Dlaczego nie użyć BBOXStrategy [1]?

To zrobi to, czego potrzebujesz, i na pewno będzie bardziej wydajne (usunie istniejące funkcje i ponownie załaduje nowe na zoomend). Porównywanie funkcji do dodania nowego będzie wymagało wiele porównania i możesz zakończyć z powodu zbyt wielu funkcji na mapie.

Sprawdź źródło js przykładu.

HTH,

1 - http://openlayers.org/dev/examples/strategy-bbox.html

EDIT: jeśli chcesz zmienić mniej kodu, wywołanie vectorLayer.removeAllFeatures() przed dodaniem rozwiąże problem ... Czy naprawdę trzeba zachować funkcje poza granicę?

+0

Cóż, dobre pytanie - ale czy to nie wymaga dodatkowej mocy? –

+0

+1 przy strategii BBOX, ale co z ograniczeniem poziomu powiększenia? Czy jest to dostępne w strategii? –

+0

Ograniczenie poziomu powiększenia nie jest domyślnie dostępne. Możesz zastąpić tę klasę ('OpenLayers.Strategy.BBOX'), aby to zrobić. Usunięcie wszystkich funkcji (moje drugie rozwiązanie) nie będzie kosztować więcej niż porównywanie wszystkich funkcji, aby wiedzieć, czy trzeba je dodać. – tonio

0

Najpierw musisz usunąć warstwę z mapy, używając czegoś takiego jak map.getLayersByName. Następnie możesz wykonać iterację ponad layer.features, aby wyszukać dodawaną funkcję.

Jeśli możesz zmodyfikować backend, aby użyć BBOX, to strategia BBOX z poziomem powiększenia i ustawieniami projekcji bardzo by Ci pomogła.