SuperMap iMobel Android 基础环境搭建

1. 简介

SuperMap iMobile 是SuperMap GIS 家族中的一员,是基于超图共相式 GIS 内核进行开发的组件式移动 GIS
开发平台。该产品继承并发挥了超图软件在 GIS
领域的专业经验积累,具备专业、全面的移动GIS功能。支持基于Android和iOS操作系统的智能移动终端,可以快速开发在线和离线的移动GIS应用。

2. 主要功能

  • 支持将多种类型的空间数据投放到真实场景中:

    • AR实景地图:支持图片、网页、视频投射、对接语音输入、支持GPS定点投射;
    • AR电子沙盘:支持任意位置投放,支持放大、缩小、旋转、浏览等交互操作,可以随时随地展示景区信息,对景区道路和景点进行管理;
    • AR矢量地图:支持二维地图投射,支持POI查找等;
    • AR三维管线:支持浏览、交互、属性查询以及基于位置的自动拾取,可以模型穿越,还原现实中被隐藏的管线位置分布信息;
    • AR特效系统:支持1平方千米模型精准投放,无缝接地,真实直观,可应用于城市规划,土地安置等诸多领域;同时支持模型动画特效,阴影特效,粒子特效,导航路线特效,雨雪天气特效,一年四季特效,三维标注特效等。
  • 全新的AR地图技术提供多种目标识别类型,支持指定目标跟踪、目标计数等功能,可以智能采集目标名称、位置、识别时间等信息。此外,AR地图结合了实时流技术,可以将各移动设备上采集的数据、移动轨迹等,在视频大屏上动态展示,还可以根据目标聚合度实时生成热力图、密度图等。
  • 对接SuperMap云账号,支持在移动端管理SuperMap Online、SuperMap iPortal的在线门户资源及在线地图资源,使云数据、云服务的管理不再受时间、空间的局限,实现了云边端统一账号。
  • 专业的移动 GIS 开发平台,提供全面的移动GIS功能。在专业数据采集、行业GIS应用、大众化GIS应用等领域都有广泛的应用。
  • 全面支持OpenGL地图显示引擎,利用OpenGL在面片渲染、文本渲染及反走样等方面的优势提升地图显示效果;同时利用OpenGL的整体渲染模式,大幅提升地图的显示性能。
  • 除支持广泛的在线地图服务外,还支持强大的离线数据。在多种特殊的应用场景都有广泛的应用,如:移动网络信号无覆盖、移动网络流量受限、数据保密、高性能移动GIS等。
  • 提供移动端、桌面端和服务器端通用数据格式,跨终端交换数据无需转换格式,即拷即用。
  • 支持离线、在线加载GL矢量瓦片数据,大幅提升地图显示性能。
  • 支持离线、在线加载MVT数据,提供更强大的地图功能。
  • 支持丰富的数据可视化效果,使移动端成为大数据的重要展示端。
  • AR地图功能,将摄像头与地图叠加,实时显示当前位置和目的地之间的方向及距离,支持AR导航功能,实现虚实场景的完美结合。
  • 语音识别功能,支持语音搜索周边、语音采集属性信息、语音控制地图、多种语义识别等功能,提供了一种全新的外业操作模式,极大的提升了外业采集的效率。
  • 消息总线功能,支持多端之间的协同操作,在一个终端执行的操作可以快速同步到其它相关终端,从而实现数据共享和即时通讯的功能。
  • 支持态势标绘功能,提供多种点符号和箭头符号的标绘。可应用于调度,指挥等多种应急行业中。
  • 高性能的二三维一体化,在移动端支持高精细的三维模型,支持水纹、火焰、喷泉、樱花等多种动画效果。
  • 支持在线和离线方式浏览倾斜摄影建模数据,支持选中单个模型对象高亮、以及单体模型的属性信息、空间信息查询等GIS功能。
  • GIS和导航一体化,极大的提高了室内外GIS作业的便利性和工作成效。
  • 通过对三种国际标准AMQP、MQTT和STOMP的支持,实现了GIS数据的广播方式消息传播和点对点消息传播,进而实现多端协同和数据分发。
  • 提供基于 ReactNative 的免费开发工具 iMobile for ReactNative ,基于该开发工具,用户可以使用javascript开发语言,开发出在 Android 和 iOS 操作系统下运行的原生移动GIS应用,入门门槛低,一次开发,处处运行。

