注册 登录
主题 : MapView方法-设置地图的缩放等级
级别: 精灵王

UID: 6349
精华: 2
发帖: 123
可可豆: 11179 CB
威望: 11179 点
在线时间: 1002(时)
注册时间: 2009-06-14
最后登录: 2018-09-11
0 楼:  发表于: 2010-09-12 22:00    发自: Web Page
来源于 iPhone类代码 分类

MapView方法-设置地图的缩放等级    (在iOS代码库中浏览本帖)

显示地图的时候,我们希望能够直接设置地图的缩放等级,Google的地图API都有这个参数,MKMapView居然没有,下面这个方法就是帮你搞定的。

说明:具体的代码我也是抄来的,刚好需要,再简单封装了一把

对原理有兴趣请参见具体的出处 http://troybrant.net/blog/

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface MKMapView (MapViewUtil)

- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
                  zoomLevel:(NSUInteger)zoomLevel
                   animated:(BOOL)animated;

@end

#import "MapViewUtil.h"

#define MERCATOR_OFFSET 268435456
#define MERCATOR_RADIUS 85445659.44705395

@implementation MKMapView (MapViewUtil)

#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 (M_PI / 2.0 - 2.0 * atan(exp((round(pixelY) - MERCATOR_OFFSET) / MERCATOR_RADIUS))) * 180.0 / M_PI;
}

#pragma mark -
#pragma mark Helper methods

- (MKCoordinateSpan)coordinateSpanWithMapView:(MKMapView *)mapView
                             centerCoordinate:(CLLocationCoordinate2D)centerCoordinate
                                 andZoomLevel:(NSUInteger)zoomLevel
{
    // convert center coordiate to pixel space
    double centerPixelX = [self longitudeToPixelSpaceX:centerCoordinate.longitude];
    double centerPixelY = [self latitudeToPixelSpaceY:centerCoordinate.latitude];
    
    // determine the scale value from the zoom level
    NSInteger zoomExponent = 20 - zoomLevel;
    double zoomScale = pow(2, zoomExponent);
    
    // scale the map’s size in pixel space
    CGSize mapSizeInPixels = mapView.bounds.size;
    double scaledMapWidth = mapSizeInPixels.width * zoomScale;
    double scaledMapHeight = mapSizeInPixels.height * zoomScale;
    
    // figure out the position of the top-left pixel
    double topLeftPixelX = centerPixelX - (scaledMapWidth / 2);
    double topLeftPixelY = centerPixelY - (scaledMapHeight / 2);
    
    // find delta between left and right longitudes
    CLLocationDegrees minLng = [self pixelSpaceXToLongitude:topLeftPixelX];
    CLLocationDegrees maxLng = [self pixelSpaceXToLongitude:topLeftPixelX + scaledMapWidth];
    CLLocationDegrees longitudeDelta = maxLng - minLng;
    
    // find delta between top and bottom latitudes
    CLLocationDegrees minLat = [self pixelSpaceYToLatitude:topLeftPixelY];
    CLLocationDegrees maxLat = [self pixelSpaceYToLatitude:topLeftPixelY + scaledMapHeight];
    CLLocationDegrees latitudeDelta = -1 * (maxLat - minLat);
    
    // create and return the lat/lng span
    MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
    return span;
}

#pragma mark -
#pragma mark Public methods

- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
                  zoomLevel:(NSUInteger)zoomLevel
                   animated:(BOOL)animated
{
    // clamp large numbers to 28
    zoomLevel = MIN(zoomLevel, 28);
    
    // use the zoom level to compute the region
    MKCoordinateSpan span = [self coordinateSpanWithMapView:self centerCoordinate:centerCoordinate andZoomLevel:zoomLevel];
    MKCoordinateRegion region = MKCoordinateRegionMake(centerCoordinate, span);
    
    // set the region like normal
    [self setRegion:region animated:animated];
}

@end
清空我的评分动态本帖最近评分记录: 共1条评分记录
nono 可可豆 +5 2010-09-12 -
隐藏评分记录
新浪微博 weibo.com/pipipeng
Twitter: qqn_pipi
级别: 版主

