2016-08-30 1 views
1

Ich habe eine Vektorebene, die viele Polygone enthält, um Bereiche von Interesse auf einer OSM-Map zu umreißen. Der Benutzer kann eine Begrenzungsbox auf der Karte zeichnen, um weitere Informationen zu einem bestimmten Interessenbereich zu erhalten. Was ich überprüfen muss, ist, wenn die Bounding Box, die der Benutzer zeichnet, innerhalb eines der vielen Polygone in meiner Vektorebene liegt. Ist das in openlayers 3 möglich? Ich finde, dass ich Extents vergleichen kann, aber das Ausmaß meiner Vektorschicht ist die ganze Map. Ich muss herausfinden, ob sich die Box in einem kleineren Bereich befindet.Finden Sie heraus, ob eine Bounding Box innerhalb eines Vektorlayers in Openlayern ist. 3

Einrichten Karte und Vektorebene enthält GeoJSON:

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... 
} 

Ich habe versucht, Ausdehnungen zu vergleichen, in die Koordinaten der Region zu graben, aber es ist ein Array von Arrays von Arrays .... Weiß jemand, eine gute Möglichkeit zu überprüfen, ob die Bbox innerhalb eines der Polygone in der Regions-Ebene sein würde? Ich verwende Openlayers 3.17.1

In Openlayers-2 so gemacht wurde:

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

}

Vielen Dank im Voraus!

Antwort

0

So ähnlich?

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 */ 
     } 
    } 
} 
Verwandte Themen