MKMapView未对齐其region属性

时间:2014-11-20 04:29:24

标签: cocoa mkmapview mapkit

我想在MKMapView中显示某个地图区域但是当我在地图上使用相同的参数放置矩形覆盖时,它会显示为垂直未对齐。它在靠近赤道的地方看起来很好,但是不对准随着纬度和跨度的增加而增加。

这适用于Mac应用,但iOS应该相同。

这是我的相关代码:

MKCoordinateRegion mapRegion = MKCoordinateRegionMake(CLLocationCoordinate2DMake(latCenter, lonCenter), MKCoordinateSpanMake(mapWidthY, mapWidthX));
self.radarMap.region = mapRegion;
CLLocationCoordinate2D  coordinates[4];

coordinates[0] = CLLocationCoordinate2DMake(latCenter+mapWidthY/2, lonCenter+mapWidthX/2);
coordinates[1] = CLLocationCoordinate2DMake(latCenter+mapWidthY/2, lonCenter-mapWidthX/2);
coordinates[2] = CLLocationCoordinate2DMake(latCenter-mapWidthY/2, lonCenter-mapWidthX/2);
coordinates[3] = CLLocationCoordinate2DMake(latCenter-mapWidthY/2, lonCenter+mapWidthX/2);
self.boundaryOverlay = [MKPolygon polygonWithCoordinates:coordinates count:4];
[self.radarMap addOverlay:self.boundaryOverlay];

显示:(注意蓝色矩形叠加层向上移动,因此不显示上部区域): enter image description here

而不是像这样的东西:(我知道它在方面填充中显示): enter image description here

1 个答案:

答案 0 :(得分:2)

设置MKMapView对象的region属性时,MapKit会调整region属性的值,使其与可见的实际区域匹配。这意味着区域的实际值不会完全与您分配给它的值相同。因此,您不应使用分配给地图的区域创建多边形,而应从MKMapView对象获取区域的更新值,并使用它来创建多边形。

MKCoordinateRegion mapRegion = MKCoordinateRegionMake(CLLocationCoordinate2DMake(latCenter, lonCenter), MKCoordinateSpanMake(mapWidthY, mapWidthX));
self.radarMap.region = mapRegion;
CLLocationCoordinate2D  coordinates[4];

// Get the actual region that MapKit is using
MKCoordinateRegion actualMapRegion = self.radarMap.region;
CLLocationDegrees actualLatCenter = actualMapRegion.center.latitude;
CLLocationDegrees actualLonCenter = actualMapRegion.center.longitude;
CLLocationDegrees actualLatSpan = actualMapRegion.span.latitudeDelta;
CLLocationDegrees actualLonSpan = actualMapRegion.span.longitudeDelta;

// And use that to create the polygon
coordinates[0] = CLLocationCoordinate2DMake(actualLatCenter+ actualLatSpan/2, actualLonCenter+ actualLonSpan/2);
coordinates[1] = CLLocationCoordinate2DMake(actualLatCenter+ actualLatSpan/2, actualLonCenter-actualLonSpan/2);
coordinates[2] = CLLocationCoordinate2DMake(actualLatCenter-actualLatSpan/2, actualLonCenter-actualLonSpan/2);
coordinates[3] = CLLocationCoordinate2DMake(actualLatCenter-actualLatSpan/2, actualLonCenter+ actualLonSpan/2);
self.boundaryOverlay = [MKPolygon polygonWithCoordinates:coordinates count:4];
[self.radarMap addOverlay:self.boundaryOverlay];

我很好奇你向北移动时看到的不正确的错位。在我看来,你可能使用mapWidthX和mapWidthY的固定比率。 MapKit使用非保形投影。其中一个结果就是地图在南北方向上伸展,越往赤道的距离就越大。

如果使用对赤道正确的比率创建区域,则在向极点移动时将会出现错误。 MKMapView将采用您提供的区域并显示与其接近的区域。但是从赤道越远,它需要进行的调整越多。你给它的区域和它使用的实际区域之间的差异越大。