2017-01-31 4 views
4

Я хочу проверить, не входит ли кто-либо в выделенную границу, тогда я должен предупредить этого пользователя, как «Вы введены», и когда пользователь уходит, то «Вы ушли». Я использую файл .KML для границы чертежа, в котором есть больше, чем широта и долгота. Здесь я приложил скриншот к тому же. Итак, я беспокоюсь, что как я могу обнаружить, что кто-то вводится в пределах этой границы и уходит с этой границы. Заранее спасибо enter image description here Граница выглядит так. Красная линия цвета - это граница.Как проверить, что кто-либо вводит/оставляет в/из конкретной граничной области, даже если приложение находится в фоновом режиме или режиме kill?

+0

Уже предложено до: http://stackoverflow.com/questions/35457480/determine-if-a-gps-location-is-within-a-gpx-track-segment –

+0

Возможный дубликат [Определить, если GPS местоположение находится в сегменте дорожки gpx] (http://stackoverflow.com/questions/35457480/determine-if-a-gps-location-is-within-a-gpx-track-segment) –

+0

@AndreasOetjen благодарит вас за ваш комментарий. Но кажется, что ответ на вопрос, который вы упомянули, больше не доступен. Я уже видел этот вопрос, но кажется, что я использую файл .kml и разбор с использованием кода парсера kml, предоставленного Apple, не использующего файл .gpx. – Birju

ответ

0

Использовать карту прямоугольников. Вот пример использования текущего видимого прямоугольника карты. Что касается вашего вопроса, вы можете использовать convertRegion: toRectToView: сначала конвертировать ваш регион в MKMapRect заранее.

MKMapPoint userPoint = MKMapPointForCoordinate(mapView.userLocation.location.coordinate); 
MKMapRect mapRect = mapView.visibleMapRect; // find visible map rect 
//MKMapRect mapRect = [self getMapRectUsingAnnotations:arrCordinate];//find custom map rect 
BOOL inside = MKMapRectContainsPoint(mapRect, userPoint); 

MKMapRect mapRect = mapView.visibleMapRect; Создайте свой собственный mapRect с помощью пограничной области с многократной широты и долготы

- (MKMapRect) getMapRectUsingAnnotations:(NSArray*)arrCordinate { 

    MKMapPoint points[[arrCordinate count]]; 

    for (int i = 0; i < [arrCordinate count]; i++) { 
     points[i] = MKMapPointForCoordinate([arrCordinate[i] MKCoordinateValue]); 
    } 

    MKPolygon *poly = [MKPolygon polygonWithPoints:points count:[arrCordinate count]]; 

    return [poly boundingMapRect]; 
} 
+0

Благодарим вас за ответ на мой вопрос. В вашем ответе я думаю, что я должен каждый раз проверять, где находится местоположение пользователя, в макете или нет. Есть ли другой способ проверить, если условие больше? Например, CLLocationManager имеет собственный метод didEnterRegion и didExitRegion. – Birju

+0

У меня нет собственного метода, но с помощью метода doUpdateToLocation можно это сделать. - (void) locationManager: (CLLocationManager *) manager didUpdateToLocation: (CLLocation *) newLocation fromLocation: (CLLocation *) oldLocation; –

+0

Если я должен проверять каждый раз в файле doUpdateToLocation, тогда это работает, если мое приложение находится в режиме kill? – Birju

0

Попробуйте этот код. Это основано на алгоритме числа обмоток. Это работает для сложных форм, таких как красная линия.

typedef struct { 
    double lon; 
    double lat; 
} LATLON; 

// returns true if w/in region 
bool chkInRegion(LATLON poi, int npoi, LATLON *latlon) 
{ 
    int wn = 0; 
    for (int i = 0 ; i < npoi-1 ; i++) { 
    if (latlon[i].lat <= poi.lat && latlon[i+1].lat > poi.lat) { 
     double vt = (poi.lat - latlon[i].lat)/(latlon[i+1].lat - latlon[i].lat); 
     if (poi.lon < (latlon[i].lon + (vt * (latlon[i+1].lon - latlon[i].lon)))) { 
     wn++; 
     } 
    } else if (latlon[i].lat > poi.lat && latlon[i+1].lat <= poi.lat) { 
     double vt = (poi.lat - latlon[i].lat)/(latlon[i+1].lat - latlon[i].lat); 
     if (poi.lon < (latlon[i].lon + (vt * (latlon[i+1].lon - latlon[i].lon)))) { 
     wn--; 
     } 
    } 
    } 
    return wn < 0; 
} 

// test data 
LATLON llval[] = { 
    {100,100}, 
    {200,500}, 
    {600,500}, 
    {700,100}, 
    {400,300}, 
    {100,100} 
}; 
#define NLATLON (sizeof(llval)/sizeof(LATLON)) 

int main(int argc, char **argv) { 
    while (1) { 
    char buf[1024]; 
    fprintf(stderr, "lon = "); 
    fgets(buf, sizeof(buf), stdin); 
    double lon = atof(buf); 
    fprintf(stderr, "lat = "); 
    fgets(buf, sizeof(buf), stdin); 
    double lat = atof(buf); 
    LATLON ltest; 
    ltest.lat = lat; 
    ltest.lon = lon; 
    if (chkInRegion(ltest, NLATLON, llval)) { 
     fprintf(stderr, "\n*** in region ***\n\n"); 
    } else { 
     fprintf(stderr, "\n=== outside ===\n\n"); 
    } 
    } 
    return 0; 
} 

enter image description here

0

Geofencing не будет работать на сложной формы полигональных областей. Может быть, вы можете решить проблему с помощью другого подхода. Например, разделите область на более мелкий CLCircularRegion, а затем разверните агрегированную логику для случая, когда вам нужно показать уведомление для всех тех операторов locationManager: didEnterRegion: и locationManager: didExitRegion: callback. Но имейте в виду, что допускается только максимум 20 одновременных контролируемых регионов для каждого приложения.

Refer https://forums.developer.apple.com/thread/21323 phillippk1 предложение для другого возможного подхода.

+0

Диос, спасибо за ваш ответ. Я проверю это и уточню для вас. – Birju

Смежные вопросы