Skip to content

智石室内地图 Android API

简介

智石科技室内地图 Android SDK API,是由 Java 语言编写的应用程序接口,它能够帮助您在移动端中构建功能丰富、交互性强的室内地图应用程序。除了基本地图功能的接口外,室内地图还提供了诸如室内搜索、室内路线规划等数据服务,您可以根据自己的需要进行选择性使用。室内地图开发包为开发者提供了的室内地图显示、路径规划、室内定位等相关GIS功能。本开发包支持的Android版本为19或更高的系统。

准备工作

了解了室内地图基础流程后,接下来进行室内地图开发的准备工作。

  • 您需要成为智石的用户;
  • 获取BuildlingID、Appkey,请在(开放平台>建筑与地图>建筑管理)中查看;

开发指南

AndroidStudio项目配置

创建AndroidStudio项目

在Android Studio中创建一个Android项目。

集成SDK

1. 下载开发包

https://github.com/BrightBeacon/IndoorPositionSDK-Android

2. 添加库到项目

复制SDK内的库文件到{工程}/app/libs 目录里,如下图示:

3. 配置build.gradle

在工程目录下的build.gradle文件中 allprojects 块中的 repositories 标签内配置 flatDir 标签,如果没有则新增,代码如下:

java
allprojects {
	repositories {
		...
		// 添加配置以下标签
		flatDir {
			dirs 'libs'
		}
	}
}

在app目录下的build.gradle文件中android块中配置sourceSets标签和compileOptions标签,如果没有使用标签则新增,详细配置代码如下:

java
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

sourceSets {
    main {
        jniLibs.srcDir(['libs'])
    }
}

在app目录下的build.gradle文件中 dependencies 块中配置库引用

java
// 室内地图运行库
implementation(name: 'MapboxGLAndroidSDK-release-9.1.1', ext: 'aar')
implementation group: 'com.mapbox.mapboxsdk', name: 'mapbox-android-telemetry', version: '5.0.0'
implementation group: 'com.mapbox.mapboxsdk', name: 'mapbox-sdk-geojson', version: '5.0.0'
implementation group: 'com.mapbox.mapboxsdk', name: 'mapbox-android-gestures', version: '0.6.0'
implementation group: 'com.mapbox.mapboxsdk', name: 'mapbox-sdk-turf', version: '5.0.0'
implementation 'com.vividsolutions:jts:1.13'
implementation 'commons-codec:commons-codec:1.10'

// 智石科技室内地图库
implementation(name: 'BRTMapData-release-2.3.1', ext: 'aar')
implementation(name: 'BRTMap3DLibrary-release-2.3.1', ext: 'aar')

// 智石科技室内定位库
implementation(name: 'BRTLocationLibrary-release-2.3.1', ext: 'aar')

配置权限

1. 添加权限声明

在工程AndroidManifest.xml文件中添加权限声明:

java
<!-- 用于在线校验智石地图SDK开发密钥, 获取在线地图数据和在线路径规划数据 -->
<uses-permission android:name="android.permission.INTERNET" />

<!-- 用于室内地图相关数据的保存和加载 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


<!-- 以下权限可选,需要室内定位功能请添加相应声明 -->

<!-- 蓝牙扫描权限,用于扫描蓝牙Beacon定位信标. -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

<!-- 安卓6.0及以后系统需要声明以下权限,才能扫描到蓝牙Beacon信标 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<!-- 如果APP编译targetSdk>=31(即安卓12及以上版本),需声明以下权限 -->
<!-- 蓝牙扫描权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<!-- 蓝牙连接权限,控制蓝牙开关 (该权限可选,方便用户开启蓝牙功能) -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
2. 申请运行时权限

在APP运行期间需要检查并申请相关的权限,请参考以下示例代码检查并申请相关权限:

java
private static final int REQUST_PERMISSION_CODE = 1000;

private void checkPermissions() {
	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
		List<String> permissions = new ArrayList<>();
		// 安卓6及以上版本需要申请的相关权限
		permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
		permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE);
		
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
			// 安卓12及以上版本需要申请的相关权限
			permissions.add(Manifest.permission.BLUETOOTH_CONNECT);
			permissions.add(Manifest.permission.BLUETOOTH_SCAN);
		} else {
			// 安卓11以下版本需要申请的相关权限
			permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
			permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
    	}
		requestPermissions(permissions.toArray(new String[0]), REQUST_PERMISSION_CODE);
	}
}

添加室内地图

1. 新建空白Activity

2. 添加地图容器

BRTMapView是View的一个子类,用于在Android View中放置地图。BRTMapView的使用方法与Android提供的其它View一样。

请在Activity的布局文件中添加以下代码:

java
<com.brtbeacon.map.map3d.BRTMapView
    android:id="@+id/mapView"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</com.brtbeacon.map.map3d.BRTMapView>

3. 初始化地图引擎

在SDK各功能使用之前都需要调用,因此建议在应用创建时调用地图引擎初始化方法:BRTMapEnvironment.initMapEnvironment(this);

