2015-01-05 5 views
1

사용자가 네덜란드 또는 벨기에에 있는지 감지하는 방법을 찾고 있습니다. API를 호출하거나 사용자 전화 서비스를 사용하고 싶지 않으므로 모든 것을 로컬에서 수행해야하며 쉽고 빠르며 작은 점검이 있어야합니다. 각 초마다 사용자 위치를 확인하고 매분 확인하고 싶습니다.CLLocation이 Shape에 있는지 확인하십시오.

목표 : 사용자가 우리 앱으로 여행 중이며 벨기에/네덜란드에 도착했을 때 다른 시각을 보여주고 싶습니다.

네덜란드와 벨기에의 http://www.diva-gis.org/datadown에서 두 개의 모양 파일을 발견했습니다. 이 파일들은 아주 작아서 지금이 방법을 만드는 방법을 찾고 있습니다.

- (BOOL)isUserInNetherlands:(CLLocation)location; 

위치를 확인해야하는 파일은 shapefile의 내용입니다. 다음에 무엇을 나는 sqlLite 데이터베이스에 Shape 파일을 변환 할 수 있습니다

netherlands shapefile

하지만 생각 :

네덜란드의 모양 파일은 다음과 같이 보인다.

아이디어가 있으십니까?

답변

3

한 가지 방법은 다음과 같습니다

1))

2 geoJson

으로 Shape 파일을 변환 코드에서 geoJson 파일 데이터를로드합니다. 이러한 GPS 지점에서

3) 만드는 다각형 (주 : CountryDetectorController 내 컨트롤러 클래스)

+ (MKPolygon *)overlaysFromPolygons:(NSArray *)polygons title:(NSString *)title; 
{ 
    NSMutableArray *interiorPolygons = [NSMutableArray arrayWithCapacity:[polygons count] - 1]; 
    for (int i = 1; i < [polygons count]; i++) { 
     [interiorPolygons addObject:[CountryDetectorController polygonFromPoints:polygons[i] interiorPolygons:nil]]; 
    } 

    MKPolygon *overlayPolygon = [CountryDetectorController polygonFromPoints:polygons[0] interiorPolygons:interiorPolygons]; 
    overlayPolygon.title = title; 


    return overlayPolygon; 
} 

+ (MKPolygon *)polygonFromPoints:(NSArray *)points interiorPolygons:(NSArray *)polygons; 
{ 
    NSInteger numberOfCoordinates = [points count]; 
    CLLocationCoordinate2D *polygonPoints = malloc(numberOfCoordinates * sizeof(CLLocationCoordinate2D)); 

    NSInteger index = 0; 
    for (NSArray *pointArray in points) { 
     polygonPoints[index] = CLLocationCoordinate2DMake([pointArray[1] floatValue], [pointArray[0] floatValue]); 
     index++; 
    } 

    MKPolygon *polygon; 

    if (polygons) { 
     polygon = [MKPolygon polygonWithCoordinates:polygonPoints count:numberOfCoordinates interiorPolygons:polygons]; 
    } else { 
     polygon = [MKPolygon polygonWithCoordinates:polygonPoints count:numberOfCoordinates]; 
    } 
    free(polygonPoints); 

    return polygon; 
} 

4) 다각형

+ (CGPathRef)pathForPolygon:(MKPolygon*)aPolygon; 
{ 
    CGMutablePathRef mpr = CGPathCreateMutable(); 

    MKMapPoint *polygonPoints = aPolygon.points; 
    size_t nCount = aPolygon.pointCount; 

    for (int p = 0; p < nCount; p++) 
    { 
     MKMapPoint mp = polygonPoints[p]; 

     if (p == 0) 
      CGPathMoveToPoint(mpr, NULL, mp.x, mp.y); 
     else 
      CGPathAddLineToPoint(mpr, NULL, mp.x, mp.y); 
    } 

    return mpr; //Keep in memory; 
} 

5에서 CGPath을 만들 수)에 좌표 있는지 확인하다 CGPath (pathsBelgium은 CGPaths의 NSValue가있는 배열입니다.)

- (void)checkCoordinate:(CLLocationCoordinate2D)coordinate; 
{ 
    MKMapPoint mapPoint = MKMapPointForCoordinate(coordinate); 
    CGPoint mapPointAsCGP = CGPointMake(mapPoint.x, mapPoint.y); 

    BOOL userIsInBelgium = FALSE; 
    for(NSValue *valuePathBE in pathsBelgium) 
    { 
     CGPathRef pathBe; 
     [valuePathBE getValue:&pathBe]; 

     BOOL pointInBelgium = CGPathContainsPoint(pathBe, NULL, mapPointAsCGP, FALSE); 
     if(pointInBelgium) 
     { 
      userIsInBelgium = TRUE; 
      break; 
     } 
    } 

    NSLog(@"User is in Belgium: %i", userIsInBelgium); 
} 
0

더 간단한 방법은 사용자 위치를 얻은 다음 역 지오 코딩을 수행하는 것입니다. 그런 다음 모든 작업을 스스로하는 대신 Apple의 API에서 국가를 추출 할 수 있습니다. 여기 더 :이 작업을 수행하는 https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/UsingGeocoders/UsingGeocoders.html

+0

고맙지 만 사용하지 않고 API 호출. 여기서 인터넷은 다른 웹 서비스에 대한 호출없이 사용됩니다. 이유는 데이터 트래픽을 가능한 한 낮게 유지하기 (해외 데이터 트래픽)이며 인터넷 없이도 작동해야한다는 것입니다. –

+0

죄송합니다. 이 작업에 대한 데이터 트래픽은 매우 적지 만 충분히 공정 할 것입니다. – shim

+0

사용자가 벨기에/네덜란드에 있는지 아닌지에 대해서만 신경을 씁니까, 그렇지 않은 경우 사용자가 전혀 신경 쓰지 않습니까? 그렇다면 각 국경에서 가장 먼 지점까지 근접성을 테스트 할 수 있습니다. – shim