地图应用开发主要使用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 MapKitclass 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! UISegmentedControlswich (sc.selectedSegmentIndex){case 1:self.mapView.mapType=.satellitecase 2:self.mapView.mapType=.hybriddefault: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 MapKitclass ViewController:UIViewController{@IBOutlet weak var mapView:MKMapView!override func viewDidLoad(){super.viewDidLoad()}override func viewWillAppear(_ animated:Bool){super.viewWillAppear(animated)//设置地图类型为标准地图self.mapView.mapType=.standardself.placeCamera()}@IBAction func selectMapViewType(_ sender:AnyObject){let sc=sender as! UISegmentedControlswich (sc.selectedSegmentIndex){case 1:self.mapView.mapType=.satellitecase 2:self.mapView.mapType=.hybriddefault:self.mapView.mapType=.standard}self.placeCamera()}//设置3D摄像机func placeCamera(){//常见摄像机对象let mapCamera=MKMapCamera()//设置centerCoordinate属性。mapCamera.centerCoordinate=CLLocationCoordinate2DMake(40.949392,116.848383)//设置pitch属性为45度,一般设置45度比较理想mapCamera.pitch=45//设置altitude属性,值为500mapCamera.altitude=500//设置heading属性为45mapCamera.heading=45//设置地图视图的camera属性self.mapView.camera=mapCamera}
}

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;[self placeCamera];
}
-(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;}[self placeCamera];
}
//设置3D摄像机
-(void)placeCamera{MKMapCamera* mapCamera=[MKMapCamera camera];mapCamera.centerCoordinate=CLLocationCoordinate2DMake(40.949493,117.843838);mapCamera.pitch=45;mapCamera.altitude=500;mapCamera.heading=45;//设置地图视图camera属性self.mapView.camera=mapCamera;
}
@end
3、添加标注

例:
Swift代码