状态: 连续签到 - [144天]
UID: 491
精华: 6
发帖: 1763
可可豆: 112160 CB
威望: 112807 点
在线时间: 8537(时)
注册时间: 2008-08-19
最后登录: 2019-05-19
1 楼:  发表于: 2010-09-13 06:42    发自: Web Page
皮皮的论坛头像昂?
 Developer
------------------------------------------------------------
Η αγάπη ποτέ δεν αποτυγχάνει.
愛是永不止息。
Love never fails.

    --《圣经.新约》哥林多前书第13章
级别: 精灵王

UID: 6349
精华: 2
发帖: 123
可可豆: 11179 CB
威望: 11179 点
在线时间: 1002(时)
注册时间: 2009-06-14
最后登录: 2018-09-11
2 楼:  发表于: 2010-09-13 10:54    发自: Web Page
LV对我头像有意见吗?设置了个新头像,这个还算有型的了

引用
引用第1楼lvyile于2010-09-13 06:42发表的  :
皮皮的论坛头像昂?

[ 此帖被qqn_pipi在2010-09-13 11:12重新编辑 ]

新浪微博 weibo.com/pipipeng
Twitter: qqn_pipi
级别: 新手上路
UID: 26646
精华: 0
发帖: 25
可可豆: 250 CB
威望: 250 点
在线时间: 30(时)
注册时间: 2010-08-04
最后登录: 2016-03-27
3 楼:  发表于: 2010-09-13 11:51    发自: Web Page
非常感谢啊,找这个好久了!!!
级别: 侠客
UID: 8790
精华: 0
发帖: 123
可可豆: 1176 CB
威望: 1176 点
在线时间: 490(时)
注册时间: 2009-09-14
最后登录: 2018-10-31
4 楼:  发表于: 2010-11-08 11:30    发自: Web Page
MKMapView+MapViewUtil..h
MKMapView+MapViewUtil.m
级别: 精灵王
UID: 24120
精华: 0
发帖: 617
可可豆: 5004 CB
威望: 5004 点
在线时间: 548(时)
注册时间: 2010-07-07
最后登录: 2018-10-26
5 楼:  发表于: 2010-12-01 09:36    发自: Web Page

级别: 新手上路
UID: 34069
精华: 0
发帖: 37
可可豆: 370 CB
威望: 370 点
在线时间: 50(时)
注册时间: 2010-10-16
最后登录: 2013-03-20
6 楼:  发表于: 2011-04-01 16:35    发自: Web Page
mark一下下下
级别: 新手上路
状态: 连续签到 - [1天]
UID: 38492
精华: 0
发帖: 25
可可豆: 171 CB
威望: 170 点
在线时间: 313(时)
注册时间: 2010-11-17
最后登录: 2018-06-06
7 楼:  发表于: 2011-04-22 16:39    发自: Web Page
大哥,能来一个dome吗
级别: 圣骑士
状态: 连续签到 - [1天]
UID: 65157
精华: 0
发帖: 367
可可豆: 3436 CB
威望: 3376 点
在线时间: 111(时)
注册时间: 2011-04-20
最后登录: 2019-11-04
8 楼:  发表于: 2011-09-08 17:26    发自: Web Page
额 比想象中的复杂。。。
级别: 骑士
UID: 25323
精华: 0
发帖: 283
可可豆: 2254 CB
威望: 2254 点
在线时间: 828(时)
注册时间: 2010-07-21
最后登录: 2019-02-13
9 楼:  发表于: 2011-11-03 17:40    发自: Web Page
好东西啊,非常感谢~~

CocoaChina社区转载内容已尽可能注明出处,如未能核实来源或转发内容图片有权利瑕疵的,请及时联系社区进行修改或删除【联系方式QQ : 3442093904 邮箱:support@cocoachina.com】文章内容为作者独立观点,不代表CocoaChina社区立场。版权归原作者所有,如申请授权请联系作者,因文章侵权CocoaChina社区不承担任何法律及连带责任。

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部