以下代码是在Activity onCreate方法中初始化地图引擎:

java
private BRTMapView mapView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 初始化地图引擎
    BRTMapEnvironment.initMapEnvironment(this);
    setContentView(R.layout.activity_main);
    mapView = findViewById(R.id.mapView);
    mapView.addMapListener(mapListener);
    // 检查并申请地图权限
    checkNeedPermission();
}

private BRTMapView.BRTMapViewListener mapListener = new BRTMapView.BRTMapViewListener() {
    @Override
    public void mapViewDidLoad(BRTMapView brtMapView, Error error) {
        if (error != null) {
            return;
        }
        //地图加载成功后,显示第一个楼层
        mapView.setFloor(mapView.getFloorList().get(0));
    }
    
    @Override
    public void onFinishLoadingFloor(BRTMapView brtMapView, BRTFloorInfo brtFloorInfo) {}

    @Override
    public void onClickAtPoint(BRTMapView brtMapView, BRTPoint brtPoint) {}

    @Override
    public void onPoiSelected(BRTMapView brtMapView, List<BRTPoi> list) {}
}

4. 加载室内地图

在检查完地图权限都申请成功后,调用加载显示室内地图:

java
mapView.init("建筑ID", "appkey");

常用API展示

坐标转换

java
// 转换成经纬坐标对象; 
LatLng latLng = new LatLng(point.getLatitude(), point.getLongitude());

//  将当前地图经纬坐标转换屏幕坐标;
PointF screenCoord = mapView.getMap().getProjection().toScreenLocation(latLng);

//  将当前地图经纬坐标转换成墨卡托投影坐标;
ProjectedMeters metersCoord = mapView.getMap().getProjection().getProjectedMetersForLatLng(latLng);

地图展示

1. 设置楼层

java
mapView.setFloor(floorInfo); 设置缩放
mapView.setZoom(level); // level: 0~22

2. 设置旋转

java
mapView.setBearing(bearing); // bearing: 0~360

3. 设置倾斜

java
mapView.setTilt(tilt); // tilt: 0~60

4. 移动相机

java
CameraPosition cameraPosition = new CameraPosition.Builder()
    .target(target)
    .bearing(bearing)
    .tilt(tilt)
    .zoom(zoom)
    .build();
getMap().easeCamera(CameraUpdateFactory.newCameraPosition(cameraPosition), 600, true);

5. 重置相机

java
mapView.resetCamera();

地图事件监听

可以向mapView添加 BRTMapView.BRTMapViewListener 监听接口

1. 地图加载回调

java
    void mapViewDidLoad(BRTMapView mapView, Error error);

2. 楼层切换回调

java
    void onFinishLoadingFloor(BRTMapView mapView, BRTFloorInfo floorInfo);

3. 地图点击回调

java
    void onClickAtPoint(BRTMapView mapView, BRTPoint point);

4. POI选择回调

java
    void onPoiSelected(BRTMapView mapView, Listpoints);

地图标注

1. 点标注

java
@Override public void onClickAtPoint(BRTMapView mapView, BRTPoint point)
{ 
	super.onClickAtPoint(mapView, point); LatLng latLng = new LatLng(point.getLatitude(), point.getLongitude());
	mapView.getMap().addMarker(new MarkerOptions().setPosition(latLng).setTitle("Test"));
}

2. 线标注

java
private List pointList = new LinkedList<>();

@Override
public void onClickAtPoint(BRTMapView mapView, BRTPoint point) {
    super.onClickAtPoint(mapView, point);
    LatLng latLng = new LatLng(point.getLatitude(), point.getLongitude());
    pointList.add(latLng);
    if (pointList.size() < 2 )
        return;

    for (Polyline polyline: mapView.getMap().getPolylines()) {
        mapView.getMap().removePolyline(polyline);
    }
    mapView.getMap().addPolyline(new PolylineOptions().color(0xFFFF0000).addAll(pointList));
}

3. 面标注

java
private List pointList = new LinkedList<>();

@Override
public void onClickAtPoint(BRTMapView mapView, BRTPoint point) {
    super.onClickAtPoint(mapView, point);
    LatLng latLng = new LatLng(point.getLatitude(), point.getLongitude());
    pointList.add(latLng);
    if (pointList.size() < 2 )
        return;

    for (Polygon polygon: mapView.getMap().getPolygons()) 
    {
        mapView.getMap().removePolygon(polygon);
    }
    mapView.getMap().addPolygon(new PolygonOptions().alpha
    (0.999f).fillColor(0xFF0000FF).addAll(pointList));
}

POI查询

对地图数据的查询通过 BRTSearchAdapter 对象的方法实现,BRTSearchAdapter 对象的初始化是在地图加载完成后:

java
private BRTSearchAdapter searchAdapter = null;