3. 下载与使用

3.1 下载

下载地址:http://support.supermap.com.cn/DownloadCenter/ProductPlatform.aspx

产品包说明

  • 版本选择:请根据项目需求,上拉至顶端标签选择合适的版本号(注:9D和10I版本许可通用,11i版本单独申请许可),推荐使用同版本号下选择最新版本
  • 产品包说明(以10i为例):
    • SuperMap iMobile 10i(2021) SP1 for Android(Samplecode & Sampledata) 包含所有的iMobel示范程序和示范数据,不包含sdk和产品帮助文档
    • SuperMap iMobile 10i(2021) SP1 for Android(绿色包) 是SuperMap iMobel的sdk,不包含示范程序和示范数据,不包含产品帮助文档
    • SuperMap iMobile 10i(2021) SP1 for Android 包含了sdk、产品帮助文档、示范程序和所有的示范数据

3.2 试用许可申请

试用许可申请地址: https://www.supermapol.com/web/pricing/triallicense,也可以通过超图官网:https://www.supermap.com/cn/下选择 支持与服务——选择下载下的试用许可申请进入。

如果没有账号,可以通过注册账号自行注册。许可界面如下:

填完申请资料后,勾选需要的许可,点击提交,邮箱会接收到许可文件。

4. 搭建第一个地图app

4.1 开发环境

  • 版本选择: SuperMap iMobile 10i(2021) SP1 for Android
  • 开发工具: android Studio
  • 语言选择: java
  • JDK版本: jdk8.0
  • android sdk版本:28
  • 地图数据: 示范数据

4.2 准备工作

1. 数据准备

在android手机根目录下创建/SampleData文件夹,将数据拷贝到文件夹下

2. 许可准备

在手机根目录创建/SuperMap/license文件夹,将申请到的许可放到license目录下(许可文件格式为:SuperMap iMobile Trial - 2022-04-04.slm)

3. 测试手机打开开发者模式

4.3 创建androiid项目

1. 创建空项目

打开android studio,选择 File-New-NewProject,选择一个空模板(Empty Activity)。

输入项目名、包名、存储路径等信息,点击确认。

2. 使用SuperMap iMobile for Android

解压SuperMap iMobile for Android 产品包。

根据功能的需要,从产品包中libs文件夹中选择需要的库文件拷贝到工程顶级路径下,本例以使用1021版本为例(其他版本选用对应的库文件即可), 仅使用到二维功能,所以将产品包中libs文件夹中的核心模块库文件com.supermap.data_v1021.jar、地图显示模块库文件com.supermap.mapping_v1021.jar、云许可依赖模块lang3-3.1.0.jar、log4j-1.2.17.jar、slf4j-api-1.7.26.jar、slf4j-log4j12-1.7.26.jar,armeabi-v7a文件夹下libimb2d_v1021.so拷贝到Module 的libs文件夹,如下图所示。

然后选中所有的libs下的jar文件,单击右键,选择Add As Library…导入jar包依赖

3. 更改build.gradle

在android中增加配置:jniLibs.srcDirs = [‘libs’],在dfefaultConfig中添加ndk支持,完整代码如下:

