`

Leonbao:MapKit学习笔记

    博客分类:
  • ios
 
阅读更多

Leonbao:MapKit学习笔记   

1、概述
插入MapView,设置Delegate(一般为Controller),Annotations记录兴趣位置点(AnnotationView用来显示兴趣位置点),annotation是可选的,选中的annotation会显示callout,用来显示信息。

2、设置地图显示类型:
mapView.mapType = MKMapTypeStandard;
mapView.mapType = MKMapTypeSatellite;
mapView.mapType = MKMapTypeHybrid;

3、显示用户位置
设置为可以显示用户位置:
mapView.showsUserLocation = YES;
判断用户当前位置是否可见(只读属性):
userLocationVisible
得到用户位置坐标:当userLocationVisible为YES时
CLLocationCoordinate2D coords = mapView.userLocation.location.coordinate;

4、坐标范围
MKCoordinateRegion用来设置坐标显示范围。
包括两部分:Center(CLLocationCoordinate2D struct,包括latitude和longitude),坐标中心
和Span(MKCoordinateSpan struct,包括latitudeDelta和longitudeDelta),缩放级别
MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(center,2000, 2000);
以上代码创建一个以center为中心,上下各1000米,左右各1000米得区域,但其是一个矩形,不符合MapView的横纵比例
MKCoordinateRegion adjustedRegion = [mapView regionThatFits:viewRegion];
以上代码创建出来一个符合MapView横纵比例的区域
[mapView setRegion:adjustedRegion animated:YES];
以上代码为:最终显示该区域

5、Delegate
使用MapView须符合MKMapViewDelegate协议

5.1、地图加载Delegate
当需要从Google服务器取得新地图时
mapViewWillStartLoadingMap:
当成功地取得地图后
mapViewDidFinishLoadingMap:
当取得地图失败后(建议至少要实现此方法)
mapViewDidFailLoadingMap:withError:

5.2、范围变化Delegate
当手势开始(拖拽,放大,缩小,双击)
mapView:regionWillChangeAnimated:
当手势结束(拖拽,放大,缩小,双击)
mapView:regionDidChangeAnimated:

 

判断坐标是否在MapView显示范围内:
CLLocationDegrees leftDegrees = mapView.region.center.longitude –(mapView.region.span.longitudeDelta / 2.0);
CLLocationDegrees rightDegrees = mapView.region.center.longitude +(mapView.region.span.longitudeDelta / 2.0);
CLLocationDegrees bottomDegrees = mapView.region.center.latitude –(mapView.region.span.latitudeDelta / 2.0);
CLLocationDegrees topDegrees = self.region.center.latitude +(mapView.region.span.latitudeDelta / 2.0);

 

if (leftDegrees > rightDegrees) { // Int’l Date Line in View
leftDegrees = -180.0 – leftDegrees;
if (coords.longitude > 0) // coords to West of Date Line
coords.longitude = -180.0 – coords.longitude;
}
If (leftDegrees <= coords.longitude && coords.longitude <= rightDegrees && bottomDegrees <= coords.latitude && coords.latitude <= topDegrees) {
   // 坐标在范围内
}6、Annotation

 

Annotation包含两部分:Annotation Object和Annotation View

 

Annotation Object必须符合协议MKAnnotation,包括两个方法:title和subtitle,分别用于显示注释的标题和子标题。还有 coordinate属性,返回CLLocationCoordinate2D,表示Annotation的位置
然后,需使用mapView:viewForAnnotation: 方法来返回MKAnnotationView或者MKAnnotationView的子类用来显示Annotation(注意:这里显示的不是选中Annotation后的弹出框)

 

你可以子类化MKAnnotationView,然后再drawRect:方法里面进行自己的绘制动作(这个方法很蠢)

 

你完全可以实例化一个MKAnnotationView,然后更改它的image属性,这样很简单。

 

7、添加移除Annotation
添加一个Annotation
[mapView addAnnotation:annotation];
添加一个Annotation数组
[mapView addAnnotations:[NSArray arrayWithObjects:annotation1, annotation2, nil]];
移除一个Annotation
removeAnnotation:
移除一个Annotation数组
removeAnnotations:
移除所有Annotation
[mapView removeAnnotations:mapView.annotations];

8、选中Annotation
一次只能有一个Annotation被选中,选中后会出现CallOut(浮动框)
简单的CallOut显示Title和SubTitle,但你也可以自定义一个UIView作为CallOut(与自定义的TableViewCell一样)
可通过代码选中Annotation:
selectAnnotation:animated:
或者取消选择:
deselectAnnotation:animated:

 

9、显示Annotation
通过mapView:viewForAnnotation: 方法显示Annotation,每在MapView中加入一个Annotation,就会调用此方法
示例(与tableView:cellForRowAtIndexPath: 很相似)
- (MKAnnotationView *) mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>) annotation {
static NSString *placemarkIdentifier = @”my annotation identifier”;
if ([annotation isKindOfClass:[MyAnnotation class]]) {
     MKAnnotationView *annotationView = [theMapView dequeueReusableAnnotationViewWithIdentifier:placemarkIdentifier];
if (annotationView == nil) {
         annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:placemarkIdentifier];
annotationView.image = [UIImage imageNamed:@"blood_orange.png"];
}
else
annotationView.annotation = annotation;
return annotationView;
}
return nil;
}10、取得真实地址
示例:
初始化MKReverseGeocoder

MKReverseGeocoder *geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:coordinates];
geocoder.delegate = self;
[geocoder start];
如果无法处理坐标,则调用reverseGeocoder:didFailWithError: 方法

 

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {
NSLog(@”Error resolving coordinates: %@”, [error localizedDescription]);
geocoder.delegate = nil;
[geocoder autorelease];
}
如果成功,则调用reverseGeocoder:didFindPlacemark: 并把信息存储在MKPlacemark 中
didFindPlacemark:(MKPlacemark *)placemark {
NSString *streetAddress = placemark.thoroughfare;
NSString *city = placemark.locality;
NSString *state = placemark.administrativeArea;
NSString *zip = placemark.postalCode;
// Do something with information
geocoder.delegate = nil;
[geocoder autorelease];
}

分享到:
评论

相关推荐

    ios-mapKit.zip

    MapKit是iOS操作系统中的一个核心框架,用于在应用程序中集成地图功能。这个框架与Apple的Map服务紧密相连,允许开发者创建交互式地图、定位用户、显示兴趣点(POIs)、规划路线等。在iOS应用开发中,MapKit是实现...

    IOS应用源码之Apple的MapKit相关官方Sample三个送上WeatherMap.zip

    通过"WeatherMap"这个示例,开发者可以学习到如何将天气信息与地图功能结合,创建出具有实用性的iOS应用。这不仅加深了对MapKit的理解,也为开发其他类型的地图应用提供了灵感和实践指导。在实际开发中,应结合苹果...

    IOS应用源码之Apple的MapKit相关官方Sample三个送上CurrentAddress.zip

    通过对"CurrentAddress.zip"中的示例代码学习,开发者能够掌握如何在iOS应用中整合MapKit框架,获取并显示用户当前位置,以及如何优雅地处理地图交互。这将对构建涉及地图功能的iOS应用大有裨益。

    mapkit-js-demo:MapKit JS-适用于网络的Apple Maps

    MapKit JS是Apple提供的一款JavaScript库,用于在网络应用中集成其强大的地图服务。"mapkit-js-demo"项目是一个示例,展示了如何在Web环境中利用MapKit JS库来创建交互式地图。然而,需要注意的是,这个项目可能不再...

    ios-guided-project-mapkit-starter:MapKit入门指南项目

    MapKit是Apple为iOS、macOS和watchOS平台提供的一个强大的框架,用于在应用程序中集成地图功能。...通过这个入门项目,开发者可以学习到如何在Swift应用中集成地图,并为后续更深入的MapKit学习打下坚实基础。

    Using-Maps:MapKit 使用

    使用地图 在地图上显示目标区域 步骤 0. 添加“MKMapViewDelegate”协议 class ViewController: UIViewController, MKMapViewDelegate {...} 步骤 1.... // Step1.... // - 1.1 Define position var latitude:...

    Where-Am-I:MapKit 使用

    我在哪里 将位置转换为美国地址格式 func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { var usrLocation:CLLocation = locations[0] as CLLocation ...

    ios地图

    在iOS开发中,地图功能是不可或缺的一部分,尤其对于构建地理位置相关的应用来说至关重要。"ios地图"这个主题涵盖了许多与苹果地图API(MapKit)相关的...学习并熟练掌握这些知识点,将使你在iOS地图开发中游刃有余。

    ios-地图demo.zip

    在iOS开发中,地图功能是不可或缺的一部分,尤其在构建地理位置相关的应用时。"ios-地图demo.zip" 提供了一个关于地图...通过对"redmap"的分析和学习,开发者可以掌握MapKit的使用技巧,进一步提升自己的iOS开发技能。

    swift-原生地图自定义开发demo

    通过学习和掌握上述知识点,开发者能够充分利用Swift的MapKit框架,构建出功能强大、用户体验优良的原生地图应用。无论是简单的地图显示,还是复杂的路径规划和定制化交互,都可以通过熟练运用这些技术来实现。

    MapLocationUpdater:使用 mapkit 和手势识别器更新地图上的位置

    在iOS开发中,使用MapKit框架和手势识别器可以创建类似拼车应用的功能,例如Uber、Lyft和SideCar中的地图位置更新功能。MapLocationUpdater项目正是为了实现这样的功能,让用户能够实时跟踪地图上的位置更新,并获取...

    Map地图demo

    通过学习和理解这些MapKit和CoreLocation的基础知识,你可以创建更复杂的地图应用,比如集成导航功能、显示兴趣点等。 为了深入了解"Map地图demo"的工作原理,你需要打开项目,查看`ViewController.swift`或其他...

    IOS地图源代码

    通过学习并理解这些核心概念,开发者可以创建出功能丰富的地图应用。在“MapCallouts”源代码中,我们可以期待找到关于如何实现交互式信息窗口的实践示例,这对于提升用户体验非常有帮助。为了更好地利用这个资源,...

    MapKit:Cordova MapKit 插件

    plugman install --platform android --project android-mapkit-example/ --plugin /path/to/MapKit --variable API_KEY="YOUR_API_KEY_FROM_GOOGLE" 或使用cordova CLI cordova -d plugin add /path/to/MapKit -...

    MapKitDemo

    MapKitDemo是一个基于Swift开发的示例项目,它利用了Apple的MapKit框架来展示如何在iOS应用中集成地图功能。MapKit框架是Apple提供的...这个示例项目是一个极好的学习资源,帮助你掌握MapKit框架的基本用法和高级特性。

    iOS-Zip3-Mapkit:使用Mapkit的Zip3 shapefile的iOS渲染

    在iOS开发中,MapKit框架是苹果提供的一种...通过学习和理解这一过程,开发者可以更好地在iOS应用中实现地理数据分析和可视化,提供丰富的交互式地图体验。这个项目的源码可以作为一个起点,帮助你理解和实践这些技术。

    MapKitShowcase:MapKitShowcase是收集Mapkit使用情况的源代码。 -MapKitShowcaseはMapkitの利用方法を集めたソースコードです-Show source code

    在这个项目中,你可以找到关于MapKit的详细实践代码,帮助你理解和学习如何在实际开发中有效利用MapKit。 MapKit框架的核心组件包括: 1. MKMapView:这是MapKit中最关键的类,用于在应用中展示地图。通过...

    IOS MapKit应用

    MapKit是iOS SDK中的一个核心框架,用于在iOS应用程序中集成地图功能。它与Apple的Map服务紧密集成,...通过学习和实践MapKit,开发者可以构建出具有专业地图功能的应用程序,满足用户在导航、位置服务等方面的需求。

    iOS-Github上的13套[地图相关源代码]

    10. **地图服务扩展**:除了MapKit,还有第三方地图服务如Google Maps SDK for iOS,开发者可以对比学习不同地图服务的特点和使用方法。 通过深入研究这些开源项目,开发者不仅可以提升自己的地图编程技能,还能...

Global site tag (gtag.js) - Google Analytics