室内地图


1. 使用说明

室内图功能为付费功能,已申请APIKey的开发者请确认是否已有室内图权限,如没有,开发者则需将开发者账户升级为企业级,开通成功后联系腾讯位置服务进行服务开通。 把已申请室内图权限的key在AppDelegate.m文件里填入:

// Configure API Key.
[QMapServices sharedServices].APIKey = @"有室内图权限的key";

2. 室内图功能开关

功能 实现接口
开启/关闭室内图 (默认为NO) - (void)setIndoorEnabled:(BOOL)indoorEnabled;
内置楼层选择控件,默认为YES BOOL indoorPicker

当开启室内图功能后,对应建筑的室内图会在一定缩放级别开始显示(显示的缩放级别与室内图的大小有关)。如下图,为北京欧美汇的室内图:

// 显示室内图
[self.mapView setIndoorEnabled:YES];
// 显示室内图楼层控件
[self.mapView setIndoorPicker:YES];

用户也可以设置不显示默认楼层控件

[self.mapView setIndoorPicker:NO];

3. 获取室内建筑物数据

室内建筑数据对应的类是QIndoorBuilding,可通过QMapView的activeBuilding获取(当前无室内图激活时为nil)。类的数据成员如下表:

属性 实现接口
建筑物唯一标识 NSString *guid
默认加载的楼层索引 NSUInteger defaultLevelIndex
本建筑的所有楼层数据 NSArray<QIndoorLevel *> *levels
建筑物名称 NSString *name
建筑物的外接矩形 QMapRect boundingMapRect

获取当前激活建筑物的数据和楼层的接口如下:

// 通过QMapView获取当前激活的室内建筑物和当前楼层

/**
 * @brief  当前处于激活态的整个室内图数据
 */
@property(nonatomic, strong, readonly) QIndoorBuilding *activeBuilding;

/**
 * @brief  当前正在展示的室内楼层.
 */
@property(nonatomic, strong) QIndoorLevel *activeLevel;


//获取当前室内图的建筑及楼层名字
NSLog(@"Current active building is %@", self.mapView.activeBuilding.name);
NSLog(@"Current active level is %@", self.mapView.activeLevel.name);
说明 实现接口
当前处于激活态的整个室内图数据(当前屏幕内有可能有多个室内图,但仅会有一栋处于屏幕中心区域的建筑物处于“激活”态) QIndoorBuilding *activeBuilding

4. 切换室内图的楼层

QIndoorInfo包含室内图标识楼号和楼层

属性 实现接口
室内图唯一标识楼号 NSString *buildUid
室内图楼层 NSString *levelName
初始化室内图数据类 - (instancetype)initWithBuildUid:(NSString *)buildUid levelName:(NSString *)levelName;
改变指定建筑物默认楼层 - (void)setActiveIndoorInfo:(QIndoorInfo *)indoorInfo;

生成所需的QIndoorInfo类,改变对应建筑物默认楼层的实现如下:

QIndoorInfo *indoorInfo = [[QIndoorInfo alloc] initWithBuildUid:@"********" levelName:@"B1"];
// "********"需要更换为对应建筑物的buildUid
// 改变对应建筑物默认楼层
[self.mapView setActiveIndoorInfo:indoorInfo];

如下图显示,欧美汇室内图从F4切换到F2:

5. 室内图变化回调

在室内建筑物激活或切换时,也会收到室内变化或楼层变化的回调:

功能 实现接口
获取更新后的室内建筑信息(切换室内图 后会调用此函数) - (void)mapView:(QMapView *)mapView didChangeActiveBuilding:(QIndoorBuilding *)building;
获取更新后楼层信息 (切换楼层后会调用此函数) - (void)mapView:(QMapView *)mapView didChangeActiveLevel:(QIndoorLevel *)level;

示例如下:

// 切换室内图回调
- (void)mapView:(QMapView *)mapView didChangeActiveBuilding:(QIndoorBuilding *)building {
    NSLog(@"Current active building ID is %@", building.guid);
    NSLog(@"Current active building name is %@", building.name);
}

// 切换楼层回调
- (void)mapView:(QMapView *)mapView didChangeActiveLevel:(QIndoorLevel *)level {
    NSLog(@"Active level is %@", level.name);
}

6. 室内POI点击

点击室内图上文字图标的数据信息 (QIndoorPoiInfo类)

属性 实现接口
所在室内图楼层 NSString *levelName
所在室内图唯一标识 NSString *buildingGUID
所在室内图楼的名称 NSString *buildingName

POI点击回调

功能 实现接口
获取室内POI信息 (点击地图poi图标处会调用此接口,需要把poi转换为QIndoorPoiInfo类) - (void)mapView:(QMapView *)mapView didTapPoi:(QPoiInfo *)poi;

