IOS简单地图效果<代码演示>


/*

iPhone SDK提供了三个类来管理位置信息:CLLocation CLLocationManager CLLHeading(不常用)。除了使用GPS来获取当前的位置信息外,iPhone也可以基于WiFi基站和无线发射塔来获得位置信息。GPS的精度 最高,可以精确到米级别,但是也最耗电。



------------CLLocation

CLLocation类代表一个位置信息,其中还包括了方向和速度。比如我在长安街188号以5公里/小时的速度往西走。CLLocation具有下面的属性和方法:

 

 */

@property  CLLocationCoordinate2D coordinate; //以经度和纬度表示的位置信息

@property CLLocationDistance altitude;  //海拔

@property CLLocationAccuracy horizontalAccuracy; //水平精度(如:精确到米)

@property CLLocationAccuracy verticalAccuracy; //垂直精度

@property CLLocationDirection course; //方向

@property CLLocationSpeed speed; //速度

-NSDate *timeStamp;

//两个位置之间的距离

-(CLLocationDistance)distanceFromLocation:(CLLocation *)location;



//-------------CLLocationManager

//CLLocationManager类管理和提供位置服务。它的属性和方法有:

@property CLLocation *location; //位置

@property id<CLLocationManagerDelegate> delegate;

@property CLLocationDistance distanceFilter; //距离过滤,比如:500以内

@property CLlocationAccuracy verticalAccuracy; //垂直精度

-(void) startUpdatingLocation; //开始更新位置(比如:你在往某个地方走)

-(void)stopUpdatingLocation; //停止更新位置

-(void)startUpdatingHeading; //开始更新方向(比如:你改往东走)

-(void)stopUpdatingHeading; //停止更新方向

/*

CLLocationManagerDelegate是一个委托类。你的应用程序需要使用这个委托类。当用户改变位置的时候,CLLocationManager回调的方法是:

 */

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation;

//当用户改变方向的时候,所调用的方法是:

-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLLHeading *)newHeading;

//iPhone无法获得当前位置的信息时,所回调的方法是:

-(void)locationManager: (CLLocationManager *)manager didFailLoadWithError:(NSError *)error;


/*

=========================================================================

下面我们来看一个位置类的基本步骤:*/

//一、启动定位服务

CLLocationManager *locManager = [[CLLocationManager alloc] init];

locManager.delegate = self;

[locManager startUpdatingLocation];

//二、获得位置信息

-(void)locationManager:(CLLocationManager *)manager

didUpdateToLocation:(CLLocation *)newLocation fromLocation: (CLLocation *)oldLocation

{

    NSTimeInterval howRecent = [newLocation.timestamp timeIntervalSinceNow];

    if(howRecent < -10) return //离上次更新的时间少于10

        if(newLocation.horizontalAccuracy > 100) return; //精度> 100

    //经度和纬度

    double lat = newLocation.coordinate.latitude;

    double lon = newLocation.coordinate.longitude;

}

//三、获得方向信息(比如往南走)

-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading

{

    //获得方向

    CLLocationDirection heading = newHeading .trueHeading;

}

//四、停止定位

[locManager stopUpdatingLocation];

//你可以设置你想要的精度和距离过滤:

locManager.desiredAccuracy = kLLocationAccuracyBest;

locManager.distanceFilter = 1000;


/*

MapKit框架:

主要提供了四个功能:显示地图、CLLocation和地址之间的转换、支持在地图上做标记(比如标记北京天安门广场)、把一个位置解析成地址(比如我在水立方,想要知道确切的地址信息)。

MKMapView类:主要是完成下述功能:

-------显示地图,比如:显示北京市的地图;

-------提供多种显示方式,比如标准地图格式,卫星地图等;

-------支持地图的放大缩小;

-------支持在地图上做标记,比如标记天安门广场;

-------在地图上显示手机所在的当前位置。

 */

//MKMapView类的属性有:

@property MKCoordinateRegin region; //地图所显示的区域

@property CLLocationCoordinate2D centerCoordinate; //经度和纬度确定的中心位置