plugins {id 'com.android.application'
}
android {compileSdkVersion 30buildToolsVersion "30.0.1"defaultConfig {applicationId "com.supermap.myandroidproject"minSdkVersion 24targetSdkVersion 28versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"ndk {abiFilters "armeabi-v7a"}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}sourceSets {main {jniLibs.srcDirs = ['libs']}}
}
dependencies {implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'com.google.android.material:material:1.1.0'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'implementation files('libs\\com.supermap.data_v1021.jar')implementation files('libs\\com.supermap.mapping_v1021.jar')implementation files('libs\\lang3-3.1.0.jar')implementation files('libs\\log4j-1.2.17.jar')implementation files('libs\\slf4j-api-1.7.26.jar')implementation files('libs\\slf4j-log4j12-1.7.26.jar')testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.1'androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

4. 添加最低权限

注意:android 6.0以上 必须使用动态权限

  1. 修改AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:versionCode="1"android:versionName="1.0"package="com.supermap.maptest"tools:ignore="WrongManifestParent"><uses-sdk android:minSdkVersion="10"tools:ignore="GradleOverrides" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.INTERNET" /></manifest>
  1. 在build.gradle中引入easypermissions类库,完整配置如下:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {repositories {google()jcenter()}dependencies {classpath "com.android.tools.build:gradle:4.1.1"// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files}
}allprojects {repositories {google()jcenter()}
}task clean(type: Delete) {delete rootProject.buildDir
}subprojects{afterEvaluate {project->if(project.hasProperty("dependencies")){dependencies{implementation 'pub.devrel:easypermissions:2.0.1'}}}
}
  1. 在代码中添加如下代码内容
    /*** 定义需要申请的权限数组*/protected String[] needPermissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.READ_PHONE_STATE,Manifest.permission.ACCESS_WIFI_STATE,Manifest.permission.ACCESS_NETWORK_STATE,Manifest.permission.CHANGE_WIFI_STATE,};/*** 申请权限,在初始化的时候调用申请权限*/private void requestPermissions() {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {return;}if (!checkPermissions(needPermissions)) {EasyPermissions.requestPermissions(this,"为了应用的正常使用,请允许以下权限。",0,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.READ_PHONE_STATE,Manifest.permission.ACCESS_WIFI_STATE,Manifest.permission.ACCESS_NETWORK_STATE,Manifest.permission.CHANGE_WIFI_STATE);//没有授权,编写申请权限代码} else {//已经授权,执行操作代码}}private boolean checkPermissions(String[] needPermissions) {return EasyPermissions.hasPermissions(this, needPermissions);}

4. 添加Activity配置

在“AndroidManifest.xml”中,承载 MapControl 的那个 Activity 项目中添加 Activity
配置,让地图界面在横竖屏切换时不再重复调用 onCreate。

在Activity项目中添加如下配置:

android:configChanges="keyboardHidden|orientation"

注意:当android版面本在4.0以上时,配置configChanges要添加screeSize,具体配置如下:

android:configChanges="keyboardHidden|orientation|screenSize"

<applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.MyAndroidProject"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN"android:configChanges="keyboardHidden|orientation|screenSize"/><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>

5. AndroidManifest.xml中添加多格式屏幕配置

 <!--    支持多格式屏幕配置 --><supports-screensandroid:anyDensity="true"android:largeScreens="true"android:normalScreens="true"android:smallScreens="true"tools:ignore="ManifestOrder"/>

6. AndroidManifest.xml中添加android:usesCleartextTraffic=“true”

    <applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:usesCleartextTraffic="true"android:theme="@style/Theme.MyAndroidProject"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN"android:configChanges="keyboardHidden|orientation|screenSize"/><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>

完整AndroidManifest.xml配置文件如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:versionCode="1"android:versionName="1.0"package="com.supermap.myandroidproject"tools:ignore="WrongManifestParent"><uses-sdk android:minSdkVersion="10"tools:ignore="GradleOverrides" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.INTERNET" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:usesCleartextTraffic="true"android:theme="@style/Theme.MyAndroidProject"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN"android:configChanges="keyboardHidden|orientation|screenSize"/><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

7. 编写代码

在布局文件 activity_main.xml 中添加如下代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/main"><RelativeLayoutandroid:gravity="left"android:layout_width="match_parent"android:layout_height="match_parent"><com.supermap.mapping.MapViewandroid:id = "@+id/Map_view"android:layout_width="match_parent"android:layout_height = "match_parent"></com.supermap.mapping.MapView><ZoomControlsandroid:id="@+id/zoomControls1"android:layout_alignParentBottom="true"android:layout_alignParentRight="true"android:layout_centerHorizontal="true"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentEnd="true"></ZoomControls></RelativeLayout>
</RelativeLayout>

在MainActivity中编写应用程序代码如下:

package com.supermap.myandroidproject;import android.Manifest;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ZoomControls;import com.supermap.data.Environment;
import com.supermap.data.Workspace;
import com.supermap.data.WorkspaceConnectionInfo;
import com.supermap.data.WorkspaceType;
import com.supermap.mapping.MapControl;
import com.supermap.mapping.MapView;import pub.devrel.easypermissions.EasyPermissions;/*** 启动类* @Auther   wangjun*/
public class MainActivity extends Activity {private MapView mMapView;private MapControl mMapControl;private Workspace mWorkspace;private ZoomControls mZoom;private Button changeStatus;private String rootPath = android.os.Environment.getExternalStorageDirectory().getAbsolutePath();/*** 需要申请的权限数组*/protected String[] needPermissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.READ_PHONE_STATE,Manifest.permission.ACCESS_WIFI_STATE,Manifest.permission.ACCESS_NETWORK_STATE,Manifest.permission.CHANGE_WIFI_STATE,};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//申请权限requestPermissions();//初始化环境initEnvironment();//初始化layoutinitView();//打开地图openMap();}/*** 申请权限*/private void requestPermissions() {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {return;}if (!checkPermissions(needPermissions)) {EasyPermissions.requestPermissions(this,"为了应用的正常使用,请允许以下权限。",0,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.READ_PHONE_STATE,Manifest.permission.ACCESS_WIFI_STATE,Manifest.permission.ACCESS_NETWORK_STATE,Manifest.permission.CHANGE_WIFI_STATE);//没有授权,编写申请权限代码} else {//已经授权,执行操作代码}}/*** 初始化环境*/private void initEnvironment() {//设置一些系统需要用到的路径Environment.setLicensePath(rootPath + "/SuperMap/license/");Environment.setTemporaryPath(rootPath + "/SuperMap/temp/");Environment.setWebCacheDirectory(rootPath + "/SuperMap/WebCatch");//如果机器中默认不包括需要显示的字体,可以把相关字体文件放在参数所代表的路径中。//组件功能必须在Environment初始化之后才能调用Environment.initialization(this);//例如,如果需要显示阿拉伯文字(若机器中原先不包括相关字体文件),可以把需要的字体文件放在参数所代表的路径中。Environment.setFontsPath(rootPath + "/SuperMap/fonts/");}private void initView() {//设置主页面的layoutsetContentView(R.layout.activity_main);//  关联地图layoutmMapView = findViewById(R.id.Map_view);mMapControl = mMapView.getMapControl();mZoom = findViewById(R.id.zoomControls1);}/*** 打开地图*/private void openMap() {//创建工作空间链接mWorkspace = new Workspace();WorkspaceConnectionInfo info = new WorkspaceConnectionInfo();info.setServer(rootPath+"/SampleData/DynamicChartData/China400.smwu");info.setType(WorkspaceType.SMWU);mWorkspace.open(info);//关联工作空间和mapControlmMapControl.getMap().setWorkspace(mWorkspace);//打开地图mMapControl.getMap().open(mWorkspace.getMaps().get(0));mZoom.setIsZoomInEnabled(true);mZoom.setIsZoomOutEnabled(true);//放大按钮mZoom.setOnZoomInClickListener(new OnClickListener() {public void onClick(View v) {mMapControl.getMap().zoom(2);mMapControl.getMap().refresh();}});//缩小按钮mZoom.setOnZoomOutClickListener(new OnClickListener(){public void onClick(View v) {mMapControl.getMap().zoom(0.5);mMapControl.getMap().refresh();}});mMapControl.getMap().refresh();}private boolean checkPermissions(String[] needPermissions) {return EasyPermissions.hasPermissions(this, needPermissions);}}

8. 运行程序

使用真机运行模拟数据。

注:iMobel不支持x86移动设备,所以不能使用模拟器运行。

运行效果如下图所示:

SuperMap iMobel for Android 基础环境搭建相关推荐

  1. 【Android基础笔记01】Android开发环境搭建和HelloWorld

    最近手头项目3.0版本要上线了, 没有那么多工作压力了, 抽空看了看之前在云笔记上做的笔记 都是一些基础知识 给大家分享出来吧 一.什么是Android?[了解 ] Android(中文俗称安卓)是一 ...

  2. 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第一章:Android开发环境搭建

    第 1 章 Android开发环境搭建 本章介绍了如何在个人电脑上搭建Android开发环境,主要包括:Android开发的发展历史是怎样的.Android Studio的开发环境是如何搭建的.如何创 ...

  3. 2019零基础学Android第1课——Android开发环境搭建

    Android开发工具主要是以AndroidStudio为主,注意如果你在网上还看到有人在介绍eclipse去开发android,那么你可以直接忽略那个介绍了,因为eclipse现在很少有人用了.无论 ...

  4. Android 应用开发(29)---android 开发环境搭建

    android 开发环境搭建 分类 Android 基础入门教程 现在主流的Android开发环境有: ①Eclipse + ADT + SDK ②Android Studio + SDK ③Inte ...

  5. Windows下Android开发环境搭建和配置

    关于Windows下Android开发环境搭建.配置方面文章,网上一搜一堆,为方便以后参考,权且做个记录,主要关注安装过程中的注意事项.对新手提醒的是,本文介绍SDK开发Android APK环境搭建 ...

  6. Windows环境下Android NDK环境搭建

    转自:http://blog.csdn.net/pengchua/article/details/7582949 前面介绍Windows下Android 开发环境配置,主要是面向JAVA开发环境,对只 ...

  7. SpringCloud Alibaba微服务实战(一) - 基础环境搭建

    说在前面 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来 ...

  8. Android开发环境搭建及常见问题解决方法

    Android开发环境搭建及常见问题解决方法 参考文章: (1)Android开发环境搭建及常见问题解决方法 (2)https://www.cnblogs.com/rwxwsblog/p/476978 ...

  9. Android开发环境搭建全程演示(jdk+eclip+android sdk)

    Android开发环境搭建全程演示(jdk+eclip+android sdk) http://files.cnblogs.com/Bany/Android%E5%BC%80%E5%8F%91%E7% ...

  10. Android Studio环境搭建

    Android Studio环境搭建 个人博客 欢迎大家多多关注该独立博客. ###[csdn博客](http://blog.csdn.net/peace1213)  一直想把自己的经验分享出来,记得 ...

最新文章

  1. 标记三维点_三维扫描仪对汽车钣金外形检测折弯件钣金件热成型加工件的应用...
  2. JavaScript容易犯错的九个陷阱
  3. GDB 调试 .NET 程序实录 - .NET 调用 .so 出现问题怎么解决
  4. python正则_python的正则表达式
  5. html 输入框从左上角,在输入框的左上角,使文本开始_input_开发99编程知识库
  6. 如何打造一支低效技术团队?
  7. [译]理解 Node.js 事件驱动架构
  8. 开启Accessibility的快捷方式-3次home键或者侧边键
  9. 远程预付费电能管理系统在工业园的应用,主要功能有哪些?
  10. 哈工大离散数学期末试题2021回忆版
  11. PLSQL 的安装与简单使用
  12. java 写代码求导_OO_JAVA_表达式求导
  13. 精通 CSS+DIV 网页样式与布局 116
  14. 为什么我不断收到Java错误:错误:可以找到或加载类Dint?
  15. Android 跳转外部浏览器
  16. MFC 绘制 PNG 格式图片
  17. 【高光谱、多光谱和全色图像融合】
  18. matlab 两个txt文件的合并。。
  19. Android自定义IM聊天界面
  20. 文献翻译--《Siamese Regression Tracking With Reinforced Template Updating》--增强模板更新的孪生回归跟踪,IEEE-2021

热门文章

  1. JavaScript中getYear,getMonth,getDate()
  2. mysql 序系列化_J2SE中的序默认序列化_MySQL
  3. 投影幕布尺寸计算器_投影幕布尺寸计算方式
  4. 无线城市--WiMax,WiFi-Mesh和3G/4G/5g网络
  5. 算法设计技巧: Primal-Dual
  6. python中 d是什么意思_python里d是什么意思
  7. python画聚类树状图_聚类分析python画树状图--Plotly(dendrogram)用法解析
  8. android手机通过USB共享电脑网络
  9. MHL接口是一种废品接口
  10. python程序怎么给别人运行_如何把自己写的python程序给别人用