美文网首页
MapView相关

MapView相关

作者: 喵喵粉 | 来源:发表于2019-11-28 10:25 被阅读0次

    1. 设置缩放级别

    - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {
        //置于中点
    //    [mapView setCenterCoordinate:view.annotation.coordinate animated:YES];
        [mapView setCenterCoordinate:view.annotation.coordinate zoomLevel:13 animated:YES];
    }
    

    MKMapView+ZoomLevel.h

    @interface MKMapView (ZoomLevel)
    
    /**
     CLLocationCoordinate2D centerCoord;
     [mapView setCenterCoordinate:centerCoord zoomLevel:ZOOM_LEVEL animated:NO];
     */
    - (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
                      zoomLevel:(NSUInteger)zoomLevel
                       animated:(BOOL)animated;
    
    @end
    

    MKMapView+ZoomLevel.m

    #import "MKMapView+ZoomLevel.h"
    
    #define MERCATOR_OFFSET 268435456
    #define MERCATOR_RADIUS 85445659.44705395
    
    @implementation MKMapView (ZoomLevel)
    
    #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 - 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 - 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
    

    2. 经纬度 度分秒-数字互转

    经纬度(48.713140E,31.22908N)转化为度分秒

    度分秒60进制,按照1度=60分,1分=60秒

    48.713140 就是48度
    60×0.71314=42.7884分,取整故分为42分
    60×0.7884=47.304,取整故秒为47秒

    (北纬31°13′44″N, 东经48°42′47″E)

    负数
    (南纬-31°13′44″S, 西经-48°42′47″W)

    CoordinateHelper.h

    @interface CoordinateHelper : NSObject
    
    /**
     度分秒格式转换成经纬度
    (34°01‘04“N, 93°20‘17“E) -> (34.0178524497, 93.3383025100)
    
     NSString *dLat = @"34°01‘04“N";
     NSString *dLon = @"93°20‘17“E";
     CLLocationCoordinate2D coor = [self getCoordinate2DWithLatitude:dLat longitude:dLon];
     
     //result 2 - (34.017776, 93.338058)
     NSLog(@"result 2 - (%f, %f)", coor.latitude, coor.longitude);
    */
    + (CLLocationCoordinate2D)getCoordinate2DWithLatitude:(NSString *)latitudeStr longitude:(NSString *)longitudestr;
    
    /**
     经纬度转换成度分秒格式
    (34.0178524497, 93.3383025100) -> (34°01‘04“N, 93°20‘17“E)
     
     //青海省玉树藏族自治州治多县索加乡
     NSString *latString = @"34.0178524497";
     NSString *lonString = @"93.3383025100";
     NSString *rst =[self formatDegreeMinuteSecondWithLatitude:latString longitude:lonString];
     
     //result 1 - (34°01‘04“N, 93°20‘17“E)
     NSLog(@"result 1 - %@", rst);
    */
    + (NSString *)formatDegreeMinuteSecondWithLatitude:(NSString *)latitude longitude:(NSString *)longitude;
    
    @end
    

    CoordinateHelper.m

    #import "CoordinateHelper.h"
    
    @implementation CoordinateHelper
    
    #pragma mark - ================= 度分秒格式转换成经纬度 ======================
    
    /**
     度分秒格式转换成经纬度
    (34°01‘04“N, 93°20‘17“E) -> (34.0178524497, 93.3383025100)
    
     NSString *dLat = @"34°01‘04“N";
     NSString *dLon = @"93°20‘17“E";
     CLLocationCoordinate2D coor = [self getCoordinate2DWithLatitude:dLat longitude:dLon];
     
     //result 2 - (34.017776, 93.338058)
     NSLog(@"result 2 - (%f, %f)", coor.latitude, coor.longitude);
    */
    + (CLLocationCoordinate2D)getCoordinate2DWithLatitude:(NSString *)latitudeStr longitude:(NSString *)longitudestr {
        if (!([[latitudeStr uppercaseString] containsString:@"N"] || [[latitudeStr uppercaseString] containsString:@"S"])) {
            return CLLocationCoordinate2DMake(latitudeStr.doubleValue, longitudestr.doubleValue);
        }
        
        NSMutableString *mStr = [NSMutableString stringWithString:latitudeStr];
        NSString *tmp = [mStr stringByTrimmingCharactersInSet:[NSCharacterSet letterCharacterSet]];
        float latitude = [self string2Float:tmp];
        
        mStr = [NSMutableString stringWithString:longitudestr];
        tmp = [mStr stringByTrimmingCharactersInSet:[NSCharacterSet letterCharacterSet]];
        float longitude = [self string2Float:tmp];
        
        return CLLocationCoordinate2DMake(latitude, longitude);
    }
    
    /**
     34°01‘04“ -> [34,01,04,] -> [34, 01/60, 04/60/60] -> 34+01/60+04/60/60
     */
    + (float)string2Float:(NSString *)string {
        NSMutableArray *dmsStrs = [NSMutableArray arrayWithArray:[string componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"°‘“"]]];
        if (dmsStrs.count>3) [dmsStrs removeLastObject];
        if (dmsStrs.count<3) return 0.0f;
        
        float degree = [dmsStrs[0] doubleValue]/1;
        float minute = [dmsStrs[1] doubleValue]/60;
        float second = [dmsStrs[2] doubleValue]/60/60;
        
        return degree+minute+second;
    }
    
    
    #pragma mark - ================= 经纬度转换成度分秒格式 ======================
    /**
     经纬度转换成度分秒格式
    (34.0178524497, 93.3383025100) -> (34°01‘04“N, 93°20‘17“E)
     
     //青海省玉树藏族自治州治多县索加乡
     NSString *latString = @"34.0178524497";
     NSString *lonString = @"93.3383025100";
     NSString *rst =[self formatDegreeMinuteSecondWithLatitude:latString longitude:lonString];
     
     //result 1 - (34°01‘04“N, 93°20‘17“E)
     NSLog(@"result 1 - %@", rst);
    */
    + (NSString *)formatDegreeMinuteSecondWithLatitude:(NSString *)latitude longitude:(NSString *)longitude {
    
        int lan = [latitude intValue];
        int lon = [longitude intValue];
        
        //纬度 N S
        NSString *suffixLan = lan>0?@"N":@"S";
        //经度 E W
        NSString *suffixLon = lon>0?@"E":@"W";
        
        NSString *lanStr = [NSString stringWithFormat:@"%@%@", [self convert2DMSFormat:latitude], suffixLan];
        NSString *lonStr = [NSString stringWithFormat:@"%@%@", [self convert2DMSFormat:longitude], suffixLon];
        
        //(34°01‘04“N, 93°20‘17“E)
        return [NSString stringWithFormat:@"(%@, %@)", lanStr, lonStr];
    }
    
    + (NSString *)convert2DMSFormat:(NSString *)coordinateString {
        /** 将经度或纬度整数d部分提取出来 */
        int degree = [coordinateString intValue];
        int minute = 0;
        int second = 0;
        
        NSString *passStr = [NSString stringWithFormat:@"%@", coordinateString];
        passStr = [self convertStringToInt:passStr outNum:&minute];
        passStr = [self convertStringToInt:passStr outNum:&second];
        
        /** 将经度或纬度字符串合并为(xx°xx')形式 */
        NSString *string = [NSString stringWithFormat:@"%.2d°%.2d‘%.2d“", degree, minute, second];
        return string;
    }
    
    //取小数点后面的数 度->分/秒
    + (NSString *)convertStringToInt:(NSString *)string outNum:(int *)num {
        NSArray *array = [string componentsSeparatedByString:@"."];
        NSString *tmpStr = [NSString stringWithFormat:@"0.%@", array.lastObject];
        
        double number = [tmpStr doubleValue] * 60.0;
        string = [NSString stringWithFormat:@"%f", number];
        
        *num = (int)number;
        
        return string;
    }
    
    @end
    

    相关文章

      网友评论

          本文标题:MapView相关

          本文链接:https://www.haomeiwen.com/subject/lsvvwctx.html