2016-10-24 5 views
1

Il s'agit du frontend. J'utilise turf.js.Turf.js Tampon à intersections avec Polygon, MultiPolygon, GeometryCollection

Scénario: Obtenez tous les avertissements et les incidents dans un rayon de 10km de ma position actuelle.

Je reçois en direct le flux geojson qui contient des avertissements ou des incidents avec beaucoup de fonctionnalités dont certaines ont leur geometry.type='Point' || geometry.type='MultiPolygon' || geometry.type='GeometryCollection'.

Ce que je l'ai fait jusqu'à présent:

Créer une zone tampon de fonction avec mes coordonnées actuelles et comparer si un incident est survenu près de moi (10 km).

Si geometry.type = 'Point' je compare en utilisant turf.inside (point, bufferPolygon), et cela fonctionne très bien. Le défi est quand ce n'est pas un point, disons un MultiPolygon ou un GeometryCollection qui contient des MultiPolygons.

La seule autre méthode que je peux utiliser pour trouver qui accepte les polygones dans les deux paramètres est turf.intersect(polygon, bufferPolygon).

Ici, je ne suis pas geometry.type ='Polygon' dans mon alimentation, mais il est un MultiPolygon ou GeometryCollection (ayant Multipolygones).

if(feature.geometry.type === 'Point') { 
    if(turf.inside(feature, bufferPolygon)) { 
     console.log("inside"); 
     feature.properties.feedType === 'warning' ? warningsNearBy++ : incidentsNearBy++; 
    } 
} else { 
    if(feature.geometry.type === 'GeometryCollection') { 
     $.each(feature.geometry.geometries, function(index, geo) { 
      if(geo.type === 'MultiPolygon') { 
       //console.log('MP:', geo.coordinates[0]); 
       var convertToPolygon = turf.polygon(geo.coordinates[0]); 
       console.log('convertToPolygon:',convertToPolygon); 
       //console.log('MP:intersect',turf.intersect(polygon, bufferPolygon)); 
       var isIntersecting = turf.intersect(convertToPolygon, bufferPolygon); 
       if(isIntersecting) { 
        feature.properties.feedType === 'warning' ? warningsNearBy++ : incidentsNearBy++; 
       } 
      } else if(geo.type === 'GeometryCollection') { 
       console.log('GC:', geo); 
      } 
     }); 
    } else { 
     console.log('not geo collection:', feature.geometry.type); 
    } 
} 

De même, essayé de convertir un multiPolygon en polygone, cela ne fonctionnait pas très bien. Peut-on suggérer un moyen de comparer un bufferFeature avec un ensemble de collection de caractéristiques ayant un point, multipolygon et GeometryCollection?

Répondre

1

Une chose que vous pourriez faire si cela ne vous dérange pas de comparer le tampon à plusieurs points est l'utilisation turf.explode() sur les polygones/multipolygones. Voici un lien vers la documentation.

http://turfjs.org/examples/turf-explode/

Turf exploser tournera polygones ou multipolygones dans une collection caractéristique de points qui représentent les sommets de la forme. Une fois que vous avez exécuté turf.explode() sur les polygones/multipolygones, vous devrez ensuite parcourir chaque fonction (point) dans les résultats et la comparer avec le tampon en utilisant turf.inside(). Il serait probablement plus facile d'utiliser turf.within() pour cette partie, mais vous pouvez utiliser turf.inside() à la place si vous le souhaitez.

Cela fonctionne parce que si l'un des points est à l'intérieur du tampon, alors au moins une partie du polygone représenté par les points aurait également été dans la zone tampon.

Une autre façon d'y parvenir serait d'utiliser un point au lieu d'un tampon pour comparer les distances. Ensuite, si vous aviez un point, vous pourriez simplement utiliser turf.distance() avec les deux points pour voir la distance entre eux. Si vous avez des polygones/multipolygones alors vous pouvez les comparer et comparer les distances avec votre point d'origine. En ce qui concerne les collections de géométrie, je ne pense pas que vous puissiez travailler avec ceux qui utilisent le gazon, sauf si vous séparez les différentes parties de la collection de géométrie dans des collections de caractéristiques distinctes par type.

0

aussi, essayé de convertir un multipolygone à un Polygon, ne fonctionnait pas bien .

Pourquoi cela n'a-t-il pas fonctionné? Pourriez-vous expliquer cela plus en détail? Un multipolygone ou un polygone n'est rien d'autre qu'une collection de points. Vous devriez être capable de le convertir en un tableau de points ou un tableau contenant des caractéristiques de points.

Vous pouvez faire quelque chose comme ceci:

function unpackMultiPolCoords(features) { 
    var data = []; 
    featureEach(features, function(feature) { 
    var coordCollection = feature.geometry.coordinates; 
    coordCollection.forEach(function(coords) { 
     coords.forEach(function(coord) { 
     data.push(coord); 
     }); 
    }); 
    }); 
    return data; 
}; 

var unpacked = unpackMultiPolCoords(multiPoly); 

let toPoints = function(fc) { 
    let points = []; 
    fc.forEach((coord) => { 
    points.push(turf.point(coord)); 
    }); 
    return points; 
}; 

var points = toPoints(unpacked); 

Voir code complet @http://codepen.io/bitHugger/pen/mOxwME

Ensuite, vous pouvez comparer tous les points avec la fonction de la distance de gazons à votre tampon.