2015-08-03 22 views
6

Giả sử tôi Vẽ một polygan sử dụng tờ rơi như trong bản demo sau: http://leaflet.github.io/Leaflet.draw/Xác định xem một điểm cư trú bên trong một đa giác tờ rơi

Câu hỏi của tôi là làm thế nào tôi có thể xác định một điểm nhất định cư trú bên trong đa giác hay không.

+0

Nếu đa giác là đóng sau đó bạn có thể định hướng mọi phân đoạn (bên trong/bên ngoài). Vẽ một nửa dòng từ bất kỳ điểm nào đến vô cùng sẽ kết thúc bằng số lẻ hoặc thậm chí số đoạn giao nhau (luôn lẻ hoặc luôn luôn cho mọi hướng): thậm chí số giao điểm là điểm bên ngoài đa giác và lẻ nằm bên trong. Do đó, bạn có thể chọn bất kỳ hướng nào, ví dụ: trục x: kiểm tra các đoạn giao nhau trên '[pt.x, pt.y] - [inf, pt.y]' (bạn cũng có thể liên kết nửa dòng với hộp giới hạn của đa giác). Có tất nhiên cách để làm điều này hiệu quả hơn: https://en.wikipedia.org/wiki/Point_location – BeyelerStudios

+0

Tôi hỏi nếu có một phương pháp cho phép tôi xác định vĩ độ và kinh độ của một đa giác, và sau đó xác định xem điểm là bên trong đa giác hoặc không sử dụng javascript –

+0

Tôi đề nghị bạn nâng cao câu hỏi của mình với a) vấn đề bạn có và giải pháp mong muốn, b) mô tả đầy đủ về những gì bạn đã thử và c) mã bạn có cho đến nay – BeyelerStudios

Trả lời

19

Sử dụng các thuật toán Đúc Ray để kiểm tra nếu một điểm (marker) nằm bên trong của một đa giác:

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; 
}; 

Xem jsfiddle ví dụ.

nguồn gốc cho mã: https://github.com/substack/point-in-polygon/blob/master/index.js

+0

Cảm ơn bạn rất nhiều, làm việc tuyệt vời –

+0

@MajdiTaleb Rất vui được nghe! Vui lòng bỏ phiếu cho các câu trả lời hữu ích (và các câu hỏi hay) và đánh dấu câu trả lời giải quyết vấn đề của bạn là "được chấp nhận". Điều này sẽ giúp người dùng khác. – gusper

+0

Cảm ơn rất nhiều. Công việc thực sự tuyệt vời! – Mirage

3

Dưới đây là sửa đổi (với gợi ý @Sumit) phiên bản của @gusper câu trả lời mà làm việc cho tôi: (i có bánh rán)

 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; 
     }; 
Các vấn đề liên quan