Я хочу проверить, не входит ли кто-либо в выделенную границу, тогда я должен предупредить этого пользователя, как «Вы введены», и когда пользователь уходит, то «Вы ушли». Я использую файл .KML для границы чертежа, в котором есть больше, чем широта и долгота. Здесь я приложил скриншот к тому же. Итак, я беспокоюсь, что как я могу обнаружить, что кто-то вводится в пределах этой границы и уходит с этой границы. Заранее спасибо Граница выглядит так. Красная линия цвета - это граница.Как проверить, что кто-либо вводит/оставляет в/из конкретной граничной области, даже если приложение находится в фоновом режиме или режиме kill?
ответ
Использовать карту прямоугольников. Вот пример использования текущего видимого прямоугольника карты. Что касается вашего вопроса, вы можете использовать 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];
}
Благодарим вас за ответ на мой вопрос. В вашем ответе я думаю, что я должен каждый раз проверять, где находится местоположение пользователя, в макете или нет. Есть ли другой способ проверить, если условие больше? Например, CLLocationManager имеет собственный метод didEnterRegion и didExitRegion. – Birju
У меня нет собственного метода, но с помощью метода doUpdateToLocation можно это сделать. - (void) locationManager: (CLLocationManager *) manager didUpdateToLocation: (CLLocation *) newLocation fromLocation: (CLLocation *) oldLocation; –
Если я должен проверять каждый раз в файле doUpdateToLocation, тогда это работает, если мое приложение находится в режиме kill? – Birju
Попробуйте этот код. Это основано на алгоритме числа обмоток. Это работает для сложных форм, таких как красная линия.
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;
}
Geofencing не будет работать на сложной формы полигональных областей. Может быть, вы можете решить проблему с помощью другого подхода. Например, разделите область на более мелкий CLCircularRegion, а затем разверните агрегированную логику для случая, когда вам нужно показать уведомление для всех тех операторов locationManager: didEnterRegion: и locationManager: didExitRegion: callback. Но имейте в виду, что допускается только максимум 20 одновременных контролируемых регионов для каждого приложения.
Refer https://forums.developer.apple.com/thread/21323 phillippk1 предложение для другого возможного подхода.
Диос, спасибо за ваш ответ. Я проверю это и уточню для вас. – Birju
- 1. Как уведомить пользователя, даже если приложение находится в фоновом режиме
- 2. Активность открывается сверху, даже если приложение находится в фоновом режиме
- 3. Анимация UiView, даже если приложение находится в фоновом режиме
- 4. Проверьте, если приложение находится в фоновом режиме
- 5. Редактировать событие календаря, когда приложение находится в фоновом режиме или режиме kill
- 6. Как проверить приложение в фоновом режиме?
- 7. Как избежать дренажа батареи, если приложение использует GPS, даже если приложение находится в фоновом режиме
- 8. MonoTouch работает NSTimer, даже когда приложение находится в фоновом режиме
- 9. BroadcastReceiver, когда приложение находится в фоновом режиме
- 10. Как проверить, если приложение работает в фоновом режиме
- 11. Слушайте, когда приложение находится в фоновом режиме
- 12. Инициировать захват местоположения в определенное время, даже если приложение находится в фоновом режиме или не работает
- 13. Как проверить, работает ли приложение или нет в фоновом режиме
- 14. Пользовательское уведомление, когда приложение находится в фоновом режиме или закрывается
- 15. Предотвратить восстановление фокуса, если приложение находится в фоновом режиме
- 16. Приложение находится в фоновом режиме или работает при обработке LocalNotification
- 17. Android: проверьте, находится ли приложение в фоновом режиме или закрыто
- 18. андроид приложения запуска всегда, даже если приложение в фоновом режиме
- 19. Воспроизведение звука или звука, когда приложение находится в фоновом режиме
- 20. iOS обнаруживает скриншот, если приложение находится в фоновом режиме
- 21. Поддерживать приложение в фоновом режиме?
- 22. Как обрабатывать события сокета, когда приложение находится в фоновом режиме?
- 23. Приложение идет в фоновом режиме
- 24. Как узнать, когда приложение находится в фоновом режиме?
- 25. Приложение IOS в фоновом режиме?
- 26. Позвоните в веб-службу, даже если приложение ios находится в фоновом режиме
- 27. Приложение UILocalNotification в фоновом режиме
- 28. Закройте окно, которое находится в фоновом режиме
- 29. Запуск темы каждые 15 секунд, даже если приложение находится в фоновом режиме в Swift
- 30. MKMapView Update, когда приложение находится в фоновом режиме
Уже предложено до: http://stackoverflow.com/questions/35457480/determine-if-a-gps-location-is-within-a-gpx-track-segment –
Возможный дубликат [Определить, если GPS местоположение находится в сегменте дорожки gpx] (http://stackoverflow.com/questions/35457480/determine-if-a-gps-location-is-within-a-gpx-track-segment) –
@AndreasOetjen благодарит вас за ваш комментарий. Но кажется, что ответ на вопрос, который вы упомянули, больше не доступен. Я уже видел этот вопрос, но кажется, что я использую файл .kml и разбор с использованием кода парсера kml, предоставленного Apple, не использующего файл .gpx. – Birju