ios百度地图标注位置的方法_ios百度地图拖动标注点 - CSDN
精华内容
参与话题
  • 关于iOS百度地图标注

    千次阅读 2019-08-08 16:24:08
    为什么要把这个拿出来单独写呢,因为标注是地图开发中经常用到的...在百度地图的官方文档里面也没有很详细的说明,就把自己的使用心得拿出来记录一下。 首先,要理清楚他们之间的关系。 参考一下百度的类继承关系: ...

    为什么要把这个拿出来单独写呢,因为标注是地图开发中经常用到的东西,而且需求各种各样,提供的默认标注不足以满足需求。在百度地图的官方文档里面也没有很详细的说明,就把自己的使用心得拿出来记录一下。
    首先,要理清楚他们之间的关系。
    参考一下百度的类继承关系:
    http://wiki.lbsyun.baidu.com/cms/iossdk/doc/v2_8_0/html/hierarchy.html
    标注View的继承关系

    标注点的继承关系

    可以看到,BMKPinAnnotationView继承的BMKAnnotationView,然后BMKActionPaopaoView、BMKAnnotationView和BMKMapView都是继承的UIVIew,属于同一级别。

    然后就是标注点,其实就是协议,想要添加标注,就必须实现协议。
    这里写图片描述
    一般的,我们去创建一个BMKPointAnnotation对象,然后给这个对象的coordinate赋值,coordinate是一个CLLocationCoordinate2D对象,就是坐标点。这样就能在地图上确定位置了。同时还有一个title和subtitle ,设置上这两个属性就会有气泡了,但是气泡的显示还需要在View里面设置的,请继续往先看。
    这里引入一段代码:

    /**
     * 初始化一个标注
     * 注意:一定要在设置代理之后去添加,不然不会走代理方法,这样就会显示一个默认标注,没有自定义效果了
     */
    - (void)initAnnotataion{
        
        BMKPointAnnotation *annotation = [[BMKPointAnnotation alloc]init];
        
        annotation.coordinate = CLLocationCoordinate2DMake(39.915, 116.404);
        annotation.title = @"我在这里ARFAA~~~";
        annotation.subtitle = @"SS";
        
        //在地图上添加Annotation后才会有标注
        [self.mapView addAnnotation:annotation]; 
    }
    

    这里可以进行自定义,自定义的只要继承了BMKPointAnnotation就行,然后自己添加一些属性方法之类的,这里就不细说了。

    添加完标注,接下来就要走代理方法了。 先看代码

    - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation
    {
    	//这是错误的,放在这里警示一下
        if ([annotation isKindOfClass:[BMKUserLocation class]]) {
            BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"];
            newAnnotationView.pinColor = BMKPinAnnotationColorPurple;
            newAnnotationView.animatesDrop = YES;// 设置该标注点动画显示
            return newAnnotationView;
        }
        
        //这是正确的写法
        if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {
            //设置复用
            CustomAnnotationView *pointAnnotation = (CustomAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"identifier"];
            if (!pointAnnotation)
            {
                pointAnnotation = [[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"identifier"];
            }
            //动画效果
            //pointAnnotation.animatesDrop = YES;
            //可以拖动
            pointAnnotation.draggable = YES;
            //设置title,选中弹出气泡
            pointAnnotation.canShowCallout = YES;
            //设置自定义标注图标
            pointAnnotation.image = [UIImage imageNamed:@"icon_passenger"];
            
            return pointAnnotation;
        }
        
        return nil;
    }
    

    在if里面判断一下是否有此标注,如果有,然后进行下一步。还有一点,如果使用了自定义的标注,最好是判断自定义的类,而不是判断BMKPointAnnotation。因为在之后的话,要使用到这个对象需要强转,父类强转子类对象如果不一致,会崩溃的。
    定位其实也是一种标注,在其他地图里是可以这么写的,因为UserLocation会去实现< BMKAnnotation>这个协议,但是百度的没有,猜测可能是在.m中去实现了协议方法。关于如何自定义定位标注,后面再说。
    之后我们进行创建View。这个地方我创建了一个自定义的view。自定义的只需要去继承一下BMKPinAnnotationView或者BMKAnnotationView就可以了。之前说过了BMKPinAnnotationView是BMKAnnotationView的子类,继承BMKPinAnnotationView会有默认大头针而已。
    我这里自定义的只是为了设置一个自定义泡泡。

    - (instancetype)initWithAnnotation:(id<BMKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
    {
        self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
        if (self) {
            self.paopaoView = [[BMKActionPaopaoView alloc]initWithCustomView:self.calloutView];
        }
        return self;
    }
    
    - (CustomCalloutView *)calloutView
    {
        if (!_calloutView) {
            _calloutView = [[CustomCalloutView alloc] initWithFrame:CGRectMake(0, 0, kCalloutWidth, kCalloutHeight)];
        }
        
        return _calloutView;
    }
    
    -(void)setAnnotation:(id<BMKAnnotation>)annotation
    {
        [super setAnnotation:annotation];
        
        self.paopaoView = [[BMKActionPaopaoView alloc]initWithCustomView:self.calloutView];
    }
    
    

    这里就是给self.paopaoView赋值而已,没什么特别的。至于CustomCalloutView里面怎么写的,就不详细说明了,其实就是一个View。

    这样就完成了自定义标注及气泡。

    最后再说一下定位标注。

    关于更改定位的样式,百度提供的方式是用mapView设置Param。方法为:
    -(void)updateLocationViewWithParam:(BMKLocationViewDisplayParam*)locationViewDisplayParam;
    首先创建一个BMKLocationViewDisplayParam对象,设置它的属性。

    BMKLocationViewDisplayParam *param = [[BMKLocationViewDisplayParam alloc]init];
        param.locationViewImgName = @"icon_nav_waypoint";
        [_mapView updateLocationViewWithParam:param];
    

    但是要注意,这里的图片一定要在mapapi.bundle资源文件库里,不然无效。

    还有一种办法,定位是可以获取到坐标的,完全可以不用系统给出的定位显示,根据定位的坐标自己创建标注,这样就可以更加灵活的去实现显示。

    展开全文
  • iOS 百度地图显示指定的位置

    千次阅读 2018-11-29 16:50:44
    今天做到一个需求是传入 经纬度,mapView 显示 对应的点并标上标注,一开始一直在找 mapView updateUserLocation 类似的方法去传入经纬度,未果。晚上回来了想想,不就是标注大头针,然后把它作为地图的中心点显示在...

    今天做到一个需求是传入 经纬度,mapView 显示 对应的点并标上标注,一开始一直在找 mapView updateUserLocation 类似的方法去传入经纬度,未果。晚上回来了想想,不就是标注大头针,然后把它作为地图的中心点显示在地图上。用setCenterCoordinate:方法就可以了(高德地图setCenterCoordinate:)。哎,这么简单的问题还花费那么长时间~可能是明天就过节了,有点小机动


    update time: 2016/11/25

    需求是在cell中显示 指定位置的地图位置,但地图view不做任何响应时间,点击cell,跳转到地图界面。

    效果类似下图:
    这里写图片描述

    此时有两种方案:

    第一:显示百度地图mapView

    通过百度地图的view添加大头针,

    /     添加一个PointAnnotation
    BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];
    CLLocationCoordinate2D coor;
    coor.latitude = [self.latitudeTF.text floatValue];
    coor.longitude = [self.longitudeTF.text floatValue];
    annotation.coordinate = coor;
    //    annotation.title = @"这里是北京";
    [self.mapView addAnnotation:annotation];
    

    将大头针放在地图中心点,

    [self.mapView setCenterCoordinate:coor animated:YES];
    

    取消mapView的任何响应事件
    self.mapView.gesturesEnabled = NO;


    第二 :显示一个imageView,通过请求百度地图静态图片的接口,拿到 图片data。

    接口:http://api.map.baidu.com/staticimage

    请求类型:GET

    传入参数:

    center: 地图中心点位置,参数可以为经纬度坐标或名称。坐标格式:lng<经度>,lat<纬度>,例如116.43213,38.76623。
    zoom: 高清图范围[3, 18];低清图范围[3,19]
    markers: 标注,可通过经纬度或地址/地名描述;多个标注之间用竖线分隔。
    更多参数请访问百度静态图片静态图API

    将拿回来的responseObject 直接附给imageView的image即可:

    imageView.image = [UIImage imageWithData:responseObject];
    

    总结:这两种方法对比很明显,第一种使用百度SDK Momery占用 大并且代码写起来设置内容多,但是可以无限制次使用/天;第二种方便简洁,而且Momery占用小,代码设置少,但是有限制每天的请求次数:

    请求频率:无限制
    URL长度:2048
    点标记的数量:50个
    调用次数:默认限制为100万次/天,并发100qps
    

    大家根据需求来使用吧。

    展开全文
  • 如果有多个大头针,用下面的方法只能是最后一个自动显示标注(就是那个泡泡),有什么办法能让所有的打头针都显示标注? [_mapView selectAnnotation:pointAnnota animated:NO]; [annotationView setSelected:YES ...
  • 解决 iOS百度地图 API 大头针、区域划分、中心点定位等使用问题。

    在项目中遇到这样一个需求,在点击区域选择按钮的时候会显示当前的 区域范围(BMKPolylineView) 以及 行政区域中心(大头针),并且大头针要显示出气泡展示当前区域车辆信息。如图:



    细心的朋友可能发现,地图的中心应该是该区域的地理中心,而非我们获取到的行政中心。但是问题在于我们在弹出行政中心(绿色大头针)的泡泡时,是调用了:

    // 选定大头针,弹出车辆数目
    [self.mapView selectAnnotation:_scopePoint animated:NO];

    而这句话的作用有二:① 显示泡泡(使大头针变为选中状态) ② 点击该大头针(使大头针变为点击状态)

    但是大头针一旦成为了点击状态,那么就默认使该点击的大头针作为当前地图的中心点,显然这不是我们想要的。

    为了让大头针选中弹出泡泡,并且不会让地图的中心点移动到该大头针的位置,我们做如下处理:

    在大头针 BMKAnnotationView 初始化的代理方法中将该大头针的 view 的触摸事件取消。

    /**
     *根据anntation生成对应的View
     *@param mapView 地图View
     *@param annotation 指定的标注
     *@return 生成的标注View
     */
    - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation;

    annotationView.enabled = NO;

    因为大头针的触摸事件和大头针是否显示弹窗是两个事件,所以彼此互不影响。


    又出现了一个新的情况,那就是在不断切换区域的时候,会重新定位到行政区域中心的位置,然后再跳转到地理区域中心的位置。这样一来,界面会卡顿,定位两次的效果也不是很美观。我们仍旧可以在上面的代理方法中去如下设置:

    让该大头针的选中状态设置为YES,可完美解决。

    annotationView.selected = YES;


    最后一个问题,当我们先点击特殊区域中心点(蓝色大头针及泡泡)然后再点击区域选择按钮(绿色大头针及泡泡),这时绿色不会显示,需要将前一个大头针取消显示,再点击才有效,或者点击区域选择按钮两次,这也是无法接受的。如下图:



    前一秒点击的 “海上世界” 的泡泡并没有消失,而且跟随界面移动,后一秒的行政区域中心泡泡同时显示。要解决这个bug,我们要在每次点击区域按钮时遍历界面上的大头针,并设置取消选中状态。(而非移除)

     // 取消所有标注的选中状态
        for (id <BMKAnnotation> annotation in _mapView.annotations) {
            [_mapView deselectAnnotation:annotation animated:NO];
        }

    这样,进而解决了中心位置问题、界面反复移动问题、前一个大头针泡泡仍继续展示问题。

    总结来说,百度地图的iOS API确实写的不如安卓端完善,这些很简单的功能在安卓均提供有接口解决方案,但iOS端解决起来就费事了很多,用了一些看似不相关的属性参数。希望遇到类似问题的盆友可以得到帮助,一些百度地图API的其他使用问题也可以在评论下面交流,看到留言会一一回复。


    展开全文
  • 百度地图SDK for iOS v2.0.0全新发布

    千次阅读 2013-06-03 13:53:18
    百度地图SDK for iOS v2.0.0全新发布,全新矢量版地图,全新视觉体验!  百度地图 iOS SDK是一套基于iOS4.3及以上(iOS SDKv1.2.3及以前版本支持iOS3.0及以上)版本设备的应用程序接口,不仅提供展示地图的基本接口...

            百度地图SDK for iOS v2.0.0全新发布,全新矢量版地图,全新视觉体验!

            百度地图 iOS SDK是一套基于iOS4.3及以上(iOS SDKv1.2.3及以前版本支持iOS3.0及以上)版本设备的应用程序接口,不仅提供展示地图的基本接口,还提供本地搜索、路线规划、定位等服务。


             您可以使用百度地图iOS SDK开发适用于移动设备的地图应用,通过接口,您可以轻松访问百度服务和数据,构建功能丰富、交互性强的地图应用程序。百度iOS SDK目前支持iphone4.3以上的版本(iOS SDKv1.2.3支持iphone3.0以上的版本),对iPad暂不支持。


             该套SDK提供的服务是免费的,任何非营利性程序均可使用,您需要先申请密钥(key),才可使用该套SDK接口。在您使用百度地图iOS SDK之前,请先阅读百度地图API使用条款。

    功能介绍

    地图展示:包括2D图、卫星图、3D图地图展示。

    地图操作:提供平移、缩放、双指手势操作、底图旋转等地图相关操作。

    自定义绘制:提供自定义绘折线、多边形、圆的功能。

    地图搜索:提供根据关键字进行范围检索、城市检索和周边检索。

    线路规划:提供公交、驾车和步行三种类型,多种方案(不含地铁、时间优先、最少换乘、最少步行)的线路规划。

    地理编码:提供地址信息与坐标之间的相互转换。

    位置标注:提供一个或多个POI位置标注,且支持用户自定义图标。

    实时路况:支持城际(城市之间,如高速)和全国多个城市的实时路况。

    离线地图:提供离线地图下载的功能,可节省用户流量。

    定位:与iOS系统定位完美结合,便捷展示当前位置信息。


     更多详细信息请登录我们的官方网站:http://developer.baidu.com/map/sdk-ios.htm


    展开全文
  • 2:在- (void)viewWillAppear:(BOOL)animated方法中设置代理到self, 记得到这个方法内 在其他方法中如viewDidLoad中有时会出现莫名其妙的诡异问题, 可看link 百度地图_回调不走_onGetGeoCodeResu
  • 百度地图SDK for iOS v2.0.1全新发布

    千次阅读 2013-06-29 19:26:26
    百度地图SDK for iOS v2.0.1全新发布! 百度地图 iOS SDK是一套基于iOS4.3及以上(iOS SDKv1.2.3及以前版本支持iOS3.0及以上)版本设备的应用程序接口,不仅提供展示地图的基本接口,还提供本地搜索、路线规划、...
  • app定位、地图、坐标系的那些坑

    万次阅读 2016-10-19 12:01:54
    开发App时会遇到各种坑,本文分享我们在iOS/Android...定位即获取用户当前经纬度,iOS平台都是通过系统SDK接口获取的,因此所有App获取定位及精度的能力是相同的,即使Google Maps、百度地图、高德地图这种专
  • 思路是 首先获取到这些标注 , 然后使用删除方法进行删除  NSArray *annArray = [[NSArray alloc]initWithArray:_mapView.annotations];   NSLog(@"__-------annarray = %@",annArray); annotations 是...
  • 百度地图API:百度地图API
  • iOS 百度地图定位并标注当前位置

    千次阅读 2020-02-24 08:52:38
    第一步:获取安全码...pod 'BaiduMapKit' #百度地图SDK 第三步:需要引入的头文件 #import <BaiduMapAPI_Base/BMKBaseComponent.h>//引入base相关所有的头文件 #import <BaiduMapAPI_Location/BMKLo...
  • 如果有多个大头针,用下面的方法只能是最后一个自动显示标注(就是那个泡泡),有什么办法能让所有的打头针都显示标注? [_mapView selectAnnotation:pointAnnota animated:NO]; [annotationView setSelected:YES ...
  • iOS——百度地图点击标注事件

    千次阅读 2016-10-26 14:32:57
    在用百度地图点击标注的时候,发现... /**  *当选中一个annotation views时,调用此接口  *@param mapView 地图View  *@param views 选中的annotation views  */ - (void)mapView:(BMKMapView *)mapView didSelect
  • 废话不多说 直接上项目工程 ,还是 先看下效果图吧!    项目中有两个文件,chonViewController 和mapLocation文件 ,...新建工程后 记得加入类库,MapKit.framework 具体添加方法 这里不在说明了 下面 看
  • 女朋友的一个项目里需要用到百度地图标注功能,也就是大头针戳点,需要响应用户点击事件,但是代码看起来完全没问题,可是didSelectAnnotationView方法死活调用不到,然后我自己做的一个App里,也遇到了相同的问题...
  • 之前研究了定位,想用百度地图,但是用百度地图的 JavaScript API里面的浏览器定位根本不行,要用插件,很多人说本身带的这个cordova-plugin-geolocation插件因为网络问题,只有ios可以用,然后找到了专门针对安卓...
  • iOS开发交流群:301058503 1. 使用cocoapods导入 pod ‘BaiduMapKit’(不会使用cocoapods的朋友可以参考http://blog.csdn.net/liumude123/article/details/51405253) 2. 在plist添加...
  • IOS开发之百度地图API(BaiTumapAPI应用)

    千次阅读 2012-03-23 11:25:29
    我想用百度地图API做一个Demo,下面是我的整个流程,希望能够给大家带来些许参考; 首先打开下面网址,仔细阅读移动平台API之 IOS开发 指南 ...
  • IOS高德定位中 ,地图上一直有个小蓝点 ,怎么移除掉 求大神帮助
  • public void changeUI(String result_info) { // 定义Marker坐标点 point[i] = new LatLng(weidu, jingdu); // 构建Marker图标 BitmapDescriptor bitmapDescriptor = Bitma
1 2 3 4 5 ... 20
收藏数 1,766
精华内容 706
关键字:

ios百度地图标注位置的方法