UPDATE:
Images who are projected on the MKMapView using a MKOverlayView use the Mercator projection, while the image that I use as input data uses
I'm not sure if this would affect the scaling issue, but in your OverlayView code, your drawing the entire image for every maptile.
Have you tried only drawing the portion of the image that is visible in mapRect?
When I've had problems with MKOverlayViews, its been helpful for me to draw the rect of the overlay (self.overlay.boundingRect) and the mapRect (passed into drawMapRect). Although, I'm not sure if drawing the mapRect would be helpful in your situation.
At any rate, heres the function I use to draw the rect in case you want to try it out
-(void)drawRect:(MKMapRect)rect inContext:(CGContextRef)context withLineWidth:(float)lineWidth andColor:(CGColorRef)color
{
double maxx = MKMapRectGetMaxX(rect);
double minx = MKMapRectGetMinX(rect);
double maxy = MKMapRectGetMaxY(rect);
double miny = MKMapRectGetMinY(rect);
CGPoint tr = [self pointForMapPoint:(MKMapPoint) {maxx, maxy}];
CGPoint br = [self pointForMapPoint:(MKMapPoint) {maxx, miny}];
CGPoint bl = [self pointForMapPoint:(MKMapPoint) {minx, miny}];
CGPoint tl = [self pointForMapPoint:(MKMapPoint) {minx, maxy}];
CGMutablePathRef cgPath = CGPathCreateMutable();
CGPathMoveToPoint(cgPath, NULL, tr.x, tr.y);
CGPathAddLineToPoint(cgPath, NULL, br.x, br.y);
CGPathAddLineToPoint(cgPath, NULL, bl.x, bl.y);
CGPathAddLineToPoint(cgPath, NULL, tl.x, tl.y);
CGPathAddLineToPoint(cgPath, NULL, tr.x, tr.y);
CGContextSaveGState(context);
CGContextAddPath(context, cgPath);
CGContextSetStrokeColorWithColor(context, color);
CGContextSetLineJoin(context, kCGLineJoinRound);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetLineWidth(context, lineWidth);
CGContextStrokePath(context);
CGPathRelease(cgPath);
CGContextRestoreGState(context);
}
Your image/overlay is most likely no longer proportional (i.e. it's been stretched). I've seen this kind of thing in my own app where the center of the view is correct, but as you go away from the equator toward either pole (top and bottom of screen) the map/overlay becomes increasingly distorted.
You are obviously scaling your image by scaleFactor. I'd take a look at that for starters.
size_t width = (CGImageGetWidth(imageReference) / self.scaleFactor);
size_t height = (CGImageGetHeight(imageReference) / self.scaleFactor);
Another good way to test your code to see if scaling is the culprit, is to scale your MKMapView down to the size of the overlay image. Leave the overlay image alone, and if it is no longer distorted then you know that is the problem.
WGS-84 data is using UTM projection, MKMapView is using mercator. You are using different methods to map a 3D object to a 2D surface, hence it is not giving the same results.
You'll need to go down in GDAL and move the incomming image to a different projection. Let me know if you figured it out, because it ain't an easy
Apple has a sample app from WWDC that parses KML and displays it on a map. If you are a paid developer you can access it from the WWDC videos page in iTunes. I recommend using their parser.
Have you already seen "Session 127 - Customizing Maps with Overlays" from the WWDC 2010 videos? One of the examples takes earthquake data, which gives the earthquake risk for 0.5 by 0.5 degree areas and maps them. Your radar data looks similar, based on squares. The sample code has a full application called HazardMaps, which takes this data and creates an overlay using MKMapPoints. If you haven't already seen this video, I think it will give you plenty of useful information. He also talks about converting to the Mercator projection.
Another thing to check is what coordinate system (datum) the data from EUMETSAT is in. Google Maps uses a system called WGS-84, which is a general standard. But there are many other standards which can give more accurate positions in different parts of the world. If you use the latitude and longitude from a different standard in Google Maps, all your points will be off by a certain amount. The offset is not consistent, it changes as you move around the map. It's possible that Google Maps is being smart about the data and converting to WGS-84 on the fly.
You might find out more details by looking at the KML. I looked but couldn't find the final KML, with the rectangles. Perhaps it gives information about what coordinate system it's using in the metadata.
My guess is that Google Maps is stretching the image non-linearly to compensate for the map projection and that your code/Apple's code isn't.
One possible solution would be to subdivide the overlay image into smaller rectangles and call MKMapPointForCoordinate() separately for each rectangle. Then the data will be much closer to being correct.