2013-08-28 17 views
8

Birden çok coğrafi konumdan Çokgen Geofence nasıl oluşturulur (uzun, enlem değerleri). Ayrıca, kullanıcının nasıl izleyeceği bu coğrafi bölgeye giriyor veya bu bölgeden android üzerinden çıkıyor.Android Geofencing (Çokgen)

cevap

12

Coğrafi bir nokta, bir çokgen oluşturan basitçe lat/long noktalarıdır. Lat/long noktaları listeniz olduğunda, bir yerin çokgenin içinde olup olmadığını görmek için bir nokta-içi-çokgen kontrolünü kullanabilirsiniz.

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

program akışı açısından, bir arka plan isteyeceksiniz:

Bu

Ben çok büyük içbükey çokgen için nokta, poligon içinde denetimleri gerçekleştirmek için kendi projelerinde kullanmış kodu (20K + köşe) 'dir Konum güncellemelerini yapmak için servis yapın ve sonra konumun içeride olup olmadığını görmek için bu denetimi lat/long polygon verilerinizde yapın.

+0

Geofence ayrıca içbükey Hull olabilir. Bir geofence PHP sınıfı yazdım. – Bytemain

+0

Ah, yanlış yazdım değil mi? Bunu vurguladığın için teşekkürler. – matthewrdev

+0

Bu, saf altın IMHO. Pratik sınırlamalar, eksiklikler veya yanlışlıklar var mı? Ayrıca, bu algoritmanın bir adı var mı? – LucasM

İlgili konular