2011-10-12 16 views
6

Mi código muestra marcadores de GeoJSON, cuando me acerco al nivel de zoom 10, carga el archivo GeoJSON, pero ¿cómo puedo evitar que vuelva a aparecer el mismos marcadores? ¿Hay alguna manera de verificar si ya existe un marcador en un lugar específico? El códigoOpenLayers, y GeoJSON, marcador de multiplicación en las mismas coordenadas

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

Respuesta

4

Por qué no usar el BBOXStrategy [1]?

Eso hará lo que necesita, y seguramente será más eficiente (eliminará las funciones existentes y volverá a cargar las nuevas en zoomend). Comparar características para agregar nuevas necesitará mucho de comparación, y puede terminar con demasiadas características en su mapa.

Consulte la fuente js del ejemplo.

HTH,

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

EDIT: si desea cambiar menos código, una llamada a vectorLayer.removeAllFeatures() antes de añadir va a resolver su problema ... ¿Usted realmente necesita para mantener las características fuera de límite?

+0

Bueno, buena pregunta, pero ¿eso no tomaría potencia extra? –

+0

+1 en BBOX Strategy, pero ¿qué hay de la restricción del nivel de zoom? ¿Está eso disponible en una estrategia? –

+0

La restricción de nivel de zoom no está disponible de forma predeterminada. Puede anular esta clase ('OpenLayers.Strategy.BBOX') para hacerlo. La eliminación de todas las funciones (mi segunda solución) no costará más que comparar cada característica para saber si deben agregarse. – tonio

0

Primero necesitarías obtener la capa del mapa usando algo como map.getLayersByName. Luego puede iterar sobre las características de la capa para buscar la característica que está agregando.

Si puede modificar el backend para usar BBOX, entonces la estrategia de BBOX con nivel de zoom y configuraciones de proyección se encargaría mucho de usted.

Cuestiones relacionadas