arcgisandroid教程,ArcGISforAndroidRuntime100基本操作
(⼀)
所以我打算重新开贴来从头学习下ArcGIS for Android Runtime100,看来学习这个事还是得踏踏实实才⾏啊。
对于ArcGIS 10.5的⼀些特性和ArcGIS for Android Runtime100的优势我已经在上⼀篇⽂章做过阐述,这⾥不再累述。
⼀、环境配置
和之前ArcGIS所需环境差不多,在project的adle⾥添加url:
allprojects {
repositories {
jcenter()
maven {
url 'esri.bintray/arcgis'}
}
}
然后在module的adle⾥添加compile:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'compile 'com.android.support:appcompat-v7:25.3.1'// compile 'com.esri.arcgis.android:arcgis-android:10.2.8'compile 'com.esri.arcgisruntime:arcgis-android:100.1.0'}
注意下⾯个是Runtime100,被我注释掉的是之前⽤的10.2.8
⼆、地图和图层(MapView和Layer)
在ArcGIS Runtime的产品⾥,地图都是通过MapView展⽰出来的。作为地图展⽰的容器,我们可以通
过MapView实现缩放、旋转、平移、获取范围、⽐例尺、分辨率等信息,以及进⾏常⽤的⼿势操作等。
在10.2⾥MapView直接继承于ViewGroup类,本⾝就是地图内容的展⽰容器,使⽤时候直接在MapView可以加载各种基础底图、业务图层和绘制图层。
但是在Runtime100⾥,增加了3D地图显⽰的功能。为了满⾜⼤多数⼈的使⽤习惯,Esri依然采⽤MapView类作为2D地图的展⽰容器,新增了SceneView类作为3D地图的展⽰容器,然后这两个类共同继承于⼀个叫GeoView的基类。
然后整个MapView的结构也进⾏了更改。不再是作为⼀个容器直接添加图层,⽽是分成了地图内容和绘制图层两部分进⾏添加:
所以在Runtime100⾥,多出来⼀个额外的类——ArcGISMap。MapView类不再直接和Layer类关联,⽽是通过了ArcGISMap类关联,将图层数据的加载、删除、管理等操作全交给ArcGISMap类来完成。
ArcGISMap类⾥可以包含⼀个底图图层和多个业务图层,底图永远位于地图最下层,⽽业务图层的顺序则是通过
MapView通过MapView.setMap(ArcGISMap)来和ArcGISMap进⾏关联。
MapView是展⽰地图的容器,⽽地图的内容则是通过Layer来表达,每个Layer包含了⼀个图层的数据。Layer按数据类型可以分⼤约⼆⼗类,这⾥不再进⾏⼀⼀阐述,就常⽤的⼏种Layer说明下。
切⽚数据图层(ArcGISTiledLayer)
切⽚数据主要⽤来做为底图的展⽰,包含渲染后的地图和地图的空间参考信息,其离线数据的格式为TPK。
Runtime100新增了⼀个ArcGISTiledLayer类来展⽰切⽚数据,说是新增,其实是将之前的ArcGISLocalTiledLayer类和ArcGISTiledMapServiceLayer类合并成⼀个,也就是说这个类既可以加载离线TPK数据,也可以加载在线切⽚数据。使⽤⽅法如下所⽰:
离线数据:
String url = SDCardRootPath(getApplicationContext()) + "/ydyzt/data/YGYX.tpk";TileCache mainTileCache = newTileCache(url);ArcGISTiledLayer layer = newArcGISTiledLayer(mainTileCache);
在线数据:
String theURLString="q/arcgis/rest/services/ChinaOnlineCommunity/MapServer";ArcGISTiledLayer mainArcGISTiledLayer= newArcGISTiledLayer(theURLString);
⽮量切⽚数据图层(ArcGISVectorTiledLayer)
⽮量切⽚数据是ArcGIS10.4⾥推出的⼀种新数据,它在传统的切⽚数据的基础上同时打包了⽮量数据,因此除了展⽰外,也可以提供查询的功能。其离线打包数据格式为VTPK。
Runtime100⾥采⽤ArcGISVectorTiledLayer类来展⽰⽮量切⽚数据,使⽤⽅法和ArcGISTiledLayer类相似:
离线数据:
String url = SDCardRootPath(getApplicationContext()) +
"/ydyzt/data/YGYX_YS.vtpk";ArcGISVectorTiledLayer layer = newArcGISVectorTiledLayer(mainTileCache);
在线数据:
String theOfflineTiledLayers="www.arcgis/home/item.html?
id=e19e9330bf08490ca8353d76b5e2e658";ArcGISVectorTiledLayer mainArcGISVectorTiledLayer= newArcGISVectorTiledLayer(theOfflineTiledLayers);
要素图层(FeatureLayer)
要素信息是ArcGIS的最基本的信息,包含了⽮量信息以及与之对应的表数据,可以⽤来进⾏展⽰、查询、分析、编辑等。其离线数据格式为geodatabase。
Runtime100⾥依然保留了ArcGIS的经典图层——FeatureLayer,每个要素图层⾥都通过⼀个FeatureTable构造来。FeatureTable可以
通过离线geodatabase获取,也可以通过在线的要素服务得到:
离线数据:
String
SDCardRootPath(getApplicationContext())+"/ydyzt/data/database";finalGeodatabase
localGdb=newGeodatabase(path);localGdb.loadAsync();localGdb.addDoneLoadingListener(newRunnable() {
@Overridepublic voidrun() {
LayerList mainLayerList = OperationalLayers();for(GeodatabaseFeatureTable gdbFeatureTable :
mainLayerList.add(dataFeatureLayer);} }});
在线数据:
String mainFeatureLayerURL =
"sampleserver6.arcgisonline/arcgis/rest/services/PoolPermits/FeatureServer/0";finalServiceFeatureTable mainServiceFeatureTable =
newServiceFeatureTable(mainFeatureLayerURL);mainServiceFeatureTable.setFeatureRequestMode(ServiceFeatureTable.FeatureReq {
@Overridepublic voidloadStatusChanged(LoadStatusChangedEvent loadStatusChangedEvent) {
NewLoadStatus() == LoadStatus.LOADED) {
ServiceFeatureTable.FeatureRequestMode mainFeatureRequestMode =
mainFeatureRequestMode.name();}
}
});
动态地图图层(ArcGISMapImageLayer和ArcGISMapImageSublayer)
动态地图图层ArcGISMapImageLayer是通过访问动态地图服务MapService获取的,⾥⾯包含的是⼀个⼦图层集合SublayerList,通过这
个⼦图层集合可以构造得到每个动态地图图层ArcGISMapImageSublayer:
String mainArcGISMapImageLayerURL =
"sampleserver6.arcgisonline/arcgis/rest/services/SampleWorldCities/MapServer";finalArcGISMapImageLayer mainMapImageLayer =
newArcGISMapImageLayer(mainArcGISMapImageLayerURL);mainMapImageLayer.addDoneLoadingListener(newRunnable() {
android学习教程
@Overridepublic voidrun() {
SublayerList mainSublayerList = Sublayers();ArcGISMapImageSublayer mainMapImageSublayer = (ArcGISMapImageSublayer) (0);}
});
移动地图数据包含的图层
移动地图数据是ArcGIS10.5新推出的⼀种数据格式,其特点是将所有地图和数据资源打包,并且将数据存储于压缩的Mobile
GDB中,因此可以进⾏展⽰、查询、分析等所有操作。相⽐TPK数据来数据更⼩,⽽对于geodatabase数据⽽⾔,其加载图层效率上有明
显的优势。因为其获取图层的⽅式⽐较特殊,所以单独拿出来说明下。
MMPK因为是将所有地图和数据资源打包,因此其直接获取到的是ArcGISMap,我们要获取要素图层,需要先获取到ArcGISMap以后,
再从其中获取FeatureLayer。
String mainMMPKPath =
newMobileMapPackage(mainMMPKPath);mainMobileMapPackage.loadAsync();mainMobileMapPackage.addDoneLoadingListener(ne {
@Overridepublic voidrun() {
LoadStatus mainLoadStatus = LoadStatus();if(mainLoadStatus == LoadStatus.LOADED) {
List mainArcGISMapL = Maps();ArcGISMap mainArcGISMapMMPK =
<(0);mMapView.setMap(mainArcGISMapMMPK);} }});
除此以外,图层还有三维地图图层(ArcGISSceneLayer),基于微软必应地图的图层(BingMapsLayer),要素集合图层(FeatureCollectionLayer)等等,就不⼀⼀介绍了。
三、图层的加载和切换
我们获取到了图层信息以后,需要将这些信息加载在地图上。在ArcGIS 10.2⾥,我们这需要执⾏MapView.addLayer(Layer)⽅法即可在
地图上加载图层。
⽽之前我们可以看到,在Runtime100⾥,MapView是通过ArcGISMap类来完成图层的管理,所以⽅法也就变了。
⾸先是底图的加载。之前我们也介绍了,ArcGISMap类是将底图和业务图层分开的,对于底图,ArcGISMap⾥⽤了Baemap类来进⾏管
理。取⼀个完整的例⼦就是:
mMapView= (MapView) findViewById(R.id.mapview);arcGISMap= newArcGISMap();
String url = SDCardRootPath(getApplicationContext()) + "/ydyzt/data/YGYX.tpk";TileCache mainTileCache = newTileCache(url);ArcGISTiledLayer layer = newArcGISTiledLayer(mainTileCache);Basemap basemap =
newBasemap(layer);arcGISMap.setBasemap(basemap);mMapView.setMap(arcGISMap);
⽽如果我们要切换底图时候,仅需要给ArcGISMap类重新赋值⼀个底图即可。
button.setOnClickListener(newView.OnClickListener() {
@Overridepublic voidonClick(View v) {
Basemap basemap = newBasemap(layer);arcGISMap.setBasemap(basemap);mMapView.setMap(arcGISMap);}
});
对于业务图层的加载,上⼀章我们也说了,ArcGISMap类管理业务图层是通过⼀个包含当前加载图层的集合类LayerList来进⾏管理的,加
载时候的⽅法如下所⽰:
String
SDCardRootPath(getApplicationContext())+"/ydyzt/data/database";finalGeodatabase
localGdb=newGeodatabase(path);localGdb.loadAsync();localGdb.addDoneLoadingListener(newRunnable() {
@Overridepublic voidrun() {
LayerList mainLayerList = OperationalLayers();for(GeodatabaseFeatureTable gdbFeatureTable :
FeatureLayer dataFeatureLayer = newFeatureLayer(gdbFeatureTable);mainLayerList.add(dataFeatureLayer);}
}
});

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。