1 votos

Cómo obtener sólo el polígono intersecado en Open Layers 3

Estoy intentando dibujar una línea en un polígono que quiero dividir, Ejemplo: Quiero dividir 616 polígonos como se muestra en la imagen

enter image description here

con el siguiente código, cuando se trata de obtener la intersección de polígonos, se obtienen 616, 617, 615 y los caminos adyacentes a 616. Pero sólo quiero 616, que está cortado por una línea.

draw.on('drawend', function (evt) {
                    var plcd = [], featureGeom;
                    var justNowFeature = evt.feature;
                    var line = evt.feature.getGeometry();
                     featureGeom = justNowFeature.getGeometry().getCoordinates();

                    console.log("FEATURESGEOJSON  " + featureGeom);
                    var features = plotboundary_layer.getSource().getFeatures();
                    for (var i = 0; i < features.length; i++) {
                        if (line.intersectsExtent(features[i].getGeometry().getExtent())) {
                            plcd.push(features[i].values_.plcd);
                        }
                    }
                });

3voto

hood Puntos 16

Hay dos problemas con su enfoque. El primer problema es que está comprobando la intersección de la línea con la extensión de la característica, que es el rectángulo más pequeño que abarca toda la característica. Por eso también se obtienen carreteras.

El segundo problema es que la línea cruza también características vecinas, por eso se obtienen los polígonos 615 y 617. Esto podría resolverse si intersectsExtent daría el número de puntos donde la línea interseca el polígono, pero sólo devuelve verdadero/falso.

Biblioteca Césped.js puede ayudar aquí. Método turf.lineIntersect te da la geometría que es la intersección de la línea y la geometría. No hay extensión involucrada aquí y desde la geometría resultante se pueden contar los puntos de intersección. Si el recuento es divisible por 2, la línea cruza el polígono.

El código sería entonces algo así:

var geoJSON = new ol.format.GeoJSON();
var plcd = [];

draw.on('drawend', function (evt) {
  var intersectPoints, nPoints, featureGeoJSON, featureGeometry, lineGeoJSON, lineGeometry;
  lineGeoJSON = geoJSON.writeFeatureObject(evt.feature);
  lineGeometry = turf.getGeom(lineGeoJSON);
  var features = plotboundary_layer.getSource().getFeatures();
  for (var i = 0; i < features.length; i++) {
    featureGeoJSON = geoJSON.writeFeatureObject(features[i]);
    featureGeometry = turf.getGeom(featureGeoJSON);
    intersectPoints = turf.lineIntersect(featureGeometry, lineGeometry);
    nPoints = intersectPoints.features.length;
    if ((nPoints > 0) && ((nPoints % 2) == 0)) {
      plcd.push(features[i].values_.plcd);
    }
  }
});

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