回调示例如下:

// 点击POI回调
- (void)mapView:(QMapView *)mapView didTapPoi:(QPoiInfo *)poi
{
    if ([poi isKindOfClass:[QIndoorPoiInfo class]]) {
        QIndoorPoiInfo *poiInfo = (QIndoorPoiInfo *)poi;
        NSLog(@"POI building ID %@",poiInfo.buildingGUID);
        NSLog(@"POI building Name %@",poiInfo.buildingName);
        NSLog(@"POI building level %@",poiInfo.levelName);
    }
}

7. 带室内属性的地图覆盖物

腾讯地图提供了带室内楼层属性的元素,目前包括 marker、polyline。在增加室内属性以后,该marker或polyline仅在该建筑物的该楼层展示。

以 marker 为例说明设置室内属性的方法和展示效果:

- (void)handleTestAction
{
    // ******需要替换为对应建筑物的BuildUid
    QIndoorInfo *indoorInfo = [[QIndoorInfo alloc] initWithBuildUid:@"******" levelName:@"B1"];
    self.annotation = [[QPointAnnotation alloc] init];
    self.annotation.coordinate = CLLocationCoordinate2DMake(39.865105,116.378345);
    // 设置室内数据到indoor属性,标明它为室内的覆盖物
    self.annotation.indoorInfo = indoorInfo;
    [self.mapView addAnnotation:self.annotation];
}


//marker的render
- (QAnnotationView *)mapView:(QMapView *)mapView viewForAnnotation:(id<QAnnotation>)annotation
{
    if ([annotation isKindOfClass:[QPointAnnotation class]]) {
        static NSString *pointReuseIndetifier = @"pointReuseIndetifier";
        QAnnotationView *render = [[QAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pointReuseIndetifier];
        if (render == nil)
        {
            render = [[QAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pointReuseIndetifier];
        }
        render.canShowCallout   = YES;
        UIImage *img = [UIImage imageNamed:@"marker"];
        render.image = img;
        render.centerOffset = CGPointMake(0, -img.size.height / 2.0);
        return render;
    }
    return nil;
}

如图所示,添加的 marker 只在欧美汇的 B1 层展示,在其他层不展示

8. 自定义楼层控件

开发者可以通过室内图状态的回调信息定制自己的楼层控件,包括UI样式和位置都可以灵活定义。定制前,先隐藏默认的楼层控件:

// 显示室内图
[self.mapView setIndoorEnabled:YES];
// 不显示室内图楼层控件
[self.mapView setIndoorPicker:NO];

然后通过室内图变化回调中获取的信息,来实现建筑物的状态展示,和楼层信息的实时切换

- (void)mapView:(QMapView *)mapView didChangeActiveBuilding:(QIndoorBuilding *)building {    
    // 根据建筑物信息显示楼层控件
  	if (buiding == nil)
    {
      	// myPicker.hidden = YES;
    }
  	else
    {
      	// myPicker.hidden = NO;
    }
}
- (void)mapView:(QMapView *)mapView didChangeActiveLevel:(QIndoorLevel *)level {
    // 根据建筑物信息更新楼层控件
  	int NSUInteger index = [self findIndex:level];  // 查询索引
    if (index < mapView.activeBuilding.levels.count) 
    {
        self.picker.selectIndex = index;
    }
}

- (void)handleSelectLevel:(MyPicker *)picker {
    // 用户点击楼层控件时更换楼层
  	int selectedIndex = picker.selectIndex;  // b1的索引
    if ([mapView.activeBuilding.guid isEqualToString:@"xxxxxxxx"]) {
        mapView.activeLevel = mapView.activeBuilding.levels[selectedIndex];
    }
}

9. 室内地图蒙层

地图SDK在4.3.5版本中新增了室内地图蒙层功能,通过一个简单的接口即可在显示室内地图的同时,将室内地图的周边地图覆盖一层自定义颜色的蒙层。

当开启了室内图功能时,通过下例代码可以为室内图周边设置蒙层:

// 设置显示室内图时的蒙层颜色,alpha=0时不显示,默认不显示
[self.mapView setIndoorMaskColor:[UIColor colorWithRed:0 green:0 blue:1 alpha:0.3]];

效果图如下:


10. 室内地图暗色模式

地图SDK在4.3.8版本中新增了室内图暗色模式,当室内图功能开启时,修改当前地图类型为QMapTypeDark,室内图的样式也会相应转变为暗色模式。

[self.mapView setIndoorEnabled:YES];
[self.mapView setMapType:QMapTypeDark];

这篇文章对您解决问题是否有帮助?

已解决
未解决