本文主要讲解如何使用SuperMap iMobile 开发包加载地图
一、工程创建
- 导入iMobile SDK
根据功能分类,导入需要的包至工程libs目录下
二、build.gradle环境配置
- 指定编译架构
ndk{
abiFilters 'armeabi-v7a'
}
- 指定依赖so文件
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
- 指定依赖jar文件
implementation fileTree(include: ['*.jar'], dir: 'libs')
完整代码
plugins {
id 'com.android.application'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.supermap.test"
minSdkVersion 24
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk{
abiFilters 'armeabi-v7a'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
packagingOptions {
exclude 'META-INF/*'
exclude 'META-INFTICE' // will not include NOTICE file
exclude 'META-INF/LICENSE' // will not include LICENSE file
exclude 'META-INF/INDEX.LIST' // will not include INDEX.LIST file
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
}
三、权限配置
在AndroidManifest增加访问权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
当build.gradle文件中"targetSdkVersion"高于22时,还需要配置动态权限
ActivityCompat.requestPermissions(
activity, new String[] {
Manifest.permission.CAMERA,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.CHANGE_WIFI_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.VIBRATE,}, CAMERA_PERMISSION_CODE);
}
四、SuperMap iMobile环境初始化
- 许可配置
iMobile 加载地图是需要许可的,但可以到超图官网申请试用许可,可以有3个月有效期
//设置许可路径,默认许可路径../根目录/SuperMap/License
Environment.setLicensePath(PathConfig.License_PATH);
- 初始化配置
Environment.initialization(this);
五、地图加载
- 在xml布局文件添加控件
<com.supermap.mapping.MapView
android:visibility="visible"
android:id="@+id/mapview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
- 打开地图
void openMap(){
//初始工作空间
mMapView=findViewById(R.id.mapview);
mMapControl=mMapView.getMapControl();
mWorkspace=new Workspace();
mMapControl.getMap().setWorkspace(mWorkspace);
//打开工作空间
WorkspaceConnectionInfo info=new WorkspaceConnectionInfo();
info.setType(WorkspaceType.SMWU);
info.setServer(PathConfig.SampleData_PATH+"City/Changchun.smwu");
boolean openSuccess=mWorkspace.open(info);
if (openSuccess){
//加载地图
String mapName=mWorkspace.getMaps().get(0);
mMapControl.getMap().open(mapName);
mMapControl.getMap().refresh();
}else {
Toast.makeText(this,"fail",Toast.LENGTH_SHORT).show();
}
}
- 打开数据源
void openDatasouce(){
//初始工作空间
mMapView=findViewById(R.id.mapview);
mMapControl=mMapView.getMapControl();
mWorkspace=new Workspace();
mMapControl.getMap().setWorkspace(mWorkspace);
//打开数据源
DatasourceConnectionInfo info=new DatasourceConnectionInfo();
info.setEngineType(EngineType.UDB);
info.setServer(PathConfig.SampleData_PATH+"City/Changchun.udb");
Datasource ds=mWorkspace.getDatasources().open(info);
if (ds!=null){
//加载数据集
mMapControl.getMap().getLayers().add(ds.getDatasets().get(0),false);
mMapControl.getMap().refresh();
}else {
Toast.makeText(this,"fail",Toast.LENGTH_SHORT).show();
}
}
完整代码
public class MapActivity extends AppCompatActivity {
MapView mMapView;
MapControl mMapControl;
Workspace mWorkspace;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestPermission();
Environment.setLicensePath(PathConfig.License_PATH);
Environment.initialization(this);
setContentView(R.layout.activity_map);
openMap();
// openDatasouce();
}
void requestPermission(){
ActivityCompat.requestPermissions(
this, new String[] {
Manifest.permission.CAMERA,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.CHANGE_WIFI_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.VIBRATE,}, 0);
}
void openMap(){
//初始工作空间
mMapView=findViewById(R.id.mapview);
mMapControl=mMapView.getMapControl();
mWorkspace=new Workspace();
mMapControl.getMap().setWorkspace(mWorkspace);
//打开工作空间
WorkspaceConnectionInfo info=new WorkspaceConnectionInfo();
info.setType(WorkspaceType.SMWU);
info.setServer(PathConfig.SampleData_PATH+"City/Changchun.smwu");
boolean openSuccess=mWorkspace.open(info);
if (openSuccess){
//加载地图
String mapName=mWorkspace.getMaps().get(0);
mMapControl.getMap().open(mapName);
mMapControl.getMap().refresh();
}else {
Toast.makeText(this,"fail",Toast.LENGTH_SHORT).show();
}
}
void openDatasouce(){
//初始工作空间
mMapView=findViewById(R.id.mapview);
mMapControl=mMapView.getMapControl();
mWorkspace=new Workspace();
mMapControl.getMap().setWorkspace(mWorkspace);
//打开数据源
DatasourceConnectionInfo info=new DatasourceConnectionInfo();
info.setEngineType(EngineType.UDB);
info.setServer(PathConfig.SampleData_PATH+"City/Changchun.udb");
Datasource ds=mWorkspace.getDatasources().open(info);
if (ds!=null){
//加载数据集
mMapControl.getMap().getLayers().add(ds.getDatasets().get(0),false);
mMapControl.getMap().refresh();
}else {
Toast.makeText(this,"fail",Toast.LENGTH_SHORT).show();
}
}
}
其他问题
so库和jar包版本不匹配
- 检查libs下jar与so版本号是否一致
- 检查build.gradle下设置的是armeabi-v7a或者arm64-v8a,是否与libs下对齐
- 检查minSdkVersion大于等于23,并且gradle大于等于3.6.0。需要在在应用AndroidManifest文件
application标签增加android:extractNativeLibs=“true”
地图打开失败
- 检查访问权限是否正常
- 检查是否只拷贝了*.smwu文件,没有拷贝*.udb、.udd或者.udbx文件
- 检查工作空间中是否保存有地图
Please call com.supermap.data.Environment.initialization() firstly
- 需要在setContentView之前调用Environment.initialization(this)