Образец наложения изображения MKMapView инвертирован

85
10

В настоящее время я создаю приложение, которое требует наложения большого количества наложений разных размеров. Приложение в настоящее время захватывает 2 точки карты, которые представляют собой углы ограничивающего прямоугольника, в котором должен располагаться оверлей. Затем я конвертирую их в MKMapRect для использования в классе MKOverlay. Наложение рисуется в нужном месте, но изображение, похоже, перевернуто вертикально, я могу сказать это, когда я попытался применить CGAffineTransformMakeRotation (180), и изображение появилось правильно, но запись была обратная.

Если кто-нибудь может помочь мне понять, почему он это делает, это было бы очень полезно, см. Мой код ниже.

Код установки:

    // First grab the overlay co-ordinates
double left = [[self.storedWildMapObject.arrayBBox objectAtIndex:0] doubleValue], bottom = [[self.storedWildMapObject.arrayBBox objectAtIndex:1] doubleValue], right = [[self.storedWildMapObject.arrayBBox objectAtIndex:2] doubleValue], top = [[self.storedWildMapObject.arrayBBox objectAtIndex:3] doubleValue];

// Store these in 2 coordinates representing top left / bot right
CLLocationCoordinate2D upperLeftCoord =
CLLocationCoordinate2DMake(top,left);

CLLocationCoordinate2D lowerRightCoord =
CLLocationCoordinate2DMake(bottom,right);

//Convert to map points
MKMapPoint upperLeft = MKMapPointForCoordinate(upperLeftCoord);

MKMapPoint lowerRight = MKMapPointForCoordinate(lowerRightCoord);

// Work out sizes
double rightToLeftDiff = lowerRight.y - upperLeft.y;
double topToBottDiff = lowerRight.x - upperLeft.x;

MKMapRect bounds = MKMapRectMake(upperLeft.x, upperLeft.y, topToBottDiff, rightToLeftDiff);

// Add to overlay
MKMapOverlay *mapOverlay = [[MKMapOverlay alloc] initWithMapRect:bounds andCoord:upperLeftCoord];
[self.mapV addOverlay:mapOverlay];

//Наложение карты

- (id)initWithMapRect:(MKMapRect)rect andCoord:(CLLocationCoordinate2D)coord
{
self = [super init];

if (self)
{
self.centerPos = coord;
self.mkMapRect = rect;
}
return self;
}

-(CLLocationCoordinate2D)coordinate
{
return self.centerPos;
}

- (MKMapRect)boundingMapRect
{
return self.mkMapRect;
}

//MapOverlayView

- (id)initWithOverlay:(id <MKOverlay>)overlay andImage:(UIImage *)img
{
self = [super initWithOverlay:overlay];
if (self)
{
self.image = img;
}
return self;
}

/** Degrees to Radian **/
#define degreesToRadians( degrees ) ( ( degrees ) / 180.0 * M_PI )

/** Radians to Degrees **/
#define radiansToDegrees( radians ) ( ( radians ) * ( 180.0 / M_PI ) )

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)ctx
{
CGImageRef imageReference = self.image.CGImage;

MKMapRect theMapRect = [self.overlay boundingMapRect];
CGRect theRect = [self rectForMapRect:theMapRect];
CGRect clipRect = [self rectForMapRect:mapRect];

CGContextAddRect(ctx, clipRect);
CGContextClip(ctx);
//CGContextRotateCTM(ctx, degreesToRadians(180.0f));

CGContextDrawImage(ctx, theRect, imageReference);
}

Просто помогите мне, у меня также есть отладочная печать из MapRect, используемая в MapOverlayView:

    (lldb) p theMapRect
(MKMapRect) $17 = {
(MKMapPoint) origin = {
(double) x = 1.27662e+08
(double) y = 7.86099e+07
}
(MKMapSize) size = {
(double) width = 8.12378e+06
(double) height = 1.27474e+07
}
}

Ниже показано, как это выглядит:

enter image description here

спросил(а) 2012-12-14T20:04:00+04:00 7 лет, 5 месяцев назад
1
Решение
84

Ответ, найденный здесь, кажется, нарисовал мой образ правильным образом с тем же mapRect:

qaru.site/questions/3224639/...

Так что я использую это сейчас.

ответил(а) 2012-12-17T17:42:00+04:00 7 лет, 5 месяцев назад
39

Вы подтвердили, что файл storedwildmapobject имеет координаты в том порядке, в котором вы их ожидаете?

ответил(а) 2012-12-15T07:29:00+04:00 7 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема