安卓智能地图开发与实施三:创建第一个地图程序 - ArcGIS Runtime SDK for Android(Version 100.0.0)

本教程详细介绍了如何使用Esri ArcGIS Runtime SDK for Android从零开始创建一个简单的地图应用程序。包括设置项目、配置依赖项、添加地图视图组件及初始化地图等步骤。

本文纯粹是流程操作,手把手第一次,先看效果图。
这里写图片描述
1、创建一个新工程(File > New > New Project)
2、输入工程名:Set Map Initial Location
3、修改Company Domain 和 Project Location
4、修改Package name
5、点击下一步,勾选“Phone and Tablet”
6、选择合适的SDK
这里写图片描述
7、点击下一步,选择“Empty Activity”
8、点击下一步,输入Activity Name。
9、输入Layout Name(可采用默认)。
10、单击完成,等待工程初始化完成。
这里写图片描述
11、于(project)的build.gradle文件中在相应的地方添加:url ‘https://esri.bintray.com/arcgis
这里写图片描述


buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.1'
    }
}

allprojects {
    repositories {
        jcenter()
        // Add the Esri public Bintray Maven repository
        maven {
            url 'https://esri.bintray.com/arcgis'
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

12、于app module的build.gradle文件中在相应的地方添加:
compile ‘com.esri.arcgisruntime:arcgis-android:100.0.0’

这里写图片描述

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "esrichina.hymn.setmapinitiallocation"
        minSdkVersion 23
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile 'com.esri.arcgisruntime:arcgis-android:100.0.0'
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile
    ('com.android.support.test.espresso:espresso-core:2.2.2', {
 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.0'
    testCompile 'junit:junit:4.12'
}

13、在Android Studio toolbar中,单击 “Sync Project with Gradle Files”
(要有好网络,否则等待漫长的下载)

这里写图片描述

14、在“Android project view”中打开“AndroidManifest.xml”(app > manifests)
添加:
*
*
这里写图片描述

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="esrichina.hymn.setmapinitiallocation">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-feature android:glEsVersion="0x00020000" android:required="true" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

15、在Layout(res > layout:activity_main.xml)文件中添加MapView。

这里写图片描述

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="esrichina.hymn.setmapinitiallocation.MainActivity">
    <com.esri.arcgisruntime.mapping.view.MapView
        android:id="@+id/mapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </com.esri.arcgisruntime.mapping.view.MapView>
</android.support.constraint.ConstraintLayout>

16、初始化 MapView。进入“MainActivity”(java > [package name]),于相应处编码。

这里写图片描述

package esrichina.hymn.setmapinitiallocation;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.view.MapView;
public class MainActivity extends AppCompatActivity {
    private MapView mMapView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mMapView = (MapView) findViewById(R.id.mapView);
        ArcGISMap map = new ArcGISMap
                (Basemap.Type.TOPOGRAPHIC, 34.056295, -117.195800, 16);
        mMapView.setMap(map);
    }
}

17、运行程序,选择设备,得到结果。

这里写图片描述

  • 结尾
    程序非常简单,如果非要源程序,请自行下载:
    http://pan.baidu.com/s/1dF8Cx8l 密码:9vrr
    若失效,可发邮件给韩源萌(polyline@126.com)索要。
<think> 我们注意到用户的问题是关于在ArcGIS for Android中不使用`com.esri.arcgisruntime.mapping.view.MapView`来使用ArcGIS地图的方法。 根据引用[3],常见的ArcGIS地图展示使用的是`com.esri.arcgisruntime.mapping.view.MapView`控件。但是用户明确要求不使用这个控件。 在ArcGIS Runtime SDK for Android中,`MapView`是展示地图的主要视图组件。如果不使用它,我们需要考虑替代方案。 可能的替代方案: 1. 使用WebView加载ArcGIS JavaScript API的地图(即通过Web方式嵌入地图)。 2. 使用其他地图引擎(如Google Maps、Mapbox等)并叠加ArcGIS地图服务(例如作为瓦片图层或动态图层)。 由于用户要求使用ArcGIS地图,我们主要考虑第一种方案,因为第二种方案虽然可以加载ArcGIS服务,但并不是直接使用ArcGIS SDK。 方案一:使用WebView加载ArcGIS JavaScript API 步骤: a. 在布局文件中添加WebView组件。 b. 在Activity中初始化WebView,并启用JavaScript。 c. 加载包含ArcGIS JavaScript API的HTML页面,该页面中初始化地图。 示例代码: 1. 布局文件(activity_main.xml): ```xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> ``` 2. 在assets目录下创建html文件(例如map.html): ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" /> <title>ArcGIS JavaScript API in WebView</title> <link rel="stylesheet" href="https://js.arcgis.com/4.24/esri/themes/light/main.css" /> <script src="https://js.arcgis.com/4.24/"></script> <style> html, body, #viewDiv { padding: 0; margin: 0; height: 100%; width: 100%; } </style> <script> require(["esri/Map", "esri/views/MapView"], function(Map, MapView) { var map = new Map({ basemap: "streets" }); var view = new MapView({ container: "viewDiv", map: map, center: [118.79, 32.06], // 南京的经纬度 zoom: 10 }); }); </script> </head> <body> <div id="viewDiv"></div> </body> </html> ``` 3. Activity中(MainActivity.java): ```java import android.os.Bundle; import android.webkit.WebSettings; import android.webkit.WebView; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = findViewById(R.id.webView); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); // 加载本地html文件 webView.loadUrl("file:///android_asset/map.html"); } } ``` 注意事项: - 需要确保在AndroidManifest.xml中声明了网络权限:`<uses-permission android:name="android.permission.INTERNET" />`。 - 这种方式实际上是在WebView中运行一个Web应用,因此性能可能不如原生MapView,并且一些原生功能(如GPS定位)需要额外通过JavaScript接口桥接。 方案二:在其他地图引擎中加载ArcGIS服务(以Google Maps为例) 我们可以将ArcGIS地图服务作为瓦片图层叠加到Google Maps上。但是这种方法需要用户集成Google Maps SDK,并且需要知道ArcGIS地图服务的URL(通常是REST服务)。 步骤: a. 添加Google Maps SDK依赖。 b. 在布局中添加Google MapView。 c. 在代码中配置Google Map,并添加一个TileOverlay,该TileOverlay使用ArcGIS的瓦片服务URL。 示例(假设我们使用一个ArcGIS的瓦片服务URL,例如:https://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer): 1. 在GoogleMap中添加TileOverlay: ```java // 假设你已经初始化了GoogleMap对象:googleMap // 创建一个瓦片提供器,指向ArcGIS的瓦片服务 TileProvider arcgisTileProvider = new UrlTileProvider(256, 256) { @Override public URL getTileUrl(int x, int y, int zoom) { // 注意:不同的服务URL模板可能不同,这里是一个示例模板 String url = "https://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/"+zoom+"/"+y+"/"+x; try { return new URL(url); } catch (MalformedURLException e) { return null; } } }; // 添加瓦片图层 googleMap.addTileOverlay(new TileOverlayOptions().tileProvider(arcgisTileProvider)); ``` 但是请注意,这种方法需要用户集成Google Maps SDK,并且需要处理坐标转换(例如,Web墨卡托投影)和瓦片URL的拼接规则。不同的ArcGIS服务可能有不同的URL模式。 结论: - 如果不使用`MapView`,推荐使用WebView的方式,因为它直接使用ArcGIS JavaScript API,功能全面且兼容性好。 - 如果应用已经集成了其他地图引擎(如Google Maps),并且只需要加载特定的ArcGIS瓦片服务,则可以使用第二种方法。 用户可以根据具体需求选择合适的方法。 引用说明: - 方案一参考了Web开发中嵌入ArcGIS JavaScript API的常规方法。 - 方案二参考了Google Maps中叠加自定义瓦片图层的文档。 如果用户有特定的ArcGIS服务需要加载,或者有特定的需求(如离线使用),可能需要进一步的调整。 </think> 在 ArcGIS for Android 中,如果不使用 `com.esri.arcgisruntime.mapping.view.MapView`,可以通过以下两种替代方案实现地图加载: ### 方案一:通过 WebView 集成 ArcGIS JavaScript API(推荐) 1. **原理** 在 WebView 中运行 ArcGIS JavaScript API 的 HTML 页面,通过 Web 接口调用地图服务,避开原生 MapView 控件。 2. **实现步骤** **① 添加权限和布局** ```xml <!-- AndroidManifest.xml --> <uses-permission android:name="android.permission.INTERNET" /> ``` ```xml <!-- activity_main.xml --> <WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` **② 创建 HTML 地图页面**(存于 `assets/map.html`) ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link rel="stylesheet" href="https://js.arcgis.com/4.24/esri/themes/light/main.css"> <script src="https://js.arcgis.com/4.24/"></script> <script> require(["esri/Map", "esri/views/MapView"], (Map, MapView) => { const map = new Map({ basemap: "topo-vector" }); const view = new MapView({ container: "viewDiv", map: map, center: [118.79, 32.06], // 南京坐标 zoom: 10 }); }); </script> </head> <body> <div id="viewDiv" style="height:100%;width:100%"></div> </body> </html> ``` **③ 加载 WebView** ```java WebView webView = findViewById(R.id.webview); webView.getSettings().setJavaScriptEnabled(true); webView.loadUrl("file:///android_asset/map.html"); ``` 3. **优点** - 完全避开原生 MapView 依赖 - 跨平台兼容性强 - 可使用全部 ArcGIS Online 服务 --- ### 方案二:通过其他地图引擎加载 ArcGIS 服务 1. **原理** 使用第地图控件(如 Google Maps)加载 ArcGIS 提供的 WMTS/TMS 服务。 2. **实现步骤**(以 Google Maps 为例) **① 添加 WMTS 图层** ```java // 构建 ArcGIS 瓦片服务 URL(天地图示例) String urlTemplate = "https://t0.tianditu.gov.cn/vec_w/wmts?layer=vec&style=default&tilematrixset=w&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&TileMatrix={z}&TileCol={x}&TileRow={y}&tk=您的密钥"; // 创建瓦片图层 TileOverlayOptions tileOverlayOptions = new TileOverlayOptions() .tileProvider(new UrlTileProvider(256, 256) { @Override public URL getTileUrl(int x, int y, int zoom) { String sUrl = urlTemplate .replace("{x}", String.valueOf(x)) .replace("{y}", String.valueOf(y)) .replace("{z}", String.valueOf(zoom)); try { return new URL(sUrl); } catch (Exception e) { return null; } } }); // 添加到地图 GoogleMap googleMap = ... // 初始化 Google 地图 googleMap.addTileOverlay(tileOverlayOptions); ``` 3. **服务 URL 示例** | 服务类型 | URL 模板 | |---|---| | 矢量地图 | `https://services.arcgisonline.com/arcgis/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}` | | 影像地图 | `https://server.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}` | --- ### 关键注意事项 1. **WebView 方案** - 需启用 JavaScript:`webView.getSettings().setJavaScriptEnabled(true)` - 网络权限必须声明:`<uses-permission android:name="android.permission.INTERNET" />`[^2][^3] 2. **瓦片服务方案** - 坐标系需匹配(ArcGIS 常用 `EPSG:3857`) - 需处理密钥认证(如天地图服务) - 缩放级别需服务层级对齐 两种方案均无需 `com.esri.arcgisruntime.mapping.view.MapView`,可根据项目需求选择: - **推荐 WebView 方案**:功能完整,维护成本低 - **瓦片服务方案**:适合轻量级集成,需自定义坐标转换 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虾神说D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值