地图应用开发主要使用Map Kit API,其核心是MKMapView类。
1、显式地图
在Map Kit API中,显式地图的视图是MKMapView,委托协议是MKMapViewDelegate。使用Map Kit API时要导入MapKit框架。
MKMapView的mapType属性可以设置地图类型,它是美剧类型MKMapType中定义的,如下:
Swift枚举成员
(1)standard,标准地图类型。
(2)satellite,卫星地图类型。其上没有接到名称等信息。
(3)hybrid,混合地图类型,其上标注出接到等信息。
(4)satelliteFlyover,卫星Flyover地图类型。其能提供从空中俯瞰的3D效果。
(5)hybridFlyover,在卫星Flyover地图上标注出接到等信息。
ObjectiveC枚举成员
(1)MKMapTypeStandard,标准地图类型。
(2)MKMapTypeSatellite,卫星地图类型。其上没有接到名称等信息。
(3)MKMapTypeHybrid,混合地图类型,其上标注出接到等信息。
(4)MKMapTypeSatelliteFlyover,卫星Flyover地图类型。其能提供从空中俯瞰的3D效果。
(5)MKMapTypeHybridFlyover,在卫星Flyover地图上标注出接到等信息。
例:
Swift代码
// An highlighted block
//ViewController.swift文件
import UIKit
//引入MapKit模块
import MapKit
class ViewController:UIViewController{
@IBOutlet weak var mapView:MKMapView!
override func viewDidLoad(){
super.viewDidLoad()
}
override func viewWillAppear(_ animated:Bool){
super.viewWillAppear(animated)
//设置地图类型为标准地图
self.mapView.mapType=.standard
//创建CLLocation对象,指定地图中心点。
let location=CLLocation(latitude:40.940393,longitude:118.494959)
//调整地图位置和缩放比例
//MKCoordinateRegionMakeWithDistance函数创建一个结构体MKCoordinateRegion,该结构体封装了一个地图区域,结构体如下
/*
struct MKCoordinateRegion{
var center:CLLocationCoordinate2D//中心点
var span:MKCoordinateSpan//跨度
//MKCoordinateSpan也是结构体,风筝了地图的跨度信息,
//struct MKCoordinateSpan{
//var latitudeDelta:CLLocationDegrees//区域的南北跨度,单位是米
//var longitudeDelta:CLLocationDegrees//区域的东西跨度,单位是米
//}
}
*/
let viewRegion=MKCoordinateRegionMakeWithDistance(location.coordinate,10000,10000)
//重新设置地图视图的显式区域,这会影响地图缩放。
self.mapView.region=viewRegion
}
@IBAction func selectMapViewType(_ sender:AnyObject){
let sc=sender as! UISegmentedControl
swich (sc.selectedSegmentIndex){
case 1:
self.mapView.mapType=.satellite
case 2:
self.mapView.mapType=.hybrid
default:
self.mapView.mapType=.standard
}
}
}
ObjectiveC代码
// An highlighted block
//ViewController.m文件
#import "ViewController.h"
#import <MapKit/MapKit.h>
@interface ViewController()
@property(weak,nonatomic)IBOutlet MKMapView *mapView;
@end
@implementation ViewController
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//设置地图类型为标准地图
self.mapView.mapType=MKMapTypeStandard;
//创建CLLocation对象,指定地图中心点。
CLLocation *location=[[CLLocation alloc] initWithLatitude:40.494949 longitude:117.484959];
//调整地图位置和缩放比例
//MKCoordinateRegionMakeWithDistance函数创建一个结构体MKCoordinateRegion,该结构体封装了一个地图区域,结构体如下
/*
stypedef struct {
CLLocationCoordinate2D center;//中心点
MKCoordinateSpan span;//跨度
//MKCoordinateSpan也是结构体,风筝了地图的跨度信息,
//typedef struct{
//CLLocationDegrees latitudeDelta;//区域的南北跨度,单位是米
//CLLocationDegrees longitudeDelta;//区域的东西跨度,单位是米
//}MKCoordinateSpan
}MKCoordinateRegion
*/
MKCoordinateRegion viewRegion=MKCoordinateRegionMakeWithDistance(location.coordinate,10000,10000);
self.mapView.region=virwRegion;
}
-(IBAction)selectMapViewType:(id)sender{
UISegmentedControl* sc=(UISegmentedControl*)sender;
switch (sc.selectedSegmentIndex){
case 1:
self.mapView.mapType=MKMapTypeSatellite;
break;
case 2:
self.mapView.mapType=MKMapTypeHybrid;
break;
default:
self.mapView.mapType=MKMapTypeStandard;
}
}
@end
2、显式3D地图
3D地图的核心是摄像机类MKMapCamera。为了支持2D地图,MKMapView增加了camera属性,该属性是MKMapCamera类型。
摄像机是2D控件中非常重要的内容,摄像机的属性决定了我们看到的3D地图样式。摄像机有如下4个重要的属性:
(1)centerCoordinate,设置地图视图的中心坐标。
(2)pitch,摄像机俯视角,0度垂直只想地图,90度平行于地图。
(3)altitude,摄像机海拔高度。
(4)heading,摄像头前进方向,相对于地理北方的角度,0度说明地图视图顶边为地理北方,90度说明地图视图的顶部为地理东方。
例:
Swift代码
// An highlighted block
//ViewController.swift文件
import UIKit
//引入MapKit模块
import MapKit
class ViewController:UIViewController{
@IBOutlet weak var mapView:MKMapView!
override func viewDidLoad(){
super.viewDidLoad()
}
override func viewWillAppear(_ animated:Bool){
super.viewWillAppear(animated)
//设置地图类型为标准地图
self.mapView.mapType=.standard
self.placeCamera()
}
@IBAction func