@property MKMapView mapType; //地图的显示类型,如:卫星地图

@property NSArray *annotations; //地图上的标记

@property MKUserLocation userLocation; //用户位置

@property id <MKMapViewDelegate>delegate; //委托类



//装载地图时的回调方法有:

-(void)mapViewWillStartLocationMap:(MKMapView *) mapView; //开始装载地图

-(void)mapViewDidFinishLocationMap:(MKMapView  *)mapView; //结束装载地图

-(void)mapVewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error; //装载失败



//当位置发生转变时的回调方法:

-(void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated; //将要更改

-(void)mapView: (MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated; //已经更改


/*

MKPlacemarkMKUserLocationMKReverseGeocoder

在地图上做标记是通过MKPlacemark类来完成的。这个类使用(符合)MKAnnotation协议。MKAnnotation包含了多个属性,如:位置(经纬度,CLLocationCoordinate2D类型)、文字标记信息(NSString类型)等。

MKPlacemark保存了位置(经纬度)和地址(字典类)之间的映射。下面是它的初始化方法:

 */

-(void)initWithCoordinate:(CLLocationCoordinate2D *)coordinate addressDictionary:(NSDictionary *)dictionary;

/*

MKUserLocation 就是指手机的当前位置,它是MKAnnotation的一个特别案例(因为MKAnnotation可以是地图上的任何标记,而 MKUserLocation只是标记了地图上手机所在的当前位置)。这个类包含了多个属性:手机的位置(类型为CLLocation)、位置文字信息 (类型为NSString)等。

MKPlacemark保存了位置(经纬度)和地址之间的映射。那么,有没有工具在这两者之间做转换呢?这就是MKRecerseGeocoder.给定一个位置信息,这个类可以返回相应的地址信息。MKReverseGeocoder的初始化方法为:

 */

-(void)initWithCoodinate:(CLLocationCoordinate2D)coordinate;

//下面是MKReverseGeocoder常用的一些属性和方法:

@property id <MKReverseGeocoderDelegate>delegate; //委托

-(void)start; //开始转换

-(void)cancel; //取消转换



//回调的方法有:

-(void)reverseGeocoder(MKReverseGeocoder *) geocoded didFindPlacemark:(MKPlacemark *)placemark;  //转换成功

-(void)reverseGeocoder : (MKReverseGeocoder *)geocoded didFailWithError:(NSError *)error; //转换失败

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Python中调用苹果地图代码可以使用苹果提供的MapKit库来实现。MapKit库是苹果开发的用于在iOS和macOS平台上显示地图和处理地理位置信息的框架。 以下是一个简单的示例代码演示如何在Python中使用MapKit库调用苹果地图: ```python import objc from PyObjCTools import AppHelper # 导入MapKit框架 objc.loadBundle('MapKit', globals(), bundle_path=objc.pathForFramework('/System/Library/Frameworks/MapKit.framework')) # 创建一个MapView对象 map_view = objc.lookUpClass('MKMapView').alloc().initWithFrame_(((0, 0), (400, 400))) # 设置地图的显示区域 region = objc.lookUpClass('MKCoordinateRegion') coordinate = objc.lookUpClass('CLLocationCoordinate2D') center = coordinate.alloc().init() center.latitude = 37.331789 center.longitude = -122.029620 span = coordinate.alloc().init() span.latitudeDelta = 0.01 span.longitudeDelta = 0.01 map_region = region.regionWithCenter_span_(center, span) map_view.setRegion_animated_(map_region, True) # 将MapView添加到窗口中显示 window = objc.lookUpClass('NSWindow').alloc().initWithContentRect_styleMask_backing_defer_(((0, 0), (400, 400)), 15, 2, False) window.contentView().addSubview_(map_view) window.makeKeyAndOrderFront_(None) # 运行主循环 AppHelper.runEventLoop() ``` 请注意,上述代码是使用PyObjC库来调用Objective-C代码的方式。在运行代码之前,需要确保已经安装了PyObjC库,并且在运行代码时,需要在macOS平台上执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GFanStudio-LeeSir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值