Как установить фильтр точности и расстояния при использовании MKMapView

Sanj,

показан модифицированный код, который обнаруживает не одну, а много строк Hough. Я улучшил способ прокрутки массива строк, чтобы вы получили гораздо больше сегментов линии.

Вы можете дополнительно настроить параметры, однако, я думаю, что контурный подход в вашем другом сообщении, скорее всего, будет быть лучшим подходом к решению вашей задачи, как показано на рисунке: Как определить горизонтальные линии в изображении и получить его y-координаты с помощью python и opencv?

import numpy as np
import cv2

img = cv2.imread('lines.jpg')

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
print img.shape[1]
print img.shape
minLineLength=img.shape[1]-300
lines = cv2.HoughLinesP(image=edges,rho=0.02,theta=np.pi/500, threshold=10,lines=np.array([]), minLineLength=minLineLength,maxLineGap=100)

a,b,c = lines.shape
for i in range(a):
    cv2.line(img, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 3, cv2.LINE_AA)


cv2.imshow('edges', edges)
cv2.imshow('result', img)

cv2.waitKey(0)
cv2.destroyAllWindows()

29
задан Van Du Tran 27 September 2013 в 15:51
поделиться

3 ответа

Вы не можете контролировать точность внутреннего MKMapView диспетчера местоположений (который использовался для отслеживания пользователя с помощью синей точки), но вы можете создать свой собственный и использовать его для повторной центровки карты. Вот рецепт ...

Для обработки разрешений расположения ядра

В делегате расположения ядра:

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied){
        NSLog(@"User has denied location services");
    } else {
        NSLog(@"Location manager did fail with error: %@", error.localizedFailureReason);
    }
}

Прямо перед настройкой диспетчера местоположения:

if (![CLLocationManager locationServicesEnabled]){
    NSLog(@"location services are disabled"];
    return;
}
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied){
    NSLog(@"location services are blocked by the user");
    return;
}
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized){
    NSLog(@"location services are enabled");
}  
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined){
    NSLog(@"about to show a dialog requesting permission");
}

Для настройки расположения ядра

self.locationManager = [CLLocationManager new];
self.locationManager.purpose = @"Tracking your movements on the map.";
self.locationManager.delegate = self;

/* Pinpoint our location with the following accuracy:
 *
 *     kCLLocationAccuracyBestForNavigation  highest + sensor data
 *     kCLLocationAccuracyBest               highest     
 *     kCLLocationAccuracyNearestTenMeters   10 meters   
 *     kCLLocationAccuracyHundredMeters      100 meters
 *     kCLLocationAccuracyKilometer          1000 meters 
 *     kCLLocationAccuracyThreeKilometers    3000 meters
 */
self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;

/* Notify changes when device has moved x meters.
 * Default value is kCLDistanceFilterNone: all movements are reported.
 */
self.locationManager.distanceFilter = 10.0f;

/* Notify heading changes when heading is > 5.
 * Default value is kCLHeadingFilterNone: all movements are reported.
 */
self.locationManager.headingFilter = 5;

// update location
if ([CLLocationManager locationServicesEnabled]){
    [self.locationManager startUpdatingLocation];
}

Чтобы переназначить карту с нашим менеджером местоположения

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation 
{
    MKCoordinateRegion region = { { 0.0f, 0.0f }, { 0.0f, 0.0f } };
    region.center = newLocation.coordinate;
    region.span.longitudeDelta = 0.15f; 
    region.span.latitudeDelta = 0.15f;
    [self.mapView setRegion:region animated:YES];
}

Поместите это в делегата. MKMapView не имеет фильтра расстояния или точности, только CLLocationManager. MKMapView имеет область охвата вокруг точки, в примере выше 0,15 градуса (0,15 * 111 км).

Вещи, которые я пытался и не работал

Документация не сообщает, откуда MKMapView получает свои обновления. Я попробовал

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation {
    NSLog(@"newLocation %@", newLocation.timestamp);
    NSLog(@"last map location %@", [NSString stringWithFormat:@"%@",[[[self.mapView userLocation] location] timestamp]]);
}

и получаю разные значения для каждого. Похоже, что MKMapView использует свой собственный CLLocationManager, что означает, что вы не можете установить его точность. Вы также не можете добавить своего делегата для CLLocationManager из MKMapView.

У меня сложилось впечатление, что единственный способ установить точность - это настроить показывать пользовательское положение как NO и создавать пользовательскую аннотацию с синей точкой, что означает повторное повторение карты вручную после публикации. Вы можете получить изображение с синей точкой из SDK с помощью экстрактора иллюстраций проекта github.

Я не знаю, упускаю ли я что-то или эта часть MKMapView просто отстой.

81
ответ дан Daniel Daranas 27 September 2013 в 15:51
поделиться

Вы не можете установить точность, однако, вы можете получить точность через userLocation в методе делегата MKMapView.

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    NSLog(@"%f", userLocation.location.horizontalAccuracy);
}
2
ответ дан nonamelive 27 September 2013 в 15:51
поделиться

Для отображения карты приведен пример кода.

Сначала импортируйте MKMapKit и инфраструктуру CoreLocation в ваш файл .h.

#import <MapKit/MapKit.h>
 #import <CoreLocation/CoreLocation.h>

Добавьте MKMapKit и CoreLocation Delegate в файл .h

@interface MapViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate>


CGPoint gameMapCenter = CGPointMake([[UIScreen mainScreen] bounds].size.width / 2, [[UIScreen mainScreen] bounds].size.height / 2);
    gameMapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 640, 620)];
    [gameMapView setCenter:gameMapCenter];
    [gameMapView setMapType:MKMapTypeStandard];
    [gameMapView setDelegate:self];
    [self.view addSubview:gameMapView];
    [gameMapView setShowsUserLocation:YES];

Используйте CLLocationManager для извлечения местоположения пользователя.

Объявить экземпляр CLLocationManager

CLLocationManager *locationManager;

В ViewDidLoad

locationManager = [[CLLocationManager alloc] init];

[locationManager setDelegate:self];

[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];

[locationManager setDistanceFilter:kCLDistanceFilterNone];

[locationManger startUpdatingLocation];

startUpdatingLocation Реализация метода:

(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{
      //Your Stuff
}
3
ответ дан morroko 27 September 2013 в 15:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: