iOS地图开发MapKit

现在O2O应用非常火,因为基于地理的社交和电子商务应用都有非常广阔的前景

二O2O的移动载体就是手机了(平板基本忽略不计),所以会点手机上Map开发还是不错的

首先苹果已经封装了一套地图框架供我们使用,首先要使用苹果提供的地图框架需要导入MapKit框架

导入完成后即可使用

首先在你的视图里拖入一个MapView,

然后运行就行了~这是你就会看到地图(如果用的是真机最好,模拟器有点蛋疼)

但是现实的是一个大大的地图,赶脚没什么用,我们需要的是一个比较精准的地图,这时进入MKMapView.h文件中去看看如何使用这个视图

首先看到的是一个代理~这就说明mapView通知外界消息的方式之一用了代理,点入代理会看到很多方法,具体这些方法有什么用自己去探索吧~

然后看到的是一个mapType,这时一个枚举变量,可以看到地图显示的模式有三种,一种是标准,一种是卫星,还有一种是混合的,分别设置然后运行一下就知道他们的区别了

再往下看是一个region属性,下面是一个setRegion方法,点option看一下帮助貌似是我们想要的,那个可以追踪位置的属性

我们尝试着设置一下,但是貌似我们不知道自己所在位置的经纬度,这时候看看代理里面有个叫update的方法,应该是定位用户以后调用的,此时应该已经有经纬度了

尝试着用一下啊

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    NSLog(@"%f %f", userLocation.coordinate.latitude, userLocation.coordinate.longitude);

    // 显示用户周边信息
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 100, 100);
    [mapView setRegion:region animated:YES];
}

设置完代理,然后实现这个方法以后,果然会定位到当前所在的位置了,上面的结构体都不难,自己查下头文件就好了,其实一个是经纬度,一个是显示比例

有时候我们还需要显示周边的位置信息,并且有醒目的图标,这时候就要用到MKAnnotation协议了,这个协议不是之前常用的代理协议,这种协议是另一种协议

这种协议需要我们自定义类去遵守,并且包含里面有的属性等

/**
 在协议中定义属性的用处

 可以保证所有遵守该协议的对象,都具有协议定义的属性

 使用带属性的协议,通常可以将协议中定义的属性,直接复制到新类中,取消属性的Readonly描述符即可

 协议只有.h,也就是只有定义,没有实现。
 */
@interface MyAnnotation : NSObject <MKAnnotation>

@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;

@property (nonatomic, strong) NSString *imageName;

@end

上面就是一个自定义类,实现协议

如何在地图上添加自定义的点呢?添加自顶一个点其实就是添加一个经纬度,下面的代码就是在mapVIew上添加两个自定义的点

  // 添加大头针
    MyAnnotation *annotation1 = [[MyAnnotation alloc] init];
    annotation1.coordinate = CLLocationCoordinate2DMake(30, 116);
    annotation1.title = @"我的地盘";
    annotation1.subtitle = @"哈哈哈";
    annotation1.imageName = @"head0";

    [_mapView addAnnotation:annotation1];

    MyAnnotation *annotation2 = [[MyAnnotation alloc] init];
    annotation2.coordinate = CLLocationCoordinate2DMake(30, 106);
    annotation2.title = @"重庆";
    annotation2.subtitle = @"哈哈哈";
    annotation2.imageName = @"head0";

    [_mapView addAnnotation:annotation2];

这样在运行一下就加上去了,有时候我们需要自己定义图标,而不用系统自带的那个红头大头针

这个自定义方法应该会在mapView的代理里面,所以我们去代理里面找找,看有没有返回UIView或其子类的方法,

然后就找到了~

下面的代码就是用返回自顶一个视图,代替系统提供的

#pragma mark 自定义大头针视图
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    // 判断annotation参数是否是MyAnnotation
    // 如果不是MyAnnotaion说明是系统的大头针,无需做处理
    if (![annotation isKindOfClass:[MyAnnotation class]]) {
        // 使用系统默认的大头针
        return nil;
    }

    // 可重用标示符
    static NSString *ID = @"MyAnno";

    // 查询可重用的大头针
    MKAnnotationView *annoView = [mapView dequeueReusableAnnotationViewWithIdentifier:ID];

    // 如果没有找到,再去实例化大头针
    if (annoView == nil) {
        annoView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];

        // 自定义大头针视图,如果要接受用户响应,需要设置此属性
        annoView.canShowCallout = YES;
    }

    // 设置大头针
    annoView.annotation = annotation;
    // 转换成MyAnnotation
    // 设置大头针视图的图像
    MyAnnotation *anno = annotation;
    annoView.image = [UIImage imageNamed:anno.imageName];

    NSLog(@"自定义大头针");

    return annoView;
}

之所以要判断类型是因为系统的Annotation协议对象没有image属性,如果不判断会崩溃掉

另外我们还经常用到就是计算两点之间的距离,这种需求苹果也想到了.所以这种方法苹果已经封装好了,下面就是实现代码

// 根据经纬度计算两点间的距离
    CLLocation *location1 = [[CLLocation alloc] initWithLatitude:30 longitude:116];
    CLLocation *location2 = [[CLLocation alloc] initWithLatitude:30 longitude:106];

    CLLocationDistance distance = [location1 distanceFromLocation:location2];

    NSLog(@"距离:%f", distance);

