2015-08-03 20 views
6

nehme ich eine polygan Draw Faltblatt mit wie in der Follow-Demo: http://leaflet.github.io/Leaflet.draw/Bestimmen Sie, ob ein Punkt innerhalb einer Broschüre Polygon befinden

Meine Frage ist, wie ich, ob ein gegebener Punkt innerhalb des Polygons oder nicht aufzuhalten bestimmen kann.

+0

Wenn das Polygon geschlossen dann können Sie jedes Segment (innen/außen) orientieren. Das Zeichnen einer halben Linie von einem beliebigen Punkt bis unendlich ergibt sich aus einer ungeraden oder geraden Anzahl von Segmentüberschneidungen (immer ungerade oder immer gerade für jede Richtung): gerade Anzahl von Überschneidungen sind Punkte außerhalb des Polygons und ungerade sind innen. Sie können also eine beliebige Richtung wählen, z. die X-Achse: Überprüfen Sie, ob sich Segmente in '[pt.x, pt.y] - [inf, pt.y]' schneiden (Sie können auch die halbe Linie an die Begrenzungsbox des Polygons binden). Es gibt natürlich Möglichkeiten, dies effizienter zu tun: https://en.wikipedia.org/wiki/Point_location – BeyelerStudios

+0

Ich frage, ob es eine Methode gibt, mit der ich die Breite und die Länge eines Polygons bestimmen und dann bestimmen kann, ob Punkt ist innerhalb des Polygons oder nicht mit Javascript –

+0

Ich schlage vor, Sie verbessern Ihre Frage mit a) das Problem, das Sie haben und erwartete Lösung Sie wollen, b) eine vollständige Beschreibung, was Sie versucht haben und c) den Code, den Sie bisher – BeyelerStudios

Antwort

19

das Ray Casting-Algorithmus verwenden zum Prüfen, ob ein Punkt (Marker) innerhalb eines Polygons liegt:

function isMarkerInsidePolygon(marker, poly) { 
    var polyPoints = poly.getLatLngs();  
    var x = marker.getLatLng().lat, y = marker.getLatLng().lng; 

    var inside = false; 
    for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) { 
     var xi = polyPoints[i].lat, yi = polyPoints[i].lng; 
     var xj = polyPoints[j].lat, yj = polyPoints[j].lng; 

     var intersect = ((yi > y) != (yj > y)) 
      && (x < (xj - xi) * (y - yi)/(yj - yi) + xi); 
     if (intersect) inside = !inside; 
    } 

    return inside; 
}; 

jsfiddle Siehe zum Beispiel.

Ursprüngliche Quelle für den Code: https://github.com/substack/point-in-polygon/blob/master/index.js

+0

Vielen Dank sehr viel, arbeite super –

+0

@MajdiTaleb Schön zu hören! Bitte wähle hilfreiche Antworten (und gute Fragen) und markiere die Antwort, die dein Problem löst, als "akzeptiert". Dies wird anderen Benutzern helfen. – gusper

+0

Vielen Dank. Wirklich tolle Arbeit! – Mirage

3

Hier wird das modifizierte (mit @Sumit Hinweise) Version von @gusper Antwort, die für mich gearbeitet: (i Donuts hatte)

 function isMarkerInsidePolygon(marker, poly) { 
      var inside = false; 
      var x = marker.getLatLng().lat, y = marker.getLatLng().lng; 
      for (var ii=0;ii<poly.getLatLngs().length;ii++){ 
       var polyPoints = poly.getLatLngs()[ii]; 
       for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) { 
        var xi = polyPoints[i].lat, yi = polyPoints[i].lng; 
        var xj = polyPoints[j].lat, yj = polyPoints[j].lng; 

        var intersect = ((yi > y) != (yj > y)) 
         && (x < (xj - xi) * (y - yi)/(yj - yi) + xi); 
        if (intersect) inside = !inside; 
       } 
      } 

      return inside; 
     };