Appearance
智石室内地图 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时需要遵从个人信息保护基本要求,详情请参见:合规使用指南
关于
商务合作、地图绘制咨询 4000-999-023