Как найти ближайшие 100 метров широты и долготы в зависимости от текущего местоположения в цели c, Iphone - PullRequest
4 голосов
/ 27 января 2012

Как найти ближайшие 100 метров широты и долготы в зависимости от текущего местоположения, я создал базу данных в SQLITE3, которая состоит из набора широт и долгот и соответствующего имени этого местоположения. В зависимости от текущего местоположения я хочу выбрать ближайшие 100 метров широты и долготы в цели C, Я использую следующий код для получения текущего местоположения,

- (void)viewDidLoad {
    [super viewDidLoad];

    databaseName = @"searchdata.sql";

    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDir = [documentPaths objectAtIndex:0];
    databasePath = [documentDir stringByAppendingPathComponent:databaseName];

    [self checkAndCreateDatabase];
    [self readDataFromDatabase];
    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;

    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
    [locationManager startUpdatingLocation];

}

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
    int degrees = newLocation.coordinate.latitude;
    double decimal = fabs(newLocation.coordinate.latitude - degrees);
    int minutes = decimal * 60;
    double seconds = decimal * 3600 - minutes * 60;
    NSString *lat = [NSString stringWithFormat:@"%d° %d' %1.4f\"", 
                     degrees, minutes, seconds];
    NSLog(@" Current Latitude : %@",lat);
    //latLabel.text = lat;
    degrees = newLocation.coordinate.longitude;
    decimal = fabs(newLocation.coordinate.longitude - degrees);
    minutes = decimal * 60;
    seconds = decimal * 3600 - minutes * 60;
    NSString *longt = [NSString stringWithFormat:@"%d° %d' %1.4f\"", 
                       degrees, minutes, seconds];
    NSLog(@" Current Longitude : %@",longt);
    //longLabel.text = longt;
}

Итак, как получить или как рассчитать окружающие 100-метровые широты и долготы и отобразить их.

Спасибо за помощь, я использую следующую формулу

     -(double)kilometresBetweenPlace1:(CLLocationCoordinate2D) place1 andPlace2:(CLLocationCoordinate2D) place2 {

    double dlon = convertToRadians([pLong intValue] - [longt intValue]);
    double dlat = convertToRadians([pLat intValue] - [lat intValue]);

    double a = ( pow(sin(dlat / 2), 2) + cos(convertToRadians([lat intValue]))) * cos(convertToRadians([pLat intValue])) * pow(sin(dlon / 2), 2);
    double angle = 2 * asin(sqrt(a));
      return angle * RADIO;
}

и получая следующий результат 8505.369547 по возвращении, я просто запутался, какое значение я получаю на самом деле.

Ответы [ 2 ]

3 голосов
/ 27 января 2012

Возможно, платформа CoreLocation может помочь вам в этой проблеме? Кажется, следующий метод сделан с учетом вашего вопроса:

- (id)initCircularRegionWithCenter:(CLLocationCoordinate2D)center radius:(CLLocationDistance)radius identifier:(NSString *)identifier

Вы можете проверить, попадает ли координата из вашей базы данных в область, используя следующий метод:

- (BOOL)containsCoordinate:(CLLocationCoordinate2D)coordinate

Полагаю, вышесказанное не идеально, если в вашей базе данных много мест. Но, возможно, можно отфильтровать набор местоположений для тестирования на основе некоторых минимальных и максимальных значений широты / долготы.


Редактировать: по запросу, пример (не забудьте импортировать CoreLocation framework):

- (void)startTest
{

#define COORDS_COUNT 4
#define RADIUS       10000.0f

    CLLocationCoordinate2D coords[COORDS_COUNT] = {
        CLLocationCoordinate2DMake(52.000004, 4.100002),
        CLLocationCoordinate2DMake(53.000009, 4.000003),
        CLLocationCoordinate2DMake(52.000001, 4.500008),
        CLLocationCoordinate2DMake(52.000002, 3.900900),
    };

    CLLocationCoordinate2D center = CLLocationCoordinate2DMake(52.0f, 4.0f); // Amsterdam
    CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:center radius:RADIUS identifier:@"Amsterdam"];

    for (int i = 0; i < COORDS_COUNT; i++)
    {
        CLLocationCoordinate2D coord = coords[i];
        if ([region containsCoordinate:coord])
        {
            NSLog(@"location %f, %f is within %.0f meters of coord %f, %f", coord.latitude, coord.longitude, RADIUS, center.latitude, center.longitude);
        }
        else 
        {
            NSLog(@"location %f, %f is not within %.0f meters of coord %f, %f", coord.latitude, coord.longitude, RADIUS, center.latitude, center.longitude);        
        }
    }

}

Редактировать 2: Я понимаю, что это не совсем тот ответ, который вы просили, но мне кажется, это то, что вам нужно. Как вы можете себе представить, ближайшие 100 метров широты / долготы вблизи любой координаты состоят из практически неограниченного количества координат в круговой области. Я предполагаю, что вы хотите найти объекты в вашей базе данных, которые находятся рядом с некоторой координатой, и приведенный выше код должен помочь вам достичь этого. Вы можете получить набор результатов из вашей базы данных и проверить, находятся ли они рядом с некоторой координатой.


Редактировать 3: Следующий код, скорее всего, именно то, что вам нужно:

CLLocation *center = [[CLLocation alloc] initWithLatitude:52.0f longitude:4.0f]; // Amsterdam
CLLocation *location1 = [[CLLocation alloc] initWithLatitude:52.000004f longitude:4.100002f];

CLLocationDistance distance = [center distanceFromLocation:location1];
NSLog(@"%f", distance);    

Редактировать 4: Что касается вашего вопроса о пользовательском объекте для представления таблицы, используйте что-то вроде этого:

@interface Location : NSObject 
@property (nonatomic, strong) NSString               *name;
@property (nonatomic, assign) CLLocationCoordinate2D  coordinate;
@end


@implementation Location
@synthesize name, coordinate;
@end
0 голосов
/ 27 января 2012

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

http://www.geonames.org/export/ws-overview.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...