Пользовательские функции сопоставления в приложении iPhone с использованием CoreLocation - PullRequest
1 голос
/ 16 декабря 2010

Я разрабатываю некоторые пользовательские функции отображения в своем приложении и столкнулся с камнем преткновения.

Эта карта предназначена для известной области (т. Е. Я знаю точную широту / долготу верхнего левого и нижнего правого углов), и у меня есть графическое изображение области для масштабирования, которое я использую в качестве фона (я не я не хочу использовать MKMapView для этого).

Я использую CoreLocation, чтобы предоставить мне широту / долготу и пытаюсь перевести эти «реальные» координаты в точку на пользовательской карте.

Следует отметить, что моя пользовательская карта (которая отображается в UIScrollView) поворачивается с севера на определенный угол (т. Е. Верхняя часть пользовательской карты не равна северу), поэтому мне нужно перевести / повернуть все координаты, возвращенные через CoreLocation.

Я использую следующий код, чтобы попытаться сделать это:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

    CLLocation *pTL = [self rotateLocation:self.topLeftCorner
                          aboutLocation:newLocation];

    CLLocation *pBR = [self rotateLocation:self.bottomRightCorner
                         aboutLocation:newLocation];

    double mapCoordX = ((pTL.coordinate.longitude - newLocation.coordinate.longitude) / (pTL.coordinate.longitude - pBR.coordinate.longitude)) * imageWidth;
    double mapCoordY = ((pTL.coordinate.latitude - newLocation.coordinate.latitude) / (pTL.coordinate.latitude - pBR.coordinate.latitude)) * imageHeight;

    if ((mapCoordX >= -self.beaconImage.frame.size.width && mapCoordX <= imageWidth + self.beaconImage.frame.size.width) && (mapCoordY >= -self.beaconImage.frame.size.height && mapCoordY <= imageHeight + self.beaconImage.frame.size.height)) {

        self.beaconImage.center = CGPointMake(mapCoordX, mapCoordY);
        self.beaconImage.hidden = NO;

    } else {

        UIAlertView *av = [[UIAlertView alloc] 
                       initWithTitle:nil
                       message:@"You're not within the boundaries of the map"
                       delegate:self
                       cancelButtonTitle:@"OK"
                       otherButtonTitles:nil];
        [av show];
        [av release];

        self.beaconImage.hidden = YES;

    }

}   

- (CLLocation *)rotateLocation:(CLLocation *)rotationLocation aboutLocation:(CLLocation *)baseLocation {

    double mapLatitudeOffset = topLeftCorner.coordinate.latitude + bottomRightCorner.coordinate.latitude;

    double mapLongitudeOffset = topLeftCorner.coordinate.longitude - bottomRightCorner.coordinate.longitude;

    double mapOffsetAngle = 0;

    if (mapLongitudeOffset == 0 && mapLatitudeOffset == 0) {
        mapOffsetAngle = 0;
    } else if (mapLongitudeOffset >= 0) {
        mapOffsetAngle = atan2(mapLongitudeOffset, mapLatitudeOffset);
    } else {
        mapOffsetAngle = -atan2(mapLongitudeOffset, mapLatitudeOffset) + M_PI;
    }

    double latitudeOffset = (rotationLocation.coordinate.latitude + (baseLocation.coordinate.latitude * -1));

    double longitudeOffset = (rotationLocation.coordinate.longitude + (baseLocation.coordinate.longitude * -1));

    double radius = sqrt(pow(latitudeOffset, 2) + pow(longitudeOffset, 2));

    double theta = 0;

    if (longitudeOffset == 0 && latitudeOffset == 0) {
        theta = 0;
    } else if (longitudeOffset >= 0) {
        theta = atan2(longitudeOffset, latitudeOffset);
    } else {
        theta = -atan2(longitudeOffset, latitudeOffset) + M_PI;
    }

    double angularOffset = theta + mapOffsetAngle;

    double latitudeRotate = radius * sin(angularOffset);

    double longitudeRotate = radius * cos(angularOffset);

    return [[[CLLocation alloc] initWithLatitude:baseLocation.coordinate.latitude + latitudeRotate longitude:baseLocation.coordinate.longitude + longitudeRotate] autorelease];

}

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

Это кажется простой проблемой, так что я делаю не так?

...