Questa polilinea passa attraverso questo poligono?
-
28-10-2019 - |
Domanda
Sto provando a verificare se una polilinea di Google Maps passa attraverso un poligono di Google Maps.Sembra semplice.Ma ho cercato e cercato ... e non ho trovato risposte reali.
Il più vicino che ho ottenuto è stata questa funzione.Funziona ma, in modo frustrante, restituisce occasionalmente falsi positivi.
//nvert = the number of points in the polygon
//vertx = an array of all the polygon's latitudes
//verty = an array of all the polygon's longitudes
//elat = the current point's latitude
//elng = the current point's longitude
function pnpoly( nvert, vertx, verty, elat, elng) {
var i, j, c = false;
for( i = 0, j = nvert-1; i < nvert; j = i++ ) {
if( ( ( verty[i] > elng ) != ( verty[j] > elng ) ) &&
( elat < ( vertx[j] - vertx[i] ) * ( elng - verty[i] ) / ( verty[j] - verty[i] ) + vertx[i] ) ) {
c = !c;
}
}
return c;
}
Prima di provare un metodo completamente nuovo (un ' pazza idea di matematica che portaritorno al calcolo del grado 12), mi chiedo che qualcuno sappia come farlo.
Soluzione
Ho trovato una soluzione funzionante.
https://github.com/albertsun/JavaScript-Geometry
Questo pacchetto di geometria include una funzione chiamata findIntersections()
.
Ho eseguito un ciclo $.each
su ogni poligono della mappa, quindi ho inserito ogni punto del poligono in un array, quindi ogni punto della polilinea in un array.Infine, ho eseguito due cicli e ho inserito le coordinate latitudine / longitudine nelle variabili per la funzione.Restituisce vuoto quando non trova nulla e restituisce le coordinate di intersezione quando trova qualcosa.
function processPath(polyline, polygons){
$.each(polygons, function(i,polygon){
var polygonArr = [] // array for storing each point in polygon
polygon.getPaths().forEach(function(k,g){
$.each(k.b, function(l,m){
polygonArr.push({'lat':m.lat(),'lng':m.lng()});
});
});
//Get the number of points in the polyLINE
var numStops = polyline.getPath().b.length -1;
//Get the path and coordinates of the polyLINE
var polylineArr = [];
polyline.getPath().forEach(function(z,y){
polylineArr.push({'lat':z.lat(),'lng':z.lng()});
});
$.each(polygonArr, function(j, polygon){
$.each(polylineArr, function(k, polyline){
if(k+1 != polylineArr.length){
var lineCoor1x = polylineArr[k].lat;
var lineCoor1y = polylineArr[k].lng;
var lineCoor2x = polylineArr[k+1].lat;
var lineCoor2y = polylineArr[k+1].lng;
var polyCoorx = polygonArr[j].lat;
var polyCoory = polygonArr[j].lng;
if(j+1 == polygonArr.length){
// We've reached the end, go back to the start
var polyCoorNextx = polygonArr[0].lat
var polyCoorNexty = polygonArr[0].lng
} else {
// Go to the next point
var polyCoorNextx = polygonArr[j+1].lat
var polyCoorNexty = polygonArr[j+1].lng
}
if(findIntersections([[[lineCoor1x,lineCoor1y], [lineCoor2x,lineCoor2y]], [[polyCoorx,polyCoory],[polyCoorNextx,polyCoorNexty]] ]).length != 0){
whereInside[i] = i;
return;
}
}
})
})
Probabilmente è un po 'complicato ma funziona.