2013-08-19 3 views
6

다음 작업을 수행하고 싶습니다. 가능한지 여부를 알지 못합니다. 나는 도로 상에 두 지점을 가지고 있습니다 (마무리 선을 상상해보십시오 - 포장 도로의 두 모서리입니다 - 직선입니다). 사용자의 경로가이 지점을 통과했는지 확인하고 싶습니다. IOS 프로젝트에서 두 개의 Google지도 경로가 교차하는지 확인하는 방법

  • 는 사용자의 경로를 얻을 - (도로 대부분에서 20m 폭 그들이 아주 가까이 있습니다)

    1. 이 두 점 사이의 경로를 얻을 :

      그래서 나는 이런 식으로 뭔가를 할 수있는, 생각

    2. 이들 경로가 교차하는지 확인하십시오.

    순수한 기하학이라면 쉽습니다. 나는 두 선을 가지고 있고 그들 사이에 어떤 교차점이 있는지 알고 싶다.

    차이점이 있으면 IOS 프로젝트에서 다음을 사용하고 싶습니다. 예를 들어, 아마도 MKPolylines를 그려 교차로가 있는지 프로그래밍 방식으로 볼 수 있다고 생각했습니다. 나는 그것을 시각적으로보고 싶지 않다, 나는 단지 그것을 프로그램 적으로 필요로한다.

    가능합니까? 나에게 다른 것을 제안 해 줄 수 있니?

  • +0

    사용자가 그 행 (위치 서비스를 통한 실제 위치) 또는 사용자에게 길 찾기를 허용하고 이러한 길의 경로가 특정 줄을 통과하는지 알아 내려고 시도하고 있습니까? –

    +0

    @TimBodeit 사용자가 줄을 넘었는지 찾아야합니다 (예 : 마무리 줄을 통과 한 경우) – ghostrider

    답변

    3

    해당 교차점을 직접 확인할 방법이 없습니다.

    위도/경도 위치를지도 위치로 변환하여 문제를 도형 문제로 바꿀 수 있습니다 (변환을 표준화 된 격자로 전개). 이것은 MKMapPointForCoordinate으로 할 수 있습니다.

    고려해야 할 한 가지는 GPS보고 위치의 부정확성입니다. 많은 경우에 GPS에서보고 된 경로가 실제로 길 위에 있지는 않지만 길 옆에서 달리고 있다는 것을 알 수 있습니다. 특히 코너를 돌릴 때 트랙에서 커브가 커집니다. 따라서이를 보완하기 위해 '마무리 선'의 너비를 늘려야 할 수 있습니다.


    당신은 사용자가 설정 점의 일정한 거리 내에 있는지 여부를 다음 대상 위치를 나타 내기 위해 CLRegion을 만든 다음 현재 사용자의 위치에 containsCoordinate: 전화를 걱정합니다. 이렇게하면 모든 투영법이 제거되고 lat/long을 직접 사용합니다. startMonitoringForRegion:desiredAccuracy:으로 사용자가 지역을 입력하거나 종료 할 때 콜백을 제공하기 위해 시스템을 모니터링 할 수도 있습니다. 다시 말하지만, 반경을 설정할 때 GPS 정확도를 고려해야합니다.

    단계 CGPoint 각 좌표 사용자의 트랙이있다 1. 변환하고 그것을 배열을 저장

    +0

    사실 교차로인지 여부는 신경 쓰지 않습니다. 사용자가 특정 지점을 통과했는지 여부를 확인하고자합니다 (예 : 한 지점에서 반경을 설정하고 사용자의 위치가이 반경 내에 있는지 확인할 수있는 경우). 교차로를 확인하는 것보다 쉬운가요? – ghostrider

    2

    나는 3 단계로이 문제를 해결하려고한다.

    // in viewDidLoad 
    locManager = [[CLLocationManager alloc] init]; 
    [locManager setDelegate:self]; 
    [locManager setDesiredAccuracy:kCLLocationAccuracyBest]; 
    [locManager startPdatingLocation]; 
    self.userCoordinatePoints = [NSMutableArray alloc]init]; 
    
    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    
        CLLocationCoordinate2D loc = [newLocation coordinate]; 
        CGPoint *currentPoint = [self.mapView convertCoordinate:loc toPointToView:self.mapView]; 
        // add points to array 
        self.userCoordinatePoints addObject:currentpoint]; 
    } 
    

    2 단계.

    - (MKOverlayView*)mapView:(MKMapView*)theMapView 
          viewForOverlay:(id <MKOverlay>)overlay 
    { 
        MKPolylineView *overlayView = [[MKPolylineView alloc] 
               initWithOverlay:overlay]; 
        overlayView.lineWidth = 3; 
        overlayView.strokeColor = [[UIColor blueColor]colorWithAlphaComponent:0.5f]; 
        // overlayView.fillColor = [[UIColor purpleColor] colorWithAlphaComponent:0.1f]; 
        path = overlayView.path; 
        return overlayView; 
    } 
    

    3 단계 : CGPathRef
    MKPolylineView 변환하면 두 점 사이의 경로를 생성하기 위해 구현해야합니다 CGPathRef

    { 
        CGPathRef path; 
    } 
    

    이 방법 형식의 클래스 변수를 만들고 확인하는 사용자 정의 방법을 만들기 포인트가 CG 패스에 있는지 여부

    - (BOOL)userRouteIntersectsGoogleRoute 
    { 
    // Loop through all CGPoints 
        for(CGPoint point in self.userCoordinatePoints) 
    { 
        BOOL val = CGPathContainsPoint(path, NULL, point); 
        if(val) 
        { 
        return YES; 
        } 
    } 
    return NO; 
    } 
    
    +0

    감사합니다. 나는 그것을 시도해 볼 것이고, 그것이 효과가 있다면 대답을 받아 들일 것입니다! – ghostrider

    관련 문제