Compruebe si un punto de polígono está dentro de otro en el folleto

Tengo dos sets de coorderadas de polígono seleccionadas del map geoJSON del folleto. Las coorderadas padre e hijo son coorderadas son:

var parentCoordinates=[ [ 32.05898221582174, -28.31004731142091 ], [ 32.05898221582174, -28.308044824292978 ], [ 32.06134255975485, -28.308044824292978 ], [ 32.06134255975485, -28.31004731142091 ], [ 32.05898221582174, -28.31004731142091 ] ] var childCoordinates=[ [ 32.059904895722866, -28.30970726909422 ], [ 32.059904895722866, -28.308743809931784 ], [ 32.06089194864035, -28.308743809931784 ], [ 32.06089194864035, -28.30970726909422 ], [ 32.059904895722866, -28.30970726909422 ] ] 

El niño se dibuja dentro del área principal como se muestra en la image: enter image description here

Usando el algorithm Ray Casting para determinar si el punto se encuentra dentro del polígono, no puedo determinarlo ya que el resultado que obtengo es falso. Por favor, hágame saber dónde estoy haciendo mal o de otra manera para determinar la solución. Gracias

Intenté con su algorithm y encontré otro aquí https://rosettacode.org/wiki/Ray-casting_algorithm y ambos devolvían el valor correcto.

Quizás este violín te puede ayudar en la implementación:

https://jsfiddle.net/4psL2hoo/1/

Tu algo

 // Data var parentCoordinates=[ [ 32.05898221582174, -28.31004731142091 ], [ 32.05898221582174, -28.308044824292978 ], [ 32.06134255975485, -28.308044824292978 ], [ 32.06134255975485, -28.31004731142091 ], [ 32.05898221582174, -28.31004731142091 ] ] var childCoordinates=[ [ 32.059904895722866, -28.30970726909422 ], [ 32.059904895722866, -28.308743809931784 ], [ 32.06089194864035, -28.308743809931784 ], [ 32.06089194864035, -28.30970726909422 ], [ 32.059904895722866, -28.30970726909422 ] ] // Other algo function test(point, vs) { // ray-casting algorithm based on // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html var x = point[0], y = point[1]; var inside = false; for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) { var xi = vs[i][0], yi = vs[i][1]; var xj = vs[j][0], yj = vs[j][1]; var intersect = ((yi > y) != (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi); if (intersect) inside = !inside; } return inside; }; for (var i = 0; i < childCoordinates.length; i++) { var testPoint = childCoordinates[i]; console.log(JSON.stringify(testPoint) + '\tin parentCoordinate\t' + test(testPoint, parentCoordinates)); } 

Código Rosetta algo

 //https://rosettacode.org/wiki/Ray-casting_algorithm function contains(bounds, lat, lng) { //https://rosettacode.org/wiki/Ray-casting_algorithm var count = 0; for (var b = 0; b < bounds.length; b++) { var vertex1 = bounds[b]; var vertex2 = bounds[(b + 1) % bounds.length]; if (west(vertex1, vertex2, lng, lat)) ++count; } return count % 2; /** * @return {boolean} true if (x,y) is west of the line segment connecting A and B */ function west(A, B, x, y) { if (Ay <= By) { if (y <= Ay || y > By || x >= Ax && x >= Bx) { return false; } else if (x < Ax && x < Bx) { return true; } else { return (y - Ay) / (x - Ax) > (By - Ay) / (Bx - Ax); } } else { return west(B, A, x, y); } } } var square = {name: 'square', bounds: [{x: 32.05898221582174, y: -28.31004731142091}, {x: 32.05898221582174, y: -28.308044824292978}, {x: 32.06134255975485, y: -28.308044824292978}, {x: 32.06134255975485, y: -28.31004731142091}]}; var shapes = [square]; var testPoints = [{lng: 32.059904895722866, lat: -28.30970726909422}, {lng: 32.059904895722866, lat: -28.308743809931784}, {lng: 32.06089194864035, lat: -28.308743809931784}, {lng: 32.06089194864035, lat: -28.30970726909422}]; for (var s = 0; s < shapes.length; s++) { var shape = shapes[s]; for (var tp = 0; tp < testPoints.length; tp++) { var testPoint = testPoints[tp]; console.log(JSON.stringify(testPoint) + '\tin ' + shape.name + '\t' + contains(shape.bounds, testPoint.lat, testPoint.lng)); } } 

He tenido una buena experiencia con Turf . Funciona bien, está bien documentado y los ejemplos ya se muestran con un folleto.

Para su problema, puede usar turf.within con parentCoordinates como turf.polygon y childCoordinates como una matriz de turf.point :

 var parentPolygon = turf.polygon([parentCoordinates]); var inside = true; childCoordinates.forEach(function(coordinates) { point = turf.point(coordinates); if (!turf.inside(point, parentPolygon)){ alert("Oh no! "+ coordinates + " isn't in polygon"); inside = false; } }); alert("Child polygon inside parent polygon ? " + inside); 

Aquí hay un ejemplo de Fiddle.

Puedes probar la API de Leaflet para eso – contains . Usted crea un polígono padre con LatLngBounds y luego también hijo.

 parentPolygon.contains(childPolygon) 
    Intereting Posts