6 votos

OpenLayers - Obtener características dentro de un polígono

En mi mapa OpenLayers permito a los usuarios dibujar un vector poligonal ad hoc. Luego necesito obtener todas las características de una capa vectorial WFS que caen dentro del polígono ad-hoc.

Aquí está el código que tengo que permite al usuario dibujar el polígono ad-hoc en el mapa. Este código funciona bien:

function buildIt() {
//CREATE THE NEW VECTOR 
var polygonLayer = new OpenLayers.Layer.Vector("Poly Layer");
//ADD IT TO THE MAP
map.addLayer(polygonLayer);

//CREATE A DRAWFEATURE CONTROL
var polyedit = new OpenLayers.Control.DrawFeature(
polygonLayer,//POINT IT AT THE USER DEFINED POLYGON LAYER
OpenLayers.Handler.Polygon
);

// 'point' is one of the named callbacks specified by OpenLayers.Handler.Polygon
// and is called every time a point is added to the feature being drawn
polyedit.handler.callbacks.point = function (pt) { 
    console.log(pt)
}
map.addControl(polyedit);//ADD THE DRAWFEATURE CONTROL TO THE MAP
polyedit.activate();//ACTIVATE THE DRAWFEATURE CONTROL

}

Después de esto no tengo ni idea. ¿Cómo puedo obtener todas las características que caen dentro del polígono definido por el usuario? Específicamente, necesito obtener los atributos de cada característica WFS (a veces puntos, a veces polígonos) que caen dentro del polígono ad-hoc dibujado por el usuario.

Agradecería cualquier sugerencia. Gracias.

2voto

Jeroen Dirks Puntos 2515

Después de investigar un poco pude encontrar una solución. Esta función permite al usuario

function buildIt() {//START FUNCTION buildIt

//CREATE A NEW EMPTY VECTOR LAYER 
var polygonAdHoc = new OpenLayers.Layer.Vector("Poly Layer");
//ADD THE NEW VECTOR LAYER TO THE OPENLAYERS MAP
map.addLayer(polygonAdHoc);
//SET A VARIABLE TO THE NAME OF THE EXISTING LAYER THAT WILL BE TESTED FOR INTERSECTION WITH THE USER CREATED POLYGON
//I CHOSE TO GET THE LAYER BY NAME BUT YOU MIGHT CHOOSE TO DO IT ANOTHER WAY
var standLyr = map.getLayersByName("nameOfTheVectorLayerYouWantToTestForIntersection");

//CREATE A DRAW FEATURE CONTROL FOR THE USER CREATED VECTOR LAYER
var draw = new OpenLayers.Control.DrawFeature(polygonAdHoc, OpenLayers.Handler.Polygon);
//ADD THE DRAW FEATURE CONTROL TO THE MAP
map.addControl(draw);
//ACTIVATE THE DRAW FEATURE CONTROL
draw.activate();

//WHEN THE USER FINISHES DRAWING THE AD-HOC POLYGON THE beforefeatureadded EVENT WILL FIRE
polygonAdHoc.events.on({
    beforefeatureadded: function (event) {
        poly = event.feature.geometry;//SET A VARIABLE TO THE USERDRAWN POLYGONS GEOMETRY
        //alert("polygonAdHoc.features[0].geometry: " + poly);//IF YOU WANT TO SEE THE GEOMETRY COORDINATES UNCOMMENT THIS LINE
        for (var a = 0; a < standLyr[0].features.length; a++) {//LOOP THRU THE STANDS FEATURES OF THE LAYER YOU WANT TO TEST FOR INTERSECTION WITH THE USER DRAWN POLYGON
            if (poly.intersects(standLyr[0].features[a].geometry)) {//IF THE USER DRAWN POLYGON INTERSECTS THE TARGET LAYERS FEATURE REPRESENTED BY THE VARIABLE "a" THEN
                 //IDENTIFY THE FEATURE THAT INTERSECTS 
                 //FOR SIMPLICITIES SAKE I CHOSE TO JUST FIRE AN ALERT
                 //MY ACTUAL APP ADDS EACH SELECTED FEATURE TO A SELECT FEATURE CONTROL AND HIGHLIGHTS EACH POLYGON ON THE MAP                
                 alert("stands feature intersection: " +  standLyr[0].features[a].attributes['nameOfAttribute']);
            }//END OF IF STATEMENT
        }//END OF FOR STATEMENT
        draw.deactivate();//I ONLY WANT THE USER TO BE ABLE TO DRAW ONE AD-HOC POLYGON
        //SO I DEACTIVATE THE DRAW FEATURE CONTROL AFTER THEY CREATE THE FIRST POLYGON
        return false;
    }//END OF beforefeatureadded FUNCTION
});//END OF polygonAdHoc.events.on
}//END OF buildIt FUNCTION

0voto

Gonzalo Puntos 500

¿Necesita la costumbre polígono, o es una caja como en la WFS GetFeature Ejemplo lo suficientemente bueno?

Otra forma sería utilizar el WFS - GetFeature opción con un Cuadro de Delimitación del polígono. Usted debe obtener los parámetros de su Cuadro Delimitador con algo como:

polygonLayer.features[0].geometry.bounds.bottom
polygonLayer.features[0].geometry.bounds.left
polygonLayer.features[0].geometry.bounds.right
polygonLayer.features[0].geometry.bounds.top

No estoy seguro, lo que la salida será, pero supongo que podría contener también los atributos de las características.

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