|
阅读:2966回复:6
ArcGIS API for Android 案例教程
<p>本文环境:Windows 7+ArcGIS Server 10+ArcGIS API for Android 1.0 beta<br/> <br/>I. 配置开发环境<br/> <br/>ArcGIS API for Android(以下简称ArcGIS Android API)的开发环境其实就等于“Android开发环境”+“ArcGIS开发插件”,Android开发环境是基于Eclipse的,因此,只要熟悉Eclipse的应该很容易配置。<br/> <br/>Android开发环境[1]<br/> <br/>Android开发环境是基于Eclipse的,而ArcGIS Android API要求Eclipse版本为3.5(Galileo)或3.6(Helios)。因此Android开发环境配置的第一步在于正确安装JDK6,然后安装Eclipse(3.5/3.6,<a href="http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/</a>,推荐Classic版本)。<br/> <br/>在已经拥有Eclipse的基础上,随后需要安装Android SDK。Android SDK可以从<a href="http://androidappdocs.appspot.com/sdk/index.html">http://androidappdocs.appspot.com/sdk/index.html</a>下载,我一般下载的是压缩包,直接解压到一个目录下就可以了,比如在我的电脑上,我的Android SDK就位于D:\Software\Develop\Android\android-sdk-windows目录下。<br/> <br/>下面,我们需要使Eclipse和Android SDK联系起来,直到现在,Eclipse还不知道从哪里去调用Android SDK,所以,我们还需要在Eclipse中安装Android的Eclipse插件,这个插件叫Android Development Tool(ADT),安装可以通过Android的在线升级地址(<a href="https://dl-ssl.google.com/android/eclipse/">https://dl-ssl.google.com/android/eclipse/</a>)进行,这个过程通过Eclipse中的【Help】->【Install New Software…】菜单触发:<br/> </p><p><br/>图 1 安装Eclipse ADT插件<br/> <br/>当安装完成后,通过Eclipse的【Window】->【References】菜单可以看到现在Eclipse中已经存在了Android的选项,这时,还需要指定一下Android SDK的路径,比如在我的电脑上,我需要告诉Eclipse的ADT插件:Android SDK位于D:\Software\Develop\Android\android-sdk-windows目录下。<br/> </p><p><br/>图 2 配置ADT插件属性使其能找到Android SDK<br/> <br/>或许你已经注意到了,上面的对话框中列出了两个Android的目标设备:Android 2.1和Android 2.2,但是这两个平台可能并没有显示在你的Eclipse中,因为我已经通过Android SDK提供的SDK Manager工具下载了上面的两个平台,而你需要做的也和我之前做的一样,通过【Window】->【Android SDK and AVD Manager】菜单下载你需要的平台并创建模拟器[2]:<br/> </p><p><br/>图 3 下载相应版本的Android平台<br/> </p><p><br/>图 4 创建模拟器<br/> <br/>--------------------------------------------------------------------------------</p><p>[1]安装文档可以参考:<a href="http://androidappdocs.appspot.com/sdk/installing.html">http://androidappdocs.appspot.com/sdk/installing.html</a><br/> <br/>[2]或称为虚拟设备(AVD,Android Virtual Devices)。</p><p> </p>
[此贴子已经被作者于2011-09-07 13:23:50编辑过]
|
|
|
|
1楼#
发布于:2011-09-07 13:24
<p>ArcGIS开发插件<br/> <br/>现在Android的开发环境已经具备,后面就需要安装ArcGIS开发相关的库和Eclipse插件了。在此之前,你还需要确认你已经下载了Android 2.1或2.1的平台,因为这是ArcGIS Android API的系统需求[1]。<br/> <br/>Esri提供了一个在线升级地址(<a href="http://downloads.esri.com/software/arcgis/android">http://downloads.esri.com/software/arcgis/android</a>)来帮助用户安装ArcGIS的开发插件,在Eclipse中,还是通过【Help】->【Install New Software…】菜单就可以顺利地安装上这些组件:<br/> </p><p><br/>图 5 安装ArcGIS的开发插件<br/> <br/>当ArcGIS开发插件安装完成后,在新建工程的选项中就可以看到【ArcGIS Project for Android】和【ArcGIS Samples for Android】的菜单,ArcGIS Android API的开发环境就顺利配置完成了!<br/> </p><p><br/>图 6 ArcGIS Android API开发环境中新增的工程类型<br/> <br/>--------------------------------------------------------------------------------</p><p>[1]http://help.arcgis.com/en/arcgismobile/10.0/apis/android/help/#/System_requirements/011900000004000000</p><p> </p>
[此贴子已经被作者于2011-09-07 13:24:03编辑过]
|
|
|
|
2楼#
发布于:2011-09-07 13:25
<h3><a name="_Toc285531471">I. 理解开发模式</a></h3><p>首先,你需要知道的第一件事就是:ArcGIS Android API依赖ArcGIS Server的REST接口。相信不少做过ArcGIS Server开发的人都接触过REST接口,因为无论是ArcGIS的JavaScript API、Flex API、Silverlight API、Windows Phone API等等,它们都依赖ArcGIS Server提供的REST接口的服务。因为,仅仅依靠浏览器或者移动设备本身所能实现的功能是非常有限的,而ArcGIS Server才是它们坚实的后盾,同时,REST接口又是它们和ArcGIS Server最为友好的交互方式。在这里我们也可以预见到,将来会有更多的开发模式都将围绕着ArcGIS Server的REST接口服务展开。</p><p>下面,让我们先通过ArcGIS Android API提供的Hello World例子来理解API大致的工作原理、开发涉及的大概方面等内容。</p><h4><a name="_Toc285531472">新建一个Hello World</a>工程</h4><p>在前面顺利配置完成ArcGIS Android API开发环境的基础上,要新建一个Hello World工程是非常容易的,我们只需要在Eclipse中点击【File】->【New】->【ArcGIS Samples for Android】菜单(当然,从工具栏里也可以找到这个菜单,这个想必不用多说了吧),很快我们就能看到一个包含了所有例子的向导:</p><p><a href="http://www.gissky.net/Article/UploadFiles/201103/20110311173812695.gif"><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image002" border="0" alt="clip_image002" src="http://www.gissky.net/Article/UploadFiles/201103/20110311173812671.gif" width="533" height="178"/></a></p><p>图 7 新建一个例子工程的菜单</p><p><a href="http://www.gissky.net/Article/UploadFiles/201103/20110311173812644.gif"><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image004" border="0" alt="clip_image004" src="http://www.gissky.net/Article/UploadFiles/201103/20110311173813396.gif" width="429" height="395"/></a></p><p><a name="_Ref285398138">图 </a>8 选择新建“Hello World”例子</p><p>新建工程结束后,在当前的工作空间中就会出现以图 8中所示的工程名字——“AgsSampleHelloWorld”为名称的目录,在这个目录中存放了这个“Hello World”例子所有相关的资源。马上,我们会从这些源文件、配置文件等资源入手,了解ArcGIS Android工程的细节。</p>
|
|
|
|
3楼#
发布于:2011-09-07 13:25
图 9 “Hello World”的工程目录结构<br/>从Eclipse中展开“AgsSampleHelloWorld”工程,我们就可以看到图 9这样的目录结构。在这个目录结构中,最扎眼的就是“src”目录和其中的“HelloWorld.java”,这让我们马上意识到这是一个Java程序。没错,Android系统虽然是基于Linux内核的,但是在Android开发应用程序却是使用Java语言,Java代码编译出来的字节码将运行在Linux系统中的一个虚拟机中,这个虚拟机名为Dalvik[1]。<br/>在工程的根目录下有两个配置文件,“default.properties”和“AndroidManifest.xml”。这两个配置文件在这么“根”的位置,当然是对整个工程有提纲挈领的作用,先看这个“default.properties”,打开只有一行实际内容(和很多行注释):<br/>target=android-8<br/>从这个文件的注释中知道,你既无需修改这个文件,也从中得不到很多信息,这个文件只是告诉了Android的编译系统,这个工程的目标平台是“android-8”,也就是Android 2.2。<br/><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image006" border="0" alt="clip_image006" src="http://www.gissky.net/Article/UploadFiles/201103/20110311173823554.gif" width="352" height="131"/><br/>图 10 Android平台版本和API版本的关系<br/>但是,“AndroidManifest.xml”就不一样了,从名字就可以知道,这是Android工程的清单文件,直接用文本编辑器打开它可能是如下的内容:<br/>"1.0" encoding="utf-8"?><br/>"http://schemas.android.com/apk/res/android"<br/>package="com.esri.arcgis.android.samples"<br/>android:versi<br/>android:versi><br/>"@drawable/icon" android:label="@string/app_name"><br/>".HelloWorld"<br/>android:label="@string/app_name"><br/><br/>"android.intent.action.MAIN" /><br/>"android.intent.category.LAUNCHER" /><br/><br/><br/><br/>"android.permission.INTERNET"><br/>android:name="android.permission.WRITE_EXTERNAL_STORAGE"><br/>android:name="android.permission.ACCESS_FINE_LOCATION"><br/>"7" /><br/><br/>在这个清单文件的下方,有一些元素,它包含了这个工程正常运行所需要的权限,比如“AgsSampleHelloWorld”运行时会显示一个在线的地图,那么显然,它运行时需要一个Internet连接,所以,这里需要配置“android.permission.INTERNET”这个用户权限。这样,在这个应用程序被安装的时候,Android就会询问用户:“你是不是允许这个程序访问Internet?”,如果用户允许了,你的应用程序才能正常地获取地图。当然,不要担心编写配置文件是一件很麻烦的事情,Android开发工具提供了“Android Manifest Editor”帮助你可以比较方便地编辑清单文件,比如用户权限就可以如图 11这样地修改。<br/><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image008" border="0" alt="clip_image008" src="http://www.gissky.net/Article/UploadFiles/201103/20110311173824291.gif" width="696" height="267"/><br/>图 11 使用Android开发插件配置工程权限<br/>再往上看,清单文件中的元素中包含的是对应用程序包含组件的描述。首先,让我们把元素本身的属性值挑出来看看:<br/>"@drawable/icon" android:label="@string/app_name"><br/>“@drawable/icon”显然是这个程序的图标,但是具体对应到哪个图片呢?这还得继续看当前工程的目录结构,在工程目录下有个“res”文件夹,其中主要存放应用程序的各种资源,而以“drawable-”打头的几个目录就是存放图片的目录,不同目录后面会跟着“hdpi”[2]、“mdpi”[3]、“ldpi”[4]之类不同的内容,这些目录下对应的是不同尺寸屏幕下的不同图片,因为小屏幕可能只需要小图片,大屏幕可能就需要更大更精细的图片。<br/><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image010" border="0" alt="clip_image010" src="http://www.gissky.net/Article/UploadFiles/201103/20110311173825838.gif" width="184" height="147"/><br/>图 12 res目录下的资源<br/>“@string/app_name”则对应了一段字符串,这个字符串是在“res/values”目录下的“strings.xml”文件中定义的,打开这个文件是如下的内容:<br/>"1.0" encoding="utf-8"?><br/><br/>"hello">Hello World, HelloWorld!<br/>"app_name">HelloWorld Sample<br/><br/>想必,等会应用程序运行起来后,它的标题栏上应该会显示“HelloWorld Sample”这一行内容,对吧。<br/>为什么我们在一些目录和XML文件中配置一些内容,Android程序就能知道从哪里去获取真实的资源呢?因为Android开发工具会帮助我们生成一个“R.java”源文件,这个源文件定义了一个名为“R”的类,这个类中不同的静态变量指示了各种资源的不同位置,在后面你可以看到,在程序的Java代码中,我们可以直接通过R.xxx.xxx指代一个资源。<br/><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image012" border="0" alt="clip_image012" src="http://www.gissky.net/Article/UploadFiles/201103/20110311173825873.gif" width="243" height="115"/><br/>图 13 自动生成的R.java<br/>清单文件的元素内还有元素,这对应了Android程序中的Activity。由于本次广告插播时间过长,这些内容留待后续再说,不过,现在起码你对一个Android工程中大概包含的内容应该有所了解了吧?<br/>[1] http://zh.wikipedia.org/zh-cn/Dalvik虚拟机<br/>[2] 高分辨率图片,如WVGA(480x800)、FWVGA(480x854)<br/>[3] 中等分辨率图片,如HVGA(320x480)<br/>[4] 低分辨率图片,如QVGA(240x320)<br/>
[此贴子已经被作者于2011-09-07 13:25:46编辑过]
|
|
|
|
4楼#
发布于:2011-09-07 13:26
运行这个ArcGIS Android程序已经费了半天劲儿配环境、建工程,还看了一大段植入广告,真累啊……是时候需要看点实在的东西了!现在,让我们运行“AgsSampleHelloWorld”。<br/><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image002" border="0" alt="clip_image002" src="http://www.gissky.net/Article/UploadFiles/201103/20110311174016414.gif" width="520" height="141"/><br/>图 14 调试Android程序<br/>和一般的Java程序类似,这里选择运行类型为Android Application。一个Android程序想要运行,显然还需要一个模拟器或者真实的设备,如果使用模拟器,那么可以选择刚刚新建的AVD:<br/><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image004" border="0" alt="clip_image004" src="http://www.gissky.net/Article/UploadFiles/201103/20110311174016115.gif" width="458" height="271"/><br/>图 15 选择模拟器<br/>第一次启动模拟器会花费比较多的时间,当成功启动后,你可以看到“AgsSampleHelloWorld”工程运行的结果,虽然看不到有什么特殊的东西,但是上面曾经提到的“HelloWorld Sample”是不是如愿以偿地出现在了标题位置?<br/><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image006" border="0" alt="clip_image006" src="http://www.gissky.net/Article/UploadFiles/201103/20110311174017140.gif" width="486" height="452"/><br/>图 16 在Android模拟器上运行Hello World程序<br/>另外,现在已经有一个地图显示了出来,想来这里已经有一个地图控件并加入了一个地图服务,现在,就让我们看看这个“AgsSampleHelloWorld”到底怎么显示这个地图的。<br/><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image008" border="0" alt="clip_image008" src="http://www.gissky.net/Article/UploadFiles/201103/20110311174017383.gif" width="508" height="347"/><br/>图 17 Hello World程序的调试选项<br/>从“AgsSampleHelloWorld”工程的调试选项中可以看到,在我们运行程序时,程序会运行默认的Activity,在上一节中由于时间关系,并没有对Activity展开叙述,这里再插播一小段Android Activity的内容。<br/>一个Activity就是Android程序呈现给用户的一个界面,所有和用户的交互都在Activity中发生,从某种程度上讲Android的Activity类似一个Windows程序的一个窗体。关于Activity更详细的内容,可以参考这里:http://androidappdocs-staging.appspot.com/reference/android/app/Activity.html。OK,插播结束。<br/>当我们运行“AgsSampleHelloWorld”程序时,实际运行了默认的Activity(com.esri.arcgis.android.sample.HelloWorld),这个Activity的源代码如下:<br/>package com.esri.arcgis.android.samples;<br/>import android.app.Activity;<br/>import android.os.Bundle;<br/>import com.esri.android.map.MapView;<br/>public class HelloWorld extends Activity {<br/>MapView map = null;<br/>/** Called when the activity is first created. */<br/>public void onCreate(Bundle savedInstanceState) {<br/>super.onCreate(savedInstanceState);<br/>setContentView(R.layout.main);<br/>map = (MapView) findViewById(R.id.map);<br/>Object init = getLastNonConfigurationInstance();<br/>if (init != null) {<br/>map.restoreState((String) init);<br/>}<br/>}<br/>/** Called by the system, as part of destroying an activity due to a configuration change. */<br/>public Object onRetainNonConfigurationInstance() {<br/>return map.retainState();<br/>}<br/>}<br/>当运行一个Android的程序,并第一次调用某个Activity时,首先会调用其onCreate方法(详见Activity生命周期),在onCreate方法中,先做的一件事情是下面这句代码:<br/>setContentView(R.layout.main);<br/>这个setContentView方法的作用是根据一个XML格式的布局文件,生成真正的Activity的对象。对于这个“R”我们在上面已经介绍过了,”R.layout.main”对应的资源就是“res/layout”目录下的“main.xml”这个文件定义的布局(这个布局文件有点类似Flex的MXML或Silverlight的XAML,是不是?)。让我们来看看这个“main.xml”的内容:<br/>"1.0" encoding="utf-8"?><br/>xmlns:android="http://schemas.android.com/apk/res/android"<br/>android:id="@+id/map" android:layout_width="fill_parent"<br/>android:layout_height="fill_parent"<br/>initExtent="-1.3296373526814876E7 3930962.41823043 <br/>-1.2807176545789773E7 4201243.7502468005"><br/>url="http://services.arcgisonline.com/ArcGIS/rest/services/ <br/>World_Street_Map/MapServer"/><br/><br/>这个布局的根组件就是MapView[1],MapView是基于Android中ViewGroup(可以作为其它View或ViewGroup的容器)的一个类,ArcGIS Android API中使用MapView作为地图的容器,这和很多ArcGIS API中的Map、MapControl类的作用是一样的。<br/>在MapView中,随后又添加了一个ArcGISTiledMapServiceLayer图层,其url属性对应到了某个切片地图服务的REST接口上,可以看到,这里的定义和很多ArcGIS Web上的API是一致的。<br/>MapView有个属性是android:id,这个属性值为“@+id/map”,这定义了在这个xml中的MapView最后将会被解释为一个id为“map”的MapView对象,因此,我们可以回头从“HelloWorld.java”源文件中看到这样的代码:<br/>map = (MapView) findViewById(R.id.map);<br/>在Java代码中,使用findViewById方法就可以获取到当前Activity中的MapView对象,甚至其它任意的View对象。<br/>到这里为止,运行这个ArcGIS Android程序的Activity,然后根据XML定义的布局,生成MapView对象并添加一个ArcGISTiledMapServicesLayer,整个Hello World内部的过程就结束了,最后显示出来的效果就和我们在这个小节开始图 16展示的一样。<br/>
[此贴子已经被作者于2011-09-07 13:26:16编辑过]
|
|
|
|
5楼#
发布于:2011-09-07 13:27
运行这个ArcGIS Android程序已经费了半天劲儿配环境、建工程,还看了一大段植入广告,真累啊……是时候需要看点实在的东西了!现在,让我们运行“AgsSampleHelloWorld”。<br/><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image002" border="0" alt="clip_image002" src="http://www.gissky.net/Article/UploadFiles/201103/20110311174016414.gif" width="520" height="141"/><br/>图 14 调试Android程序<br/>和一般的Java程序类似,这里选择运行类型为Android Application。一个Android程序想要运行,显然还需要一个模拟器或者真实的设备,如果使用模拟器,那么可以选择刚刚新建的AVD:<br/><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image004" border="0" alt="clip_image004" src="http://www.gissky.net/Article/UploadFiles/201103/20110311174016115.gif" width="458" height="271"/><br/>图 15 选择模拟器<br/>第一次启动模拟器会花费比较多的时间,当成功启动后,你可以看到“AgsSampleHelloWorld”工程运行的结果,虽然看不到有什么特殊的东西,但是上面曾经提到的“HelloWorld Sample”是不是如愿以偿地出现在了标题位置?<br/><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image006" border="0" alt="clip_image006" src="http://www.gissky.net/Article/UploadFiles/201103/20110311174017140.gif" width="486" height="452"/><br/>图 16 在Android模拟器上运行Hello World程序<br/>另外,现在已经有一个地图显示了出来,想来这里已经有一个地图控件并加入了一个地图服务,现在,就让我们看看这个“AgsSampleHelloWorld”到底怎么显示这个地图的。<br/><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image008" border="0" alt="clip_image008" src="http://www.gissky.net/Article/UploadFiles/201103/20110311174017383.gif" width="508" height="347"/><br/>图 17 Hello World程序的调试选项<br/>从“AgsSampleHelloWorld”工程的调试选项中可以看到,在我们运行程序时,程序会运行默认的Activity,在上一节中由于时间关系,并没有对Activity展开叙述,这里再插播一小段Android Activity的内容。<br/>一个Activity就是Android程序呈现给用户的一个界面,所有和用户的交互都在Activity中发生,从某种程度上讲Android的Activity类似一个Windows程序的一个窗体。关于Activity更详细的内容,可以参考这里:http://androidappdocs-staging.appspot.com/reference/android/app/Activity.html。OK,插播结束。<br/>当我们运行“AgsSampleHelloWorld”程序时,实际运行了默认的Activity(com.esri.arcgis.android.sample.HelloWorld),这个Activity的源代码如下:<br/>package com.esri.arcgis.android.samples;<br/>import android.app.Activity;<br/>import android.os.Bundle;<br/>import com.esri.android.map.MapView;<br/>public class HelloWorld extends Activity {<br/>MapView map = null;<br/>/** Called when the activity is first created. */<br/>public void onCreate(Bundle savedInstanceState) {<br/>super.onCreate(savedInstanceState);<br/>setContentView(R.layout.main);<br/>map = (MapView) findViewById(R.id.map);<br/>Object init = getLastNonConfigurationInstance();<br/>if (init != null) {<br/>map.restoreState((String) init);<br/>}<br/>}<br/>/** Called by the system, as part of destroying an activity due to a configuration change. */<br/>public Object onRetainNonConfigurationInstance() {<br/>return map.retainState();<br/>}<br/>}<br/>当运行一个Android的程序,并第一次调用某个Activity时,首先会调用其onCreate方法(详见Activity生命周期),在onCreate方法中,先做的一件事情是下面这句代码:<br/>setContentView(R.layout.main);<br/>这个setContentView方法的作用是根据一个XML格式的布局文件,生成真正的Activity的对象。对于这个“R”我们在上面已经介绍过了,”R.layout.main”对应的资源就是“res/layout”目录下的“main.xml”这个文件定义的布局(这个布局文件有点类似Flex的MXML或Silverlight的XAML,是不是?)。让我们来看看这个“main.xml”的内容:<br/>"1.0" encoding="utf-8"?><br/>xmlns:android="http://schemas.android.com/apk/res/android"<br/>android:id="@+id/map" android:layout_width="fill_parent"<br/>android:layout_height="fill_parent"<br/>initExtent="-1.3296373526814876E7 3930962.41823043 <br/>-1.2807176545789773E7 4201243.7502468005"><br/>url="http://services.arcgisonline.com/ArcGIS/rest/services/ <br/>World_Street_Map/MapServer"/><br/><br/>这个布局的根组件就是MapView[1],MapView是基于Android中ViewGroup(可以作为其它View或ViewGroup的容器)的一个类,ArcGIS Android API中使用MapView作为地图的容器,这和很多ArcGIS API中的Map、MapControl类的作用是一样的。<br/>在MapView中,随后又添加了一个ArcGISTiledMapServiceLayer图层,其url属性对应到了某个切片地图服务的REST接口上,可以看到,这里的定义和很多ArcGIS Web上的API是一致的。<br/>MapView有个属性是android:id,这个属性值为“@+id/map”,这定义了在这个xml中的MapView最后将会被解释为一个id为“map”的MapView对象,因此,我们可以回头从“HelloWorld.java”源文件中看到这样的代码:<br/>map = (MapView) findViewById(R.id.map);<br/>在Java代码中,使用findViewById方法就可以获取到当前Activity中的MapView对象,甚至其它任意的View对象。<br/>到这里为止,运行这个ArcGIS Android程序的Activity,然后根据XML定义的布局,生成MapView对象并添加一个ArcGISTiledMapServicesLayer,整个Hello World内部的过程就结束了,最后显示出来的效果就和我们在这个小节开始图 16展示的一样。<br/>
|
|
|
|
6楼#
发布于:2011-09-07 13:27
<p>任何一个GIS应用中都少不了地图作为参考,因此,又有哪个ArcGIS Android程序能少得了MapView呢? </p><h4><a name="_Toc285744377"></a></h4><p>刚才我们一开始就在布局文件中加入了地图服务,现在我们来尝试在程序运行的时候动态操作地图服务,比如先动态添加一个地图服务。 </p><p>ArcGIS Android API中有一个“AddLayer”例子可以用来作为参考,让我们先导入这个工程(位置:Map_View/AddLayer),运行一下看个效果先: </p><p><a href="http://www.gissky.net/Article/UploadFiles/201103/20110311174028441.gif"><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image002" border="0" alt="clip_image002" src="http://www.gissky.net/Article/UploadFiles/201103/20110311174029772.gif" width="244" height="404"/></a> </p><p>图 18 例子AddLayer的运行效果 </p><p>虽然看起来效果和上面的“Hello World”没什么太大的区别,只不过这里是两个地图服务叠加在了一起。但是,如果打开这个工程的源代码,你可以发现,在布局XML中只有一个切片地图服务,而在Activity运行时加入了另外一个地图服务: </p><p><strong>public</strong> <strong>class</strong> AddLayer <strong>extends</strong> Activity { </p><p><strong>private</strong> MapView map = <strong>null</strong>; </p><p>String dynamicMapURL = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/<br/>services/Specialty/ESRI_StateCityHighway_USA/MapServer"; </p><p><strong>public</strong> <strong>void</strong> onCreate(Bundle savedInstanceState) { </p><p><strong>super</strong>.onCreate(savedInstanceState); </p><p>setContentView(R.layout.<em>main</em>); </p><p><strong>this</strong>.map = (MapView) findViewById(R.id.<em>map</em>); </p><p>ArcGISDynamicMapServiceLayer dynamicLayer = <strong>new</strong> ArcGISDynamicMapServiceLayer( </p><p><strong>this</strong>, <strong>this</strong>.dynamicMapURL); </p><p><strong>this</strong>.map.addLayer(dynamicLayer); </p><p>} </p><p>} </p><p>这段添加地图服务的代码实在太简单了,想必不用多解释什么。如果现在我想通过一个按钮来添加一个地图服务,那可以把这个例子修改一下,首先,在Activity的布局中添加一个按钮:</p><p><p class="a"><span lang="EN-US"><?</span><span lang="EN-US">xml</span><span lang="EN-US"> version<span>=</span><em><span>"1.0"</span></em> encoding<span>=</span><em><span>"utf-8"</span></em><span>?></span></span></p><p class="a"><span lang="EN-US"><</span><span lang="EN-US">RelativeLayout</span><span lang="EN-US"> xmlns:android<span>=</span><em><span>"http://schemas.android.com/apk/res/android"</span></em></span></p><p class="a"><span lang="EN-US"><span> </span>android:layout_width<span>=</span><em><span>"fill_parent"</span></em> android:layout_height<span>=</span><em><span>"fill_parent"</span></em><span>></span></span></p><p class="a"><span lang="EN-US"><span> </span></span><span lang="EN-US"></span></p><p class="a"><span lang="EN-US"><span> </span></span><span lang="EN-US"><</span><span lang="EN-US">com.esri.android.map.MapView</span><span lang="EN-US"> android:id<span>=</span><em><span>"@+id/map"</span></em></span></p><p class="a"><span lang="EN-US"><span> </span>android:layout_width<span>=</span><em><span>"fill_parent"</span></em> android:layout_height<span>=</span><em><span>"fill_parent"</span></em></span></p><p class="a"><span lang="EN-US"><span> </span>initExtent<span>=</span><em><span>"-1.3296373526814876E7 3930962.41823043 </span></em></span></p><p class="a"><em><span lang="EN-US"><span> </span>-1.2807176545789773E7 4201243.7502468005"</span></em><span lang="EN-US">></span><span lang="EN-US"></span></p><p class="a"><span lang="EN-US"><span> </span></span><span lang="EN-US"><</span><span lang="EN-US">com.esri.android.map.ags.ArcGISTiledMapServiceLayer</span><span lang="EN-US"></span></p><p class="a"><span lang="EN-US"><span> </span>android:id<span>=</span><em><span>"@+id/tiles1"</span></em></span></p><p class="a"><span lang="EN-US"><span> </span>url<span>=</span><em><span>"http://services.arcgisonline.com/ArcGIS/rest/services</span></em></span><em><span lang="EN-US"><br/></span></em><span lang="EN-US"><span> </span><em><span>/World_Street_Map/MapServer"</span></em> <span>/></span></span></p><p class="a"><span lang="EN-US"><span> </span></span><span lang="EN-US"></</span><span lang="EN-US">com.esri.android.map.MapView</span><span lang="EN-US">></span><span lang="EN-US"></span></p><p class="a"><span lang="EN-US"><span> </span></span><span lang="EN-US"></span></p><p class="a0"><span lang="EN-US"><span> </span></span><span lang="EN-US"><</span><span lang="EN-US">Button</span><span lang="EN-US"> android:id<span>=</span><em>"@+id/buttonAdd"</em> </span></p><p class="a0"><span lang="EN-US"><span> </span>android:layout_width<span>=</span><em>"fill_parent" </em>android:layout_height<span>=</span><em>"wrap_content"</em> </span></p><p class="a0"><span lang="EN-US"><span> </span>android:layout_alignParentBottom<span>=</span><em>"true"</em></span></p><p class="a0"><span lang="EN-US"><span> </span>android:text<span>=</span><em>"</em></span><em><span>添加服务</span><span lang="EN-US">"</span></em><span lang="EN-US"> <span>/></span></span></p><p class="a"><span lang="EN-US"><span> </span></span><span lang="EN-US"></span></p><p class="a"><span lang="EN-US"></</span><span lang="EN-US">RelativeLayout</span><span lang="EN-US">></span><span lang="EN-US"></span></p><p></p><div class="cnblogs_code"><pre><span style="display: none;" id="Code_Open_Text_94868"><div class="cnblogs_code"><pre><span style="display: none;" id="Code_Open_Text_877642"><div class="cnblogs_code"><p><?xml version=<em>"1.0"</em> encoding=<em>"utf-8"</em>?></p><p><RelativeLayout xmlns:android=<em>"http://schemas.android.com/apk/res/android"</em></p><p>android:layout_width=<em>"fill_parent"</em> android:layout_height=<em>"fill_parent"</em>></p><p><com.esri.android.map.MapView android:id=<em>"@+id/map"</em></p><p>android:layout_width=<em>"fill_parent"</em> android:layout_height=<em>"fill_parent"</em></p><p>initExtent=<em>"-1.3296373526814876E7 3930962.41823043 </em></p><p><em>-1.2807176545789773E7 4201243.7502468005"</em>></p><p><com.esri.android.map.ags.ArcGISTiledMapServiceLayer</p><p>android:id=<em>"@+id/tiles1"</em></p><p>url=<em>"http://services.arcgisonline.com/ArcGIS/rest/services</em><em><br/></em><em>/World_Street_Map/MapServer"</em> /></p><p></com.esri.android.map.MapView></p><p><Button android:id=<em>"@+id/buttonAdd"</em></p><p>android:layout_width=<em>"fill_parent" </em>android:layout_height=<em>"wrap_content"</em></p><p>android:layout_alignParentBottom=<em>"true"</em></p><p>android:text=<em>"</em><em>添加服务"</em> /></p><p></RelativeLayout></p></div></span></pre>
</div> </span></pre></div><p>当我点击这个按钮的时候,我希望能够在原来的切片地图服务之上再叠加一个动态服务,因此,我还需要给这个按钮添加一个点击的事件监听,一旦按钮被点击,则再加入一个地图服务。让我们看看修改过的Activity: </p><p><strong>public</strong> <strong>class</strong> AddLayer <strong>extends</strong> Activity { </p><p>String dynamicMapURL = "http://sampleserver1.arcgisonline.com/ArcGIS/rest<br/>/services/Specialty/ESRI_StateCityHighway_USA/MapServer"; </p><p><strong>private</strong> MapView map = <strong>null</strong>; </p><p><strong>private</strong> Button buttonAdd = <strong>null</strong>; </p><p><strong>public</strong> <strong>void</strong> onCreate(Bundle savedInstanceState) { </p><p><strong>super</strong>.onCreate(savedInstanceState); </p><p>setContentView(R.layout.<em>main</em>); </p><p><strong>this</strong>.map = (MapView) findViewById(R.id.<em>map</em>); </p><p><strong>this</strong>.buttonAdd = (Button)findViewById(R.id.<em>buttonAdd</em>); </p><p><strong>this</strong>.buttonAdd.setOnClickListener(<strong>new</strong> OnClickListener(){ </p><p><strong>public</strong> <strong>void</strong> onClick(View v){ </p><p>ArcGISDynamicMapServiceLayer dynamicLayer = <br/><strong>new</strong> ArcGISDynamicMapServiceLayer( </p><p>AddLayer.<strong>this</strong>, AddLayer.<strong>this</strong>.dynamicMapURL); </p><p>AddLayer.<strong>this</strong>.map.addLayer(dynamicLayer); </p><p>} </p><p>}); </p><p>} </p><p>} </p><p>这样,修改过的程序运行起来会出现一个“添加服务”的按钮,而点击这个按钮以后,程序就会在原有的切片服务之上再叠加一个动态地图服务,效果就像图 19这样。 </p><p><a href="http://www.gissky.net/Article/UploadFiles/201103/20110311174029520.gif"><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image004" border="0" alt="clip_image004" src="http://www.gissky.net/Article/UploadFiles/201103/20110311174029136.gif" width="244" height="404"/></a> <a href="http://www.gissky.net/Article/UploadFiles/201103/20110311174029309.gif"><img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;" title="clip_image006" border="0" alt="clip_image006" src="http://www.gissky.net/Article/UploadFiles/201103/20110311174029656.gif" width="244" height="404"/></a> </p><p><a name="_Ref285566891"></a>19 通过点击按钮来添加服务 </p><p>显然,再查看一下MapView的API就知道,通过其它如removeLayer、reorderLayer等方法,我们就可以对一个地图控件中的地图服务进行灵活的操作,以实现根据需要任意显示地图服务的目的。</p> |
|
|