Как проверить, находится ли кто-либо введенный / оставленный в / из определенной граничной области, даже если приложение находится в фоновом режиме или режиме уничтожения?

Я хочу проверить, если кто-то входит в выделенную границу, то я должен предупредить этого пользователя, как "Вы вошли", а когда пользователь уходит, то "Вы ушли". Я использую файл.KML для границы рисования, в которой больше, чем широта и долгота. Здесь я приложил скриншот для того же самого. Итак, меня беспокоит то, как я могу обнаружить, что кто-то вошел в эту границу и покинул ее. заранее спасибо введите описание изображения здесь Граница выглядит следующим образом. Красная линия цвета является границей.

3 ответа

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

Обратитесь к https://forums.developer.apple.com/thread/21323 phillippk1 предложению для другого возможного подхода.

Используйте карту Вот пример использования текущего видимого прямоугольника карты. Что касается вашего вопроса, вы можете использовать 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];
}

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

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

введите описание изображения здесь

Другие вопросы по тегам