5 votos

¿Cómo encontrar marcadores en openboxers seleccionados de dragbox 3?

Aquí hay una parte del código,

 draw = new ol.interaction.DragBox({
            /* dragbox interaction is active only if alt key is pressed */
            condition: ol.events.condition.altKeyOnly,
            /* style the box */
            style: new ol.style.Style({
                stroke: new ol.style.Stroke({
                    color: [0, 0, 255, 1]
                })
            })
        });
        /* add the DragBox interaction to the map */
        map.addInteraction(draw);

        draw.on('boxend', function (evt) {}
 

Busqué en Google pero no encontré cómo lo haré. Creé un dragbox y lo agregué al mapa, tengo algunos marcadores en el mapa. ¿Cómo aprendo que dragbox contiene marcadores o no? Gracias por las respuestas.

10voto

Mike Puntos 11

Bueno, vamos a rock estas características de la DragBox!

Hay tres opciones que he encontrado para extraer las características de la medida de la DragBox.

Consideraciones e hipótesis:

  • No podía extraer de los tipos de capas (raster o vector) de la map.getLayers() objeto, así que vamos a suponer que hemos almacenado la función de las capas individuales de las variables globales.
  • Las características se almacenan en una variable con el nombre featureLayer.
  • He cambiado el altKeyOnly condición a shiftKeyOnly para aumentar la compatibilidad (en Linux presionando la tecla Alt mueve la ventana activa por defecto).

Primer método:

El primer método es el más básico como puede ver en este violín: http://jsfiddle.net/GFarkas/L7xjb6yx/

  1. Hacer un acceso directo de la variable:

    var features = featureLayer.getSource().getFeatures();
    
  2. Hacer una matriz vacía para la coincidencia de los puntos de bucle y a través de las características almacenadas en la featureLayer variable:

    box.on('boxend', function() {
        var featuresinBox = [];
        for (var i=0;i<features.length;i++) {
    
  3. Consulte con el ol.extent.containsCoordinate() función de si el punto real se ajusta a la medida de la DragBox. Si cabe, añadir a la featuresinBox matriz:

    if (ol.extent.containsCoordinate(box.getGeometry().extent, features[i].getGeometry().getCoordinates())) {
        featuresinBox.push(features[i]);
    }
    

Segundo método:

El primer método es muy básico, no tiene la menor posibilidad de fallar. Sin embargo, hay algunas funciones auxiliares en OpenLayers 3 escrito para la función de las fuentes. Una de estas funciones se llama forEachFeature(), que se reproducirá en bucle a través de la cuenta para usted. Violín: http://jsfiddle.net/GFarkas/fk1mqq25/1/

  1. Matriz vacía para la coincidencia de características:

    box.on('boxend', function() {
        var featuresinBox = [];
    
  2. Llame a la forEachFeature() función con un opt_this variable (en mi caso se llama e):

    featureLayer.getSource().forEachFeature(function(e) {
    
  3. De verificación. Si cabe, se encuentra:

    if (ol.extent.containsCoordinate(box.getGeometry().extent, e.getGeometry().getCoordinates())) {
        featuresinBox.push(e);
    }
    

Tercer método:

El tercer método es el más sencillo, sin embargo es en un estado experimental como se indica en el documento API. Utiliza un ol.source.Vector función, también llamado forEachFeatureInExtent(). Utilice a su propio riesgo. Violín: http://jsfiddle.net/GFarkas/b0d5mhyd/3/

  1. Conjunto vacío:

    box.on('boxend', function () {
        var featuresinBox = [];
    
  2. Llame a la forEachFeatureInExtent() función con la medida de la DragBox y empuje cada característica que es en la medida en que el conjunto vacío:

    featureLayer.getSource().forEachFeatureInExtent(box.getGeometry().extent, function (e) {
        featuresinBox.push(e);
    });
    

Hay un cuarto método que manualmente se comprueba si la coordenada(s) de una función es en el DragBox medida o no, pero es más complicado que el primer método, que es lo suficientemente seguro para su uso en la mayoría de los entornos.

Notas finales:

  • El featuresinBox de la matriz contiene la copia exacta de la coincidencia de características. Usted puede extraer información de ellos, con las funciones correspondientes. Yo sólo se utiliza la .length de atributo para el bien de la simplicidad en mi violines.
  • Para el cuarto método: el ol.Extent objeto contiene sólo las dos esquinas opuestas de la medida (como en todo enfoque de SIG, la primera es la de la esquina inferior izquierda).
  • Si usted tiene más de una característica de la capa, entonces usted tiene un bucle a través de cada uno de ellos, para hacerlas valer en la "consulta".
  • Si usted tiene uno o dos dimensiones características (líneas o polígonos), entonces usted tiene que comprobar cada coordenadas para asegurarse de que están completamente en el DragBox (para ellos getGeometry().getCoordinates() devuelve una matriz de coordenadas). La única excepción es el forEachFeatureInExtent() función, pero como es en un estado experimental, usted no debe esperar un 100% de resultados.
  • Poco extra para jugar con la selección de características: http://jsfiddle.net/GFarkas/b0d5mhyd/4/

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X