2017-09-05 5 views
0

J'ai un fichier GeoJson qui a plusieurs polygones. Quelque chose comme ça.Enveloppe externe à un groupe de polygones

enter image description here

J'utilise Dépliant pour rendre ce GeoJSON dans un site Web.
Je veux dessiner un contour autour des polygones qui entourent tous les polygones. Quelque chose comme ça. enter image description here

Format de GeoJSON J'utilise:

{ 
"features": [ 
    { 
    "geometry": { 
     "coordinates": [ 
     [ 
      [ 
      1074.426, 
      -1136.986 
      ], 
      [ 
      1088.241, 
      -1123.171 
      ] 
     ] 
     ], 
     "type": "Polygon" 
    }, 
    "properties": { 
     "number": "2009", 
     "type": "", 
     "spaceid": null, 
     "alias": null, 
     "roomkey": "5/2009" 
    }, 
    "type": "Feature" 
    } 
], 
"bbox": [ 
    2445.578, 
    2445.578 
], 
"crs": { 
    "properties": { 
    "name": "urn:ogc:def:crs:OGC:1.3:CRS84" 
    }, 
    "type": "name" 
}, 
"type": "FeatureCollection" 

}

Tous les pointeurs seront utiles :) Merci

+0

-ce que les polygones que vous souhaitez envelopper les bords d'actions? Sinon, une coque convexe est votre option principale (comme décrit dans l'autre réponse). Si vos polygones partagent des arêtes, il existe des solutions potentielles qui peuvent assembler le polygone externe (et les anneaux internes) en fonction des arêtes qui ne sont pas partagées (et donc la limite externe du polygone combiné). –

Répondre

1

Votre recherche de la "coque convexe":

En mathématiques, la coque convexe ou enveloppe convexe d'un ensemble X de points dans le plan euclidien ou dans un espace euclidien (ou, plus généralement, dans un espace affine sur les nombres réels) est le plus petit ensemble convexe contenant X.

Référence: https://en.wikipedia.org/wiki/Convex_hull

Vous pouvez le faire avec Turf.js convex méthode:

Prend une entité ou une FeatureCollection et retourne un polygone de coque convexe.

Référence: http://turfjs.org/docs/#convex

Exemple:

var map = new L.Map('leaflet', {center: [0, 0], zoom: 0}); 
 

 
var collection = turf.featureCollection([ 
 
    turf.polygon([[[-80,-80],[-40,-80],[-40,-40],[-80,-40],[-80,-80]]]), 
 
    turf.polygon([[[80,80],[40,80],[40,40],[80,40],[80,80]]]) 
 
]); 
 

 
new L.GeoJSON(collection, {color: 'red'}).addTo(map); 
 

 
var polygon = turf.convex(collection); 
 

 
new L.GeoJSON(polygon, {color: 'black', 'fill': false }).addTo(map);
body { 
 
    margin: 0; 
 
} 
 

 
html, body, #leaflet { 
 
    height: 100%; 
 
}
<!DOCTYPE html> 
 
<html> 
 
    <head> 
 
    <title>Leaflet 1.2.0</title> 
 
    <meta charset="utf-8" /> 
 
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 
 
    <link type="text/css" rel="stylesheet" href="//unpkg.com/[email protected]/dist/leaflet.css" /> 
 
    </head> 
 
    <body> 
 
    <div id="leaflet"></div> 
 
    <script type="application/javascript" src="//unpkg.com/[email protected]/dist/leaflet.js"></script> 
 
    <script type="application/javascript" src="//npmcdn.com/@turf/turf/turf.min.js"></script> 
 
</script> 
 
    </body> 
 
</html>

+0

Mais la coque convexe manque les points intérieurs. Si vous envisagez un coin en forme de L .. Les deux premiers points seront choisis Si vous voyez cette image https://raw.githubusercontent.com/AndriiHeonia/hull/master/readme-imgs/1.png je ne veux pas ces espaces vides . La bordure doit longer les bords. –