// An highlighted block
//ViewController.swift文件
override func viewDidLoad(){super.viewDidLoad()self.mapView.mapType=.standardself.mapView.delegate=self
}
//MARK:-- 实现MKMapViewDelegate协议
//给地图视图添加标注
func mapView(_mapView:MKMapView,viewFor annotation:MKAnnotation)->MKAnnotationView?{//获得地图标注对象MKPinAnnotationView,var annotationView=self.mapView.dequeueReusableAnnotationViewWithIdentifier("PIN_ANNOTATION") as? MKPinAnnotationViewif annotationView=nil{annotationView=MKPinAnnotationView(annotation:annotation,reuseIdentifier:"PIN_ANNOTATION")}//设置大头针标注视图的颜色annotationView!.pinTintColor=UIColor.red//是否已动画效果的形式显式在地图上annotationView!.animatesDrop=true//用于显式一些附加信息。canShowCallout为true,点击大头针时会出现一个气泡,气泡中文字信息封装在MyAnnotation对象中。annotationView!.canShowCallout=truereturn annotationView!
}
func mapViewDidFailLoadingMap(_ mapView:MKMapView,withError error:NSError){print("error:\(error.localizedDescription)")
}@IBAction func geocodeQuery(_ sender:AnyObject){if(self.txtQueryKey.text=nil){return}let geocoder=CLGeocoder()geocoder.geocodeAddressString(self.txtQueryKey.text!,completionHandler:{(placemarks,error)->Void inprint("查询记录数:",placemarks!.count)//移除地图上所有的标注点。self.mapView.removeAnnotations(self.mapView.annotations)for placemark in placemarks!{//实例化MyAnnotation对象,其实我们自定义的实现MKAnnotation协议的地图标注点类let annotation=MyAnnotation(coordinate:placemark.location!.coordinate)annotation.city=placemark.localityannotation.state=placemark.administrativaAreaannotation.streetAddress=placemark.thoroughfareannotation.zip=placemark.postalCode//把标注点对象添加到地图视图上。地图视图委托方法mapView:viewForAnnotation:就会被调用。self.mapView.addAnnotation(annotation)}if placemarks!.count>0{//取出最后一个地标点let lastPlacemark=placemarks!.last//调整地图位置和缩放比例let viewRegion=MKCoordinateRegionMakeWithDistance(lastPlacemark!.location!.coordinate,10000,10000)//将地表点设置为地图中心点。self.mapView.setRegion(viewRegion,animated:true)}//关闭键盘self.txtQueryKey.resignFirstResponder()})
}
//MyAnnotation.swift文件
//地图上的标注点必须实现MKAnnotation协议。需要重写title(标注点上的主标题)和subtitle(标注点的副标题)
import MapKit
class MyAnnotation:NSObject,MKAnnotation{//接到信息属性var streetAddress:String!//城市信息属性var city:String!//省市信息var state:String!//邮编var zip:String!//地理坐标var coordinate:CLLocationCoordinate2Dinit(coordinate:CLLocationCoordinate2D){self.coordinate=coordinate}var title:String?{return"你的位置!"}var subtitle:String>{let res=NSMutableString()if(self.state!=nil){res.appendFormat("%@",self.state)}if(self.city!=nil){res.appendFormat("%@",self.city)}if(self.zip!=nil){res.appendFormat("%@",self.zip)}if(self.streetAddress!=nil){res.appendFormat("%@",self.streetAddress)}return res as String}
}

Objective代码

// An highlighted block
//ViewController.m文件
-(void)viewDidLoad{[super viewDidLoad];self.mapView.mapType=MKMapTypeStantard;self.mapView.delegate=self;
}
#pragma mark --实现MKMapViewDelegate协议
-(MKAnnotationView *)mapView:(MKMapView*)theMapView viewForAnnotation:(id<MKAnnotation>)annotation{MKPinAnnotationView *annotationView=(MKPinAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:@"PIN_ANNOTATION"];if(annotationView=nil){annotationView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"PIN_ANNOTATION"];}annotationView.pinTintColor=[UIColor redColor];annotationView.animatesDrop=TRUE;annotationView.canShowCallout=TRUE;return annotationView;
}
-(void)mapViewDidFailLoadingMap:(MKMapView *)theMapView withError:(NSError*)error{NSLog(@"error:%@",[error localizedDescription]);
}
-(IBAction)geocodeQuery:(id)sender{if(self.txtQueryKey.text=nil || [self.txtQueryKey.text length]==0){return;}CLGeocoder *geocoder=[[CLGeocoder alloc] init];[geocoder geocodeAddressString:txtQueryKey.text completionHandler:^(NSArray *placemarks,NSError *error){NSLog(@"查询记录数:%lu",[placemarks count]);[self.mapView removeAnnotations:self.mapView.annotations];for(CLPlacemark *placemark in placemarks){MyAnnotation *annotation=[[MyAnnotation alloc] initWithCoordinate:placemark.location.coordinate];annotation.city=placemark.locality;annotation.state=placemark.administrativeArea;annotation.zip=placemark.postalCode;[self.mapView addAnnotation:Lannotation];}if([placemarks count]>0){//取出最后一个地标点CLPlacemark *lastPlacemark=placemarks.lastObject;//调整地图位置和缩放比例MKCoordinateRegion viewRegion=MKCoordinateRegionMakeWithDistance(lastPlacemark.location.coordinate,10000,10000);[self.mapView setRegion:viewRegion animated:TRUE];}//关闭键盘[self.txtQueryKey resignFirstResponder];}];
}//MyAnnotation.h文件
//地图上的标注点必须实现MKAnnotation协议。需要重写title(标注点上的主标题)和subtitle(标注点的副标题)
#import <MapKit/MapKit.h>
@interface MyAnnotation:NSObject <MKAnnotation>
-(instancetype)initWithCoordinate:(CLLocationCoordinate2D)coordinate;
//街道信息属性
@property(nonatomic,copy)NSString *streetAddress;
//城市信息属性
@property(nonatomic,copy)NSString *city;
//省市信息
@property(nonatomic,copy)NSString *state;
//邮编
@property(nonatomic,copy)NSString *zip;
//地理坐标
@property(nonatomic,readwrite)CLLocationCoordinate2D coordinate;
@end
//MyAnnotation.m文件
#import <MyAnnotation.h>
@implementation MyAnnotation
-(instancetype)initWithCoordinate:(CLLocationCoordinate2D) coordinate{self=[super init];if(self){self.coordinate=coordinate;}return self;
}
-(NSString *)title{return @"你的位置!";
}
-(NSString *)subtitle{NSMutableString *res=[[NSMutableString alloc] init];if(self.state!=nil){[res appendFormat:@"%@",self.state];}if(self.city!=nil){[res appendFormat:@"%@",self.city];}if(self.zip!=nil){[res appendFormat:@"%@",self.zip];}if(self.streetAddress!=nil){[res appendFormat:"%@",self.streetAddress];}return res;
}
@end
4、跟踪用户位置变化

MapKit提供了跟踪用户位置和方向变化的API,并不用我们编写定位服务代码。MKMapView的属性showsUserLocation可以开启在地图视图上显式用户位置功能;MKMapView的setUserTrackingMode:animated:方法可以设置用户跟踪模式,其中第二个参数是MKUserTrackingMode美剧类型,美剧类型MKUserTrackingMode中定义的成员如下:
Swift枚举成员
(1)none,没有用户跟踪模式。
(2)follow,跟踪用户的位置变化。
(3)followWithHeading,跟踪用户的位置和前进方向变化。
ObjectiveC枚举成员
(1)MKUserTrackingModeNone,没有用户跟踪模式。
(2)MKUserTrackingModeFollow,跟踪用户的位置变化。
(3)MKUserTrackingModeFollowWithHeading,跟踪用户的位置和前进方向变化。

Swift代码

// An highlighted block
//ViewController.swift文件
import UIKit
import MapKit
import CoreLocation
class ViewController:UIViewController,MKMapViewDelegate{@IBOutlet locationManager:CLLocationManager!
override func viewWillAppear(_ animated:Bool){super.viewWillAppear()//授权self.locationManager=CLLocationManager()self.locationManager.requestWhenInUseAuthorization()self.locationManager.requestAlwaysAuthorization()//设置在地图上显式用户位置self.mapView.showsUserLocation=trueself.mapView.userLocation.title="我在这里!"self.mapView.delegate=self
}
//MARKL--实现MKMapViewDelegate协议
//加载成功时回调
func mapViewDidFinishLoadingMap(_ mapVeiw:MKMapView){//设置用户跟踪模式,用户跟踪模式是通过设置Mapview实例方法setUserTrackingMode:animated:实现的mapView.userTrackingMode=.followithHeading
}
}

ObjectiveC代码

// An highlighted block
//ViewController.m文件
#import "ViewController.h"
#import "MapKit/MapKit.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController()<MKMapViewDelegate>
@property(weak,nonatomic)IBOutlet MKMapView *mapView;
@property(nonatomic,strong)CLLocationManager*locationManager;
@end
@implementation ViewController
//授权
self.locationManager=[[CLLocationManager alloc] init];
[self.locationManager requestWhenInUseAuthorization];
[self.locationManager requestAlwaysAuthorization];
self.mapView.showsUserLocation=TRUE;
self.mapView.userLocation.title=@"我在这里!"
self.mapView.delegate=self;
#pragma mark --实现MKMapViewDelegate协议
-(void)mapViewDidFinishLoadingMap:(MKMapVeiw*)mapView{mapView.userTrackingMode=MKUserTrackingModeFollowWithHeading;
}
@end
5、使用程序外地图

使用iPhone自带的地图应用
例:
Swift代码

// An highlighted block
//ViewController.swift文件
@IBAction func geocodeQuery(sender:AnyObject){if self.txtQueryKey.text==nil{return}//实例化查询请求对象MKLocalSearchRequest。let request=MKLocalSearchRequest()//设置请求对象的naturalLanguageQuery属性(该属性是查询的关键字)request.naturalLanguageQuery=self.txtQueryKey.text//实例化查询对象MKLocalSearchlet search=MKLocalSearch(request:request)//查询对象的startWithCompletionHandler:方法执行查询,该方法的参数是一个代码款,用来执行查询之后的回调。response:查询应答对象,error:错误对象search.start(completionHandler:{(response,error) inif response?.mapItems.count>0{//response.mapItems属性返回一个查询结果MKMapItem的集合//取出最后一个地标点let lastMapItem=response?.mapItems.last//调用iOS自带的苹果地图应用,参数是字典类型,这个参数可以控制显示地图的初始化信息,包含一些键。/*MKLaunchOptionsDirectionsModeKey,设定路线模式,他有两个值MKLaunchOptionsDirectionsModeDriving(驾车路线)和MKLaunchOptionsDirectionsModeWalking(步行路线)MKLaunchOptionsMapTypeKey,设定地图模型MKLaunchOptionsMapCenterKey,设定地图中心点。MKLaunchOptionsMapSpanKey,设置地图跨度MKLaunchOptionsShowsTrafficKey,设置显示交通状况。*/let options=[MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving]lastMapItem!.openInMapsWithLaunchOptions(launchoptions:options)}})//关闭键盘self.txtQueryKey.resignFirstResponder()
}

ObjectiveC代码

// An highlighted block
//ViewController.m文件
-(IBAction)geocodeQuery:(id)sender{if(self.txtQueryKey.text=nil){return;}MKLocalSearchRequest *request=[[MKLocalSearchRequest alloc] init];request.naturalLanguageQuery=self.txtQueryKey.text;MKLocalSearch *search=[[MKLocalSearch alloc] initWithRequest:request];[search starWithCompletionHandler:^(MKLocalSearchResponse *response,NSError *error){if([response.mapItems count]>0){//取出最后一个地标点MKMapItem *lastMapItem=response.mapItems.lastObject;NSDictionary* options=@[MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving];[lastMapItem openInMapsWithLaunchOptions:nil];}}];//关闭键盘[self.txtQueryKey resignFirstResponder];
}

参考资料
《IOS开发指南 从HELLO WORLD到APP STORE上架 第5版》

iOS 应用苹果地图相关推荐

  1. iOS 6苹果地图应用(MapKit)-打开外部应用(导航)

    转载自:http://blog.csdn.net/shiyiyufen/article/details/8954038 也可参考这篇文章: http://www.verydemo.com/demo_c ...

  2. IOS 调用苹果地图

    //当前的位置MKMapItem *currentLocation = [MKMapItem mapItemForCurrentLocation];//目的地的位置MKMapItem *toLocat ...

  3. 苹果地图副总裁_苹果地图表现糟糕 iOS副总裁福斯特难辞其咎

    苹果iOS高级副总裁福斯特演示苹果地图(腾讯科技配图) 腾讯科技讯(张和)北京时间9月30日消息,<财富>杂志网络版近日撰文称,作为苹果地图应用和Siri语音助手软件的负责人,苹果iOS副 ...

  4. iOS之苹果和百度地图的使用

    iOS 中使用较多的3款地图,google地图.百度地图.苹果自带地图(高德).其中苹果自带地图在中国使用的是高德的数据.苹果在iOS 6之后放弃了使用谷歌地图,而改用自家的地图.在国内使用的较多的就 ...

  5. iOS 应用内跳转到百度地图、苹果地图、谷歌地图、高德地图等

    最近在做导航,所以把自己找到的资料总结一下! 无论是百度地图.高德地图.谷歌地图还是腾讯地图它们都有自己的SDK,我们只需要在自己的工程中导入SDK并查看相应的官方文档,基本上就可以实现导航.但是这样 ...

  6. 懒癌患者有福了!iOS用户可以在苹果地图和Siri里直接打滴滴

    6月14日凌晨,备受关注的WWDC大会在美国旧金山举行,苹果官方在大会上透露,新版iOS 10将为懒癌患者们提供便利,支持用户在苹果地图里直接用滴滴叫车,在不唤起手机的情况下,也可以直接用Siri打滴 ...

  7. iOS 11为苹果地图带来了哪些改进?

    在地图 App 上,苹果公司一直都在追击着谷歌,而 iOS 11 也为苹果地图带来了许多改进,不如现在就让我们一起来汇总看看,截止到目前为止,iOS 11 到底为苹果地图带来了哪些不错的改进. Fly ...

  8. IOS 地图导航(其中包括苹果地图、百度地图、高德地图、谷歌地图)

    前言:地图导航功能如果是导入第三方包来进行开发会增加App的大小,而通过openUrl来直接打开对应App软件显然是一个性价比较高的做法,因为IPhone手机本身就带有地图功能,所有我们并不用担心会出 ...

  9. ios html调起高德地图,iOS 调用百度地图, 高德地图,苹果自带的地图

    在你项目的info.plist添加 LSApplicationQueriesSchemes 为KEY 类型为NSArray;添加对应的白名单 高德:iosamap百度:baidumap - (void ...

最新文章

  1. 关于sql中case when的用法
  2. 相声演员侯耀文突发疾病去世享年59岁 深切怀念
  3. 全球与中国太赫兹安检仪市场竞争状况及未来发展趋向分析报告2022-2028年版
  4. python dir()
  5. opencv 编译安装时出现报错 modules/videoio/src/cap_ffmpeg_impl.hpp:585:34: error: ‘AVStream {aka struct AVStre
  6. C++设计模式之Proxy模式(代理模式)
  7. python自学要多久-python从入门到精通需要多久?你需要先明白这两个点
  8. 使用nginx的ngx_upstream_jdomain模块实现k8s容器的负载均衡
  9. 车载通信——CAN通信诊断协议
  10. 电子签章安全用印方案:系统“三员分立”+印章“三权分立”
  11. python设置excel边框_用Python操作Excel电子表格?单元格边框如何设置?样式有哪些?...
  12. 【B2B】阿里巴巴汪海:1688成年礼—从中小企业数字化看B2B发展趋势
  13. 螺旋无限延伸_无限螺旋篇 其之八(一)
  14. Elasticsearch系列——(1.1)倒排索引原理
  15. android studio在夜神上打开_Android Studio之使用连接夜神模拟器分析Smail 【详文】8.7日更正...
  16. 烤仔建工承建,著名画家孙天骄的元宇宙美术馆即将开门迎客
  17. 创建pdf java 字体_如何使用自定义字体从servlet使用iText XMLWorker创建PDF?
  18. ftp打开方式更改为资源管理器方法
  19. 5脚耳机插座原理图_【连载十九】手机维修电路基础原理图
  20. MySQL——O4. 表结构设计和数据类型优化

热门文章

  1. 常用计算机铭牌,开关铭牌常用的符号表示是什么意思?
  2. 搜索 ElasticSearch 快速检索的原理(深度好文)
  3. 延迟审核终极解决办法,就没有搞不定的苹果审核!2周成功上架AppStore!附教程!
  4. python center函数_利用Python函数实现一个万历表完整示例
  5. 1927:【04NOIP普及组】花生采摘
  6. SSM 开发酒店管理系统项目
  7. 《转自知乎》那些年入上百万的人是如何做到的?他们的平均年龄是多少?白手起家的到底多不多?
  8. H264 NAL_AUD
  9. 计算机视觉竞赛技巧总结(一):目标检测篇
  10. OSM地图本地发布(二)-----数据准备