2013-08-28 37 views
8

Cách tạo Geofence Polygon từ nhiều vị trí địa lý (giá trị dài, lat). Ngoài ra cách theo dõi người dùng đang nhập vào khu vực địa lý này hoặc thoát khỏi khu vực này trên android.Android Geofencing (Đa giác)

Trả lời

12

Geofence đơn giản là một mảng các điểm vĩ độ/dài tạo thành đa giác. Khi bạn có danh sách các điểm vĩ độ/điểm dài, bạn có thể sử dụng kiểm tra điểm-bên trong đa giác để xem vị trí có nằm trong đa giác hay không.

Đây là mã tôi đã sử dụng trong các dự án của riêng tôi để thực hiện kiểm tra point-in-polygon cho đa giác lõm rất lớn (20K + đỉnh):

public class PolygonTest 
{ 
    class LatLng 
    { 
     double Latitude; 
     double Longitude; 

     LatLng(double lat, double lon) 
     { 
      Latitude = lat; 
      Longitude = lon; 
     } 
    } 

    bool PointIsInRegion(double x, double y, LatLng[] thePath) 
    { 
     int crossings = 0; 

     LatLng point = new LatLng (x, y); 
     int count = thePath.length; 
     // for each edge 
     for (var i=0; i < count; i++) 
     { 
      var a = thePath [i]; 
      var j = i + 1; 
      if (j >= count) 
      { 
       j = 0; 
      } 
      var b = thePath [j]; 
      if (RayCrossesSegment(point, a, b)) 
      { 
       crossings++; 
      } 
     } 
     // odd number of crossings? 
     return (crossings % 2 == 1); 
    } 

    bool RayCrossesSegment(LatLng point, LatLng a, LatLng b) 
    { 
     var px = point.Longitude; 
     var py = point.Latitude; 
     var ax = a.Longitude; 
     var ay = a.Latitude; 
     var bx = b.Longitude; 
     var by = b.Latitude; 
     if (ay > by) 
     { 
      ax = b.Longitude; 
      ay = b.Latitude; 
      bx = a.Longitude; 
      by = a.Latitude; 
     } 
      // alter longitude to cater for 180 degree crossings 
     if (px < 0) { px += 360; }; 
     if (ax < 0) { ax += 360; }; 
     if (bx < 0) { bx += 360; }; 

     if (py == ay || py == by) py += 0.00000001; 
     if ((py > by || py < ay) || (px > Math.max(ax, bx))) return false; 
     if (px < Math.min(ax, bx)) return true; 

     var red = (ax != bx) ? ((by - ay)/(bx - ax)) : float.MAX_VALUE; 
     var blue = (ax != px) ? ((py - ay)/(px - ax)) : float.MAX_VALUE; 
     return (blue >= red); 
    } 
} 

Xét về dòng chương trình, bạn sẽ muốn có một nền dịch vụ để cập nhật vị trí và sau đó thực hiện kiểm tra này đối với dữ liệu đa giác lat/dài của bạn để xem vị trí có ở bên trong hay không.

+0

Geofence cũng có thể lõm Hull. Tôi đã viết một lớp PHP địa lý. – Bytemain

+0

Ah, tôi đã viết sai rồi phải không? Cảm ơn vì đã nêu bật điều đó. – matthewrdev

+0

Đây là IMHO vàng nguyên chất. Nó có bất kỳ hạn chế thực tế, thiếu sót hoặc không chính xác nào không? Ngoài ra, thuật toán này có tên không? – LucasM