zoukankan      html  css  js  c++  java
  • IOS 使用IOS6苹果地图

    IOS应用程序中使用Map Kit API开发地图应用程序。其核心是MKMapView类的使用。我们可以设置地图显示方式,控制地图,可以在地图上添加标注。

    1.显示地图

      在Map Kit API中显示地图的师徒是MKMapView,他的委托协议是MKMapViewDelegate。Map Kit API使用需要导入MapKit框架。

      下面通过一个实例介绍一下Map Kit API的使用,实例如图所示,再输入查询地点关键字文本框中输入关键字,单击查询,先进行地理信息编码查询,查询获得地标后在地图上标注出来。

    首先添加框架MapKit.framework,设置视图,在ViewController.h代码如下:

     1 #import <UIKit/UIKit.h>
     2 #import <MapKit/MapKit.h>
     3 #import "HBMapLocation.h"
     4 
     5 @interface HBMaPViewController : UIViewController<MKMapViewDelegate>
     6 @property (weak, nonatomic) IBOutlet UITextField *txtQueryKey;
     7 @property (weak, nonatomic) IBOutlet MKMapView *mapView;
     8 - (IBAction)gecodeQuery:(id)sender;
     9 - (IBAction)getMyPlace:(id)sender;
    10 
    11 @property (nonatomic ,readwrite)CLLocationCoordinate2D coordinate;
    12 @end

    其中头文件中的“HBMapLocation.h”是我们定义的描述地图标注点类,稍后再说。在ViewController.m中代码如下:

      1 - (void)viewDidLoad
      2 {
      3     [super viewDidLoad];
      4     // Do any additional setup after loading the view.
      5     self.mapView.mapType = MKMapTypeStandard;
      6     self.mapView.delegate = self;
      7     self.mapView.showsUserLocation = YES;
      8     [_mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
      9 }

    其中viewDidLoad方法中设置地图的类型,他的类型有3种:

      (1)MKMapTypeStandard标注地图类型

      (2)MKMapTypeSatellite 卫星地图类型

      (3)MKMapTypeHybrid混合地图类型。

    2.添加标注

      如果要实现在地图视图上添加标注点,需要两个步骤:第一步时触发添加动作;第二步是实现地图委托方法mapView:viewForAnnotation:完成添加标注。

      2.1 触发添加动作

      通过查询按钮触发添加标注代码如下:

     1 - (IBAction)gecodeQuery:(id)sender {
     2     
     3     if(_txtQueryKey.text == nil || [_txtQueryKey.text length] ==0 )
     4     {
     5         return;
     6     }
     7     
     8     CLGeocoder *geocoder = [[CLGeocoder alloc]init];
     9     [geocoder geocodeAddressString:_txtQueryKey.text completionHandler:^(NSArray *placemarks, NSError *error) {
    10         int i=[placemarks count];
    11         NSLog(@"查询记录数:%i",i);
    12         
    13         if([placemarks count]>0)
    14         {
    15             [_mapView removeAnnotations:_mapView.annotations];
    16         }
    17         
    18         for (int i=0; i<[placemarks count]; i++) {
    19             CLPlacemark *placemark = placemarks[i];
    20             
    21             //关闭键盘
    22             [self.txtQueryKey resignFirstResponder];
    23             
    24             //调整地图位置和缩放比例
    25             MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(placemark.location.coordinate, 3000, 3000);
    26             [_mapView setRegion:viewRegion animated:YES];
    27             
    28             HBMapLocation *annotation = [[HBMapLocation alloc]init];
    29             annotation.streetAddress=placemark.thoroughfare;
    30             annotation.city=placemark.locality;
    31             annotation.state=placemark.administrativeArea;
    32             annotation.zip=placemark.postalCode;
    33             annotation.coordinate=placemark.location.coordinate;
    34             
    35             [_mapView addAnnotation:annotation];
    36         }
    37     }];
    38     
    39 }

    2. 实现地图委托方法mapView:viewForAnnotation: 完成添加标注

     1 - (IBAction)getMyPlace:(id)sender {
     2     self.mapView.centerCoordinate = self.coordinate;
     3     MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(self.coordinate, 3000, 3000);
     4     [_mapView setRegion:viewRegion animated:YES];
     5     
     6 }
     7 
     8 -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
     9 {
    10     MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[_mapView dequeueReusableAnnotationViewWithIdentifier:@"PIN_ANNOTATION"];
    11     
    12     if(annotationView == nil)
    13     {
    14         annotationView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"PIN_ANNOTATION"];
    15     }
    16     
    17     annotationView.pinColor = MKPinAnnotationColorPurple;
    18     annotationView.animatesDrop = YES;
    19     annotationView.canShowCallout = YES;
    20     
    21     return annotationView;
    22 }

    3.跟踪用户位置变化

     MapKit 提供个跟踪用户位置和方向变化的API,可以不用自己编写定位服务代码。开启地图的showUserLocation属性,并设置方法setUserTrackingMode:就可以了,其代码写在viewDidLoad中。

    然后还需要实现地图视图委托方法mapView:didUpdateUserLocation: 代码如下

    1 -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
    2 {
    3     self.coordinate=userLocation.location.coordinate;
    4     self.mapView.centerCoordinate = userLocation.location.coordinate;
    5      MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(userLocation.location.coordinate, 3000, 3000);
    6     [_mapView setRegion:viewRegion animated:YES];
    7 }

    其中自定义标注类HBMapLocation.h代码如下

     1 #import <Foundation/Foundation.h>
     2 #import <MapKit/MapKit.h>
     3 
     4 @interface HBMapLocation : NSObject<MKAnnotation>
     5 
     6 
     7 //街道信息属性
     8 @property (nonatomic,copy)NSString *streetAddress;
     9 //城市信息属性
    10 @property (nonatomic,copy)NSString *city;
    11 //州,省,市信息
    12 @property (nonatomic,copy)NSString *state;
    13 //邮编
    14 @property (nonatomic,copy)NSString *zip;
    15 //地理坐标
    16 @property (nonatomic ,readwrite)CLLocationCoordinate2D coordinate;
    17 
    18 @end

    HBMapLocation.m代码如下:

     1 @implementation HBMapLocation
     2 
     3 -(NSString *)title
     4 {
     5     return @"要查找的位置";
     6 }
     7 
     8 -(NSString *)subtitle
     9 {
    10     NSMutableString *ret = [NSMutableString new];
    11     if(_state)
    12     {
    13         [ret appendString:_state];
    14     }
    15     if(_city)
    16     {
    17         [ret appendString:_city];
    18     }
    19     if(_city && _state)
    20     {
    21         [ret appendString:@", "];
    22     }
    23     if(_streetAddress && (_city || _state || _zip))
    24     {
    25         [ret appendString:@"?"];
    26     }
    27     if(_streetAddress)
    28     {
    29         [ret appendString:_streetAddress];
    30     }
    31     if(_zip)
    32     {
    33         [ret appendFormat:@", %@",_zip];
    34     }
    35     return ret;
    36 }
    37 
    38 @end

    运行如下:

  • 相关阅读:
    爆炸函数 explode
    创建 hive 用户自定义函数UDF,UDTF,UDAF
    数据仓库
    elasticsearch源码分析及插件开发
    JVM垃圾回收机制
    条件阻塞Condition的应用
    java 线上问题定位工具
    都是套路:高并发系统的降级特技
    java并发编程--Runnable Callable及Future
    什么是XSS攻击?什么是SQL注入攻击?什么是CSRF攻击?
  • 原文地址:https://www.cnblogs.com/haibosoft/p/3688777.html
Copyright © 2011-2022 走看看