MKMapView 与其区域属性未对齐
Posted
技术标签:
【中文标题】MKMapView 与其区域属性未对齐【英文标题】:MKMapView is misaligned to its region property 【发布时间】:2014-11-20 04:29:23 【问题描述】:我想在 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];
显示如下:(请注意蓝色矩形叠加层向上移动,因此不显示上部区域):
而不是这样的:(我知道它显示在方面填充中):
【问题讨论】:
【参考方案1】:当您设置 MKMapView 对象的 region 属性时,MapKit 会调整 region 属性的值,使其与可见的实际区域相匹配。这意味着 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 将获取你给它的区域并显示靠近它的东西。但是你离赤道越远,它需要做的调整就越多。而且你给它的区域和它使用的实际区域之间的差异越大。
【讨论】:
以上是关于MKMapView 与其区域属性未对齐的主要内容,如果未能解决你的问题,请参考以下文章