我正在使用MKMapView并在地图上绘制了几个点.我已经使用了MKCoordinateRegion和MKCoordinateSpan围绕其中一个点启用缩放等 - 但这不是我想要的......
我正在尝试使用类似于Javascript zoom to bounds功能的东西.所以我的所有要点都应该对用户可见.(英国各地将有大约10个点)我想向他们展示所有这些,或者如果他们大多数都在伦敦地区,请放大到那里.
有没有办法以编程方式解决这个问题?
任何人都可以确认setRegion"捕捉"到预定义的缩放级别,以及此行为是否与设计(虽然未记录)或已知错误一样?具体来说,似乎setRegion捕捉到与用户双击地图时使用的缩放级别相对应的相同缩放级别.
我正在尝试恢复以前保存的区域,但如果通过缩放缩放而不是双击缩放设置保存的区域,则此行为无法实现.
如果我在地图的当前区域调用regionThatFits,那么在mapkit方面的事情就会被打破的一个重要线索就是如此.它应该返回相同的区域(因为它显然适合地图的框架),但它返回的区域对应于下一个更高的预定义缩放级别.
setVisibleMapRect的行为类似.
任何进一步的见解或信息将不胜感激.
我找到了这些相关的帖子,但都没有包含解决方案或确切的确认,这实际上是一个mapkit错误:
编辑:
这是一个演示该问题的示例.所有值对我的地图视图的宽高比都有效:
MKCoordinateRegion initialRegion;
initialRegion.center.latitude = 47.700200f;
initialRegion.center.longitude = -122.367109f;
initialRegion.span.latitudeDelta = 0.065189f;
initialRegion.span.longitudeDelta = 0.067318f;
[map setRegion:initialRegion animated:NO];
NSLog(@"DEBUG initialRegion: %f %f %f %f", initialRegion.center.latitude, initialRegion.center.longitude, initialRegion.span.latitudeDelta, initialRegion.span.longitudeDelta);
NSLog(@"DEBUG map.region: %f %f %f %f", map.region.center.latitude, map.region.center.longitude, map.region.span.latitudeDelta, map.region.span.longitudeDelta);
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
DEBUG initialRegion: 47.700199 -122.367111 0.065189 0.067318
DEBUG map.region: 47.700289 -122.367096 0.106287 0.109863
Run Code Online (Sandbox Code Playgroud)
请注意纬度/经度增量值的差异.地图的值几乎是我要求的两倍.较大的值对应于用户双击地图时使用的缩放级别之一.
编辑:我相信我的问题是这个代码适用于整数缩放级别,但我希望它适用于浮动缩放级别.
我有一个iOS应用程序,用户可以在基于RouteMe的地图和基于MapKit的地图之间切换.
当他们切换源时,我希望能够在一个中显示完全相同的区域.但是,我无法弄清楚如何使它们匹配,因为RouteMe和MapKit使用不同的数据结构来描述地图边界.
这里有一些代码可以让它有点接近,但并不准确.此代码来自:http://troybrant.net/blog/2010/01/set-the-zoom-level-of-an-mkmapview/
我不确定这段代码是否应该修复,或者我可能忽略了一个更简单的解决方案.代码从列出的最后一个方法开始执行:
#define MERCATOR_OFFSET 268435456
#define MERCATOR_RADIUS 85445659.44705395
#pragma mark -
#pragma mark Map conversion methods
- (double)longitudeToPixelSpaceX:(double)longitude {
return round(MERCATOR_OFFSET + MERCATOR_RADIUS * longitude * M_PI / 180.0);
}
- (double)latitudeToPixelSpaceY:(double)latitude {
return round(MERCATOR_OFFSET - MERCATOR_RADIUS * logf((1 + sinf(latitude * M_PI / 180.0)) / (1 - sinf(latitude * M_PI / 180.0))) / 2.0);
}
- (double)pixelSpaceXToLongitude:(double)pixelX {
return ((round(pixelX) - MERCATOR_OFFSET) / MERCATOR_RADIUS) * 180.0 / M_PI;
}
- (double)pixelSpaceYToLatitude:(double)pixelY {
return …Run Code Online (Sandbox Code Playgroud)