怎么样?好用吧,不过一般商业级应用都是使用高德和百度地图的SDK~所以真想学点东西的话,出了要了解苹果这一套框架还要去研究研究百度和高德的SDK

iOS地图开发MapKit

时间: 2024-10-14 06:40:38

iOS地图开发MapKit的相关文章

iOS 地图开发MapKit和CLLocation

1,iOS 定位服务 现在对iOS下的定组件建进行如下分类: 1>,无限蜂窝定位,根据移动设备距离基站的位置来实现定位的. 2>,GPS定位,也就是所谓的卫星定位,定位精确度较高,但是受遮盖环境影响较大, 3>,无线wifi定位,根据定位路由器的位置,实现定位, 4>,蓝牙beacon定位,定位精确度高,但是要求在外设的覆盖区域内 下面我们主要讲讲iOS下面的定位吧,主要框架CoreLocation.framework,主要对象CLLocationManager,主要代理CLLoc

iOS 地图开发小结

首先来说说ios地图开发使用的主要类: MKMapView:地图控件,无其他Label等控件无异,拖进来就可以用了,用于地图的内容的显示,用户可以对地图进行放大.缩小.拖动.旋转等操作: CLLocationCoordinate2D :坐标,包括经度和纬度: MKCoordinateSpan :地图跨度,表示地图放大倍数,数值越小地图显示的单位越精细: CLLocationManager :用户所在位置的管理类,通过该类的能够获取用户所在的GPS坐标. 下面与大家分享一些个人项目中地图部分所涉及

iOS地图开发

原文地址:http://www.jianshu.com/p/1ae98a3ff9e4 在iOS中, 地图开发经常会用到的三个框架, 一个是苹果系统自带的MapKit框架, 另外两个, 一个是百度地图BMKMapView, 另一个是高德地图MAMapView. 当时我莫名的对一个问题产生了浓厚的兴趣, 就是百度地图和高德地图英文命名是什么意思!? 于是我就毫不蛋疼的去googol了, 而且还在他俩的社区提问这个问题! 终于, 在我的努力下弄明白他俩代表的意思了. 先看百度地图 BMKMapView

iOS地图开发详解一(MKMapView)

一.ios地图说明 ios中自带有地图,之前使用的时谷歌的,不过现在使用的是高德地图,另外在国内,百度地图也很常用. 二.代码实现 1.导入框架 导入MapKit框架如下图所示 2.创建并显示地图 经过以上两步,地图已经可以显示出来了 注意:以上步骤一定要来联网的基础上进行,否则只会看到格子而不会显示地图. 3.设置显示区域 上面的操作显示的地图并不能满足要求,因为它显示的不是我们想要的区域,下面我们说下怎样设置当前显示区域 网上查到北京故宫博物馆的纬度和经度为{39.918031,116.40

iOS地图开发-基本使用

地图的基本使用 1.设置地图显示类型 /** MKMapTypeStandard = 0, // 标准 MKMapTypeSatellite, // 卫星 MKMapTypeHybrid, // 混合(标准+卫星) MKMapTypeSatelliteFlyover NS_ENUM_AVAILABLE(10_11, 9_0), // 3D立体卫星 MKMapTypeHybridFlyover NS_ENUM_AVAILABLE(10_11, 9_0), // 3D立体混合 */ self.cus

[IOS地图开发系类]2、位置解码CLGeocoder

  接第一步的操作,获取到地址信息经纬度后,我们可以对其进行解码,解码采用的CLGeocoder这个类,使用方式如下: 1.在ViewControlelr.m文件中声明一个CLGeocoder的属性,给页面加一个button,然后在处理方法中,对上一篇获取的地址坐标进行解码, code如下 #import "ViewController.h" #import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h&

【高德API】如何利用MapKit开发全英文检索的iOS地图

原文:[高德API]如何利用MapKit开发全英文检索的iOS地图 制作全英文地图的展示并不困难,但是要制作全英文的数据检索列表,全英文的信息窗口,你就没办法了吧.告诉你,我有妙招!使用iOS自带的MapKit来展示全球英文底图,结合上高德API的中英文检索功能,就能打造POI数据最丰富,英文展示全方位的纯英文地图啦!看看截图,是不是浑然天成? ----------------------------------------------------------------------------

iOS定位服务与地图开发(4)---显示地图

iOS 6之前,苹果使用的是谷歌地图,iOS 6之后,苹果使用了自己的地图(国内好像用的是高德地图),但是API编程接口与iOS 5相比没有太大变化. iOS 应用程序中使用Map Kit API开发地图应用程序,使用MKMapView类作为地图显示视图,其委托协议是MKMapViewDelegate. 1.显示地图: .h文件中代码 #import <MapKit/MapKit.h> @interface YXCViewController <MKMapViewDelegate>

iOS原生地图开发进阶——使用导航和附近兴趣点检索

iOS原生地图开发进阶——使用导航和附近兴趣点检索 iOS中的mapKit框架对国际化的支持非常出色.在前些篇博客中,对这个地图框架的基础用法和标注与覆盖物的添加进行了详细的介绍,这篇博客将介绍两个更加实用的功能的开发:线路导航与兴趣点搜索.前几篇博客的链接如下: 地图基础用法详解:http://my.oschina.net/u/2340880/blog/415360. 添加大头针与自定义标注:http://my.oschina.net/u/2340880/blog/415441. 添加地图覆盖