@Override
public void mapViewDidLoad(BRTMapView mapView, Error error) {
    super.mapViewDidLoad(mapView, error);
    //  地图加载成功后,初始化搜索引擎;
    searchAdapter = new BRTSearchAdapter(mapView.getBuilding().getBuildingID());
}

1. 模糊检索

java
List<BRTPoiEntity> queryPoi(String name)

2. 根据关键字、楼层模糊检索

java
List<BRTPoiEntity> queryPoi(String name,Integer floor)

3. 按类别查询

java
List<BRTPoiEntity> queryPoiByCategoryID(String cids)

4. 按类别和楼层查询

java
List<BRTPoiEntity> queryPoiByCategoryID(String cids,Integer floor)

5. 按半径和楼层查询

java
List<BRTPoiEntity> queryPoiByRadius(LatLng point, double radius, Integer floor)

路径规划

路径规划功能是由 BRTMapRouteManager 对象负责,在地图加载完成后初始化 BRTMapRouteManager 对象。

java
private BRTMapRouteManager routeManager = null;

@Override
public void mapViewDidLoad(BRTMapView mapView, Error error) {
    super.mapViewDidLoad(mapView, error);
    /**
    *   初始化方法指定在线路径规划;
    *   如果用离线方式请使用
    *   routeManager = new BRTMapRouteManager(mapView.getBuilding(), 
    "请输入你的APPKEY", mapView.getFloorList(), false); 
    **/
    routeManager = new BRTMapRouteManager(mapView.getBuilding(), 
    "请输入你的APPKEY", mapView.getFloorList(), true); 
    routeManager.addRouteManagerListener(routeManagerListener);
}

//  路径规划监听器
private BRTMapRouteManager.BRTRouteManagerListener routeManagerListener = 
new BRTMapRouteManager.BRTRouteManagerListener() 
{

    @Override
    public void didSolveRouteWithResult(BRTMapRouteManager routeManager, 
    BRTRouteResult routeResult) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //  路径规划成功执行完成
                mapView.setRouteResult(routeResult);
            }
        });
    }

    @Override
    public void didFailSolveRouteWithError(BRTMapRouteManager routeManager,
     BRTMapRouteManager.BRTRouteException e)
     {
        //  路径规划出错
    }
};

1. 规划路径

java
BRTPoint startPoint;
BRTPoint endPoint;
routeManager.requestRoute(startPoint, endPoint);

2. 显示导航路径

java
mapView.setRouteResult(routeResult);

3. 配置导航路径显示

java
// 设置路径起点 
mapView.setRouteStart(BRTPoint point);

//  设置路径终点
mapView.setRouteEnd(BRTPoint point);

//设置导航线的起点图标
mapView.setRouteStartSymbol(Bitmap bitmap);

//设置导航线的终点符号
mapView.setRouteEndSymbol(Bitmap bitmap);

//设置跨层导航切换点符号
mapView.setRouteSwitchSymbol(Bitmap bitmap);

室内定位

室内定位功能是由 BRTLocationManager 对象提供相应方法,室内定位功能可单独集成到APP内。

基本使用方法如下:

java
private BRTLocationManager locationManager;

private BRTLocationManager.BRTLocationManagerListener locationManagerListener = new BRTLocationManager.BRTLocationManagerListener() {

    @Override
    public void didRangedBeacons(BRTLocationManager BRTLocationManager, List<BRTBeacon> list) {
        // 扫描到的蓝牙信标列表。
    }

    @Override
    public void didRangedLocationBeacons(BRTLocationManager BRTLocationManager, List<BRTPublicBeacon> list) {
        // 扫描到当前建筑定位蓝牙信标列表。
    }

    @Override
    public void didFailUpdateLocation(BRTLocationManager BRTLocationManager, final Error error) {
        //	定位引擎初始化错误或者定位失败。
    }

    @Override
    public void didUpdateDeviceHeading(BRTLocationManager BRTLocationManager, double v) {
        //	定位方向更新
    }

    @Override
    public void didUpdateImmediateLocation(BRTLocationManager BRTLocationManager, final BRTLocalPoint tyLocalPoint) {
        //	即时位置更新(仅通过蓝牙信标计算后获取的位置数据)
    }

    @Override
    public void didUpdateLocation(BRTLocationManager BRTLocationManager, BRTLocalPoint tyLocalPoint) {
        //	步行位置更新(通过惯性和步行判断,平滑处理后的位置数据)
    }
};

locationManager = new BRTLocationManager(context, buildingId, appkey);
locationManager.addLocationEngineListener(locationManagerListener);
locationManager.startUpdateLocation();

// 当室内定位不再使用时,请调用以下代码停止相关功能。
// locationManager.stopUpdateLocation();

定位点显示

java
// 显示定位点 
mapView.setLocation(localPoint);

// 移除定位点 
mapView.setLocation(null);

合规使用指南

SDK如何处理个人信息请参见隐私政策:隐私政策

您集成和使用我们的SDK时需要遵从个人信息保护基本要求,详情请参见:合规使用指南

关于