2013-08-28 2 views
8

여러 지리적 위치 (long, lat 값)에서 다각형 지오 펜스를 작성하는 방법. 또한 사용자를 추적하는 방법은이 지오 펜스 영역에 들어가거나 안드로이드에서이 영역을 빠져 나옵니다.Android 지오 펜싱 (다각형)

답변

12

지오 펜스는 단순히 다각형을 구성하는 위도/경도의 배열입니다. 위도/경도 점 목록을 얻은 후에는 점 내부 안쪽 체크를 사용하여 위치가 다각형 내에 있는지 확인할 수 있습니다.

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

프로그램 흐름의 측면에서, 당신은 배경을 원할 것입니다 :

내가 매우 큰 오목 다각형에 대한 포인트 - 인 - 다각형 검사를 수행하기 위해 내 자신의 프로젝트에서 사용했던 코드 (20K + 정점)이다 서비스를 사용하여 위치 업데이트를 수행 한 다음 위도/경도 폴리곤 데이터에 대해이 검사를 수행하여 위치가 내부인지 확인합니다.

+0

Geofence는 오목한 선체 일 수도 있습니다. 지오 펜스 PHP 클래스를 작성했습니다. – Bytemain

+0

아, 내가 잘못 쓴거야? 그 점을 강조해 주셔서 감사합니다. – matthewrdev

+0

이것은 순수한 IMHO입니다. 실용적인 제한 사항, 단점 또는 부정확성이 있습니까? 또한,이 알고리즘은 이름을 가지고 있습니까? – LucasM