Выясните, находится ли ограничительная рамка в векторном слое в openlayers 3

У меня есть векторный слой, который содержит много полигонов, чтобы наметить области интереса на карте OSM. Пользователь может нарисовать ограничительную рамку на карте, чтобы получить больше информации об определенной области интереса. Мне нужно проверить, находится ли ограничивающий прямоугольник, который рисует пользователь, в одном из многих полигонов в моем векторном слое. Это возможно в openlayers 3? Я обнаружил, что могу сравнивать экстенты, но экстентом моего векторного слоя является вся карта. Мне нужно выяснить, находится ли коробка в меньшей области.

Настройка карты и векторного слоя, содержащего геойсон:

map = new ol.Map({
        interactions: ol.interaction.defaults({
            keyboard: false,
            altShiftDragRotate: false
        }),
        target: 'create-export-map',
        view: new ol.View({
            projection: "EPSG:4326",
            //extent: [-180,-90,180,90],
            center: [44.4333, 33.3333],
            zoom: 4,
            maxZoom: 18,
        })
    })


    //add base layers
    var osm = new ol.layer.Tile({
        title: "OpenStreetMap",
        source: new ol.source.OSM({
            wrapX: false,
            noWrap: true,
            attributions: [
                new ol.Attribution({
                    html: '&copy ' +
                    '<a href="//www.openstreetmap.org/copyright">OpenStreetMap</a> contributors.'
                }),

                ol.source.OSM.ATTRIBUTION
            ]

        })
    })

    map.addLayer(osm);

regionsSource = new ol.source.Vector({
        wrapX: false,
        noWrap: true,
    });


    regions = new ol.layer.Vector({
            name: 'regions',
            source: regionsSource,
            style: new ol.style.Style({
                fill: new ol.style.Fill({
                    color: 'rgba(0,0,0,0)',
                    //opacity: 0.8,
                }),
                stroke: new ol.style.Stroke({
                    color: 'rgba(215, 63, 63, 0.8)',
                    width: 3.5,
                })
            }),

        })
    map.addLayer(regions);

$.getJSON(jsonfileURL, function(data){
        var geojson = new ol.format.GeoJSON();
        var features = geojson.readFeatures(data);
        regionsSource.addFeatures(features);
        var extent = regionsSource.getExtent();

        map.getView().fit(extent, map.getSize());            
    });

//OL3 add bounding box selection layer
    bboxSource = new ol.source.Vector()
    bbox = new ol.layer.Vector({
        name: 'Select',
        source: bboxSource,
        style: new ol.style.Style({
            stroke: new ol.style.Stroke({
                color: 'blue'
            }),
            fill: new ol.style.Fill({
                color: [0, 0, 255, 0.05]
            })
        })
    });
    map.addLayer(bbox);

//Map control for dragbox - bounding box
var dragBox = new ol.interaction.DragBox({
        condition: ol.events.condition.primaryAction,
    });

    var translate;

    dragBox.on('boxend', function(e){
        var dragFeature = new ol.Feature({
            geometry: dragBox.getGeometry()
        });
        bboxSource.addFeature(dragFeature);
        map.removeInteraction(dragBox);
        translate = new ol.interaction.Translate({
            features: new ol.Collection([dragFeature])
        });

        var bounds = dragFeature.getGeometry().getExtent();
        filtering = true;

        // validate the selected extents
        if (validateBounds(bounds)) {
            setBounds(bounds);
        }
        else {
            unsetBounds();
        }

function validateBounds(bounds) {
    var regions, region;
    map.getLayers().forEach(function (l) {
        if (l.get('name') == 'regions')
            regions = l;
    })

    var valid_region = false;

    // check that we're within a polygon region.
    //This is where I'm stuck...
}

Я пытался сравнивать экстенты, копаться в координатах региона, но это массив массивов, массивов... Кто-нибудь знает хороший способ проверить, будет ли bbox находиться внутри одного из полигонов в слое регионов? Я использую OpenLayers 3.17.1

В openlayers-2 это было сделано так:

for (i = 0; i < regions.length; i++){
        region = regions[i].geometry;
        if (extent.intersects(region)){
            valid_region = true;
        }

}

Заранее спасибо!

1 ответ

Что-то вроде этого?

for (i = 0; i < regions.length; i++) {
    var region = regions[i];
    for (j = 0; j < region.getSource().getFeatures().length; j++) {
        var feature = regions.getSource().getFeatures()[j];
        if (ol.extent.intersects(extent,feature.getGeometry().getExtent())) {
            /* do whatever you want */
        }
    }
}
Другие вопросы по тегам