《ArcGIS Runtime SDK for Android学习笔记》-9、ArcGIS for Android 常用数据加载方法

wshunli
2017-03-02 / 7 评论 / 476 阅读 / 正在检测是否收录...

ArcGIS for Android 支持的空间数据类型

ArcGIS Runtime SDK for Android支持的空间数据源有多种,主要分为3大类:ArcGIS在线数据源、ArcGIS离线数据源(自10.2版本起),以及第三方数据源,详细的类别支持请见下表:

数据源类型 数据源名称
ArcGIS在线数据源 切片地图服务(ArcGISTiledMapServiceLayer)、动态地图服务(ArcGISDynamicMapServiceLayer)、影像服务(ArcGISImageServiceLayer)、要素服务(ArcGISFeatureLayer)
ArcGIS离线数据源 紧凑型切片(ArcGISLocalTiledLayer)、tpk切片包(ArcGISLocalTiledLayer)、.geodatabase数据文件(GeodatabaseFeature)、.shp文件(ShapefileFeatureTable)、地名地址库(Locator)、网络数据集(Network Dataset)
第三方数据源 Bing地图(BingMapsLayer)、Open Street map(OpenStreetMapLayer)、OGC图层(KMLLayer、WMSLayer)、第三方自定义扩展图层

ArcGIS for Android 常用数据加载方法

ArcGISTiledMapServiceLayer

ArcGISTiledMapServiceLayer图层对应ArcGIS for Server服务中的切片服务,由于切片都是事先做好的,ArcGISTiledMapServiceLayer不能对图层中的数据进行更改,除非更新服务缓存,在ArcGIS Runtime SDK for Android中,也不允许对此类型的数据进行查询,通常用做底图使用。同时,因为加载的是缓存切片,这个类型的图层是ArcGIS Runtime SDK for Android中相应请求最快的图层之一,它采用多个线程,通常是使用单独线程来处理请求和绘制图片,并且异步处理。用法如下:

map = (MapView)findViewById(R.id.map);
// Add tiled layer to MapView
ArcGISTiledMapServiceLayer tileLayer = new ArcGISTiledMapServiceLayer("http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer");
map.addLayer(tileLayer);

ArcGISDynamicMapServiceLayer

ArcGISDynamicMapServiceLayer图层对应ArcGIS for Server服务中的动态服务,动态地图服务的地图数据是按照移动设备范围读取的。 ArcGISDynamicMapServiceLayer图层通常包含多个图层,这些图层由server根据请求来渲染并以raster image形式返回,并且返回的raster并不包含feature的额外信息。它的功能特点是更新非常方便,并能及时呈现给用户,同时,图层的可视性和空间参考可以改变,可以给图层添加单独的layer definition,ArcGIS for Server为每个image动态投影,而地图的空间参考是由第一个加载的图层决定。

它的性能特点是,它的渲染时间取决于请求数据的数量和复杂度,因此一般都比tiled map server要慢,因此,它适合数据经常发生改变、或者需要针对不同的用户呈现不同的数据,且要素信息(如attributes,geometry,symbol等)不需要的情况。

它的用法与ArcGISTiledMapServiceLayer图层相同,示例代码如下:

map = (MapView)findViewById(R.id.map);
// Add DynamicMapServiceLayer to MapView
ArcGISDynamicMapServiceLayer agsDynlyr = new ArcGISDynamicMapServiceLayer("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Population_World/MapServer");
map.addLayer(agsDynlyr);

在国内的话可以使用
智图 提供的全国基础地图服务
服务地址:
http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer

ArcGISImageServiceLayer

ArcGISImageServiceLayer图层对应ArcGIS for Server服务中的影像服务,它为移动端使用影像数据提供了一种途径,通过这种方式调用的影像数据通常可以用来作为底图。调用影像服务也非常简单,同调用上述服务一样,示例代码如下:

map = (MapView)findViewById(R.id.map);
map.addLayer(new ArcGISImageServiceLayer("http://myserver/arcgis/rest/services/MyImage/ImageServer",null));

ArcGISFeatureLayer

ArcGISFeatureLayer图层对应ArcGIS for Server服务中的Feature Service,该图层可以是空间图层,也可以是非空间的表,该图层包含了要素最丰富的信息,其中的每个要素都能被空间查询和SQL查询。从Feature Service中请求要素时以JSON格式返回,每个要素都单独渲染,因此与其它图层类型相比,要素图层具有最丰富的功能。

只有Feature Service(要素服务)才可以具备在线数据编辑功能,因此,如果想要对某个数据进行在线编辑或同步,需要将其发布成Feature Service,并在移动端新建一个ArcGISFeatureLayer图层以加载该服务。该图层有一些设定,这些设定能影响图层的性能,包括请求时间,返回大小、处理和响应时间等(设置需要在图层initialized完成之后进行)。

ArcGISFeatureLayer图层继承自GraphicsLayer,因此也具有该图层的所有操作。调用该图层的示例代码如下:

String url =
"https://servicesbeta.esri.com/ArcGIS/rest/services/SanJuan/TrailConditions/FeatureServer/0";
map = (MapView)findViewById(R.id.map);
//按照快照方式加载该图层
map.addLayer(new ArcGISFeatureLayer(url,MODE.ONDEMAND));
setContentView (map);

加载tpk和紧凑型切片

ArcGISLocalTiledLayer是ArcGIS Runtime SDK for Android中专门用来添加离线数据包(底图)的图层,该图层目前支持两种格式的离线数据:一个是紧凑型切片,另一个就是tpk。使用起来也很简单,实例化该类的一个对象,并在构造函数中输入数据的路径即可,代码示例如下:

map = (MapView)findViewById(R.id.map);
// Add Local tiled layer to MapView
ArcGISLocalTiledLayer agsLocaltiledlyr = new ArcGISLocalTiledLayer("file:///mnt/sdcard/ArcGIS/sample/HelloWorld/Layers");
map.addLayer(agsLocaltiledlyr);

加载影像数

ArcGIS Runtime SDK for Android 从10.2.4开始支持直接读取本地影像数据,数据类型包含:ASRP/USRP、CIB1,5,10、DTED0, 1, 2、GeoPackage、GeoTIFF、HFA、HRE、IMG、JPEG、JPEG2000、NITF、PNG、RPF、SRTM1, FileRasterSource是加载本地影像数据文件类,地图视图中以RasterLayer作为图层对象展示出来。代码如下:

String rasterPath = Environment.getExternalStorageDirectory().getPath() + "/raster/test.tif";
FileRasterSource rasterSource;
try {  
 rasterSource = new FileRasterSource(rasterPath);  
} catch (IllegalArgumentException ie) {
  Log.d(TAG, "null or empty path");
} catch (FileNotFoundException fe) {
  Log.d(TAG, "raster file doesn't exist");
} catch (RuntimeException re) {
  Log.d(TAG, "raster file can't be opened");
}
RasterLayer rasterLayer = new RasterLayer(rasterSource);
mMapView.addLayer(rasterLayer);

加载离线的 .geodatabase 本地文件

.geodatabase 文件是ArcGIS 10.2中专为业务数据的离线而推出的一种数据格式,本质上,它仍然是SQLite数据库的封装,在SQLite数据模型的基础上,Esri计划逐步实现桌面端Geodatabase数据模型的存储,不仅包括Feature Class,还包括镶嵌数据集、网络数据集等。目前,主要实现了Feature Class的存储。

即,在ArcGIS 10.2.2中,要使用完全的离线功能,可以使用ArcGIS for Desktop提供的GP工具来将需要编辑和离线的业务数据导出到.geodatabase中,也可以直接从ArcGIS for Server上的要素服务中下载数据,并在移动端存储为.geodatabase,从而实现完全离线的移动应用。

ArcGIS Runtime SDK for Android中也提供了具体的Geodatabase类和FeatureLayer图层来加载.geodatabase文件,常用的类包括Geodatabase、GeodatabaseFeatureTable、GeodatabaseFeature、GeodatabaseFeatureServiceTable等,分别用来打开geodatabase数据文件、获取要素图层、获取图层中的具体要素,以及获取在线的要素服务。具体来讲,加载.geodatabase文件的步骤有如下几步:

  1. 实例化一个Geodatabase对象,这个类有两个构造函数,都需要指定本地数据库的存储路径;
  2. 创建一个GeodatabaseFeatureTable对象实例,用来获取需要的图层;
  3. 创建一个FeatureLayer来存储获取的图层,并将获取的图层加载到地图中;
  4. 调用dispose()方式释放资源。

示例代码如下:

//实例化geodatabase对象,并指定文件目录
gdb = new Geodatabase("{/path/to/geodatabase}");
//实例化gdbfeaturetable对象,并获取第一个图层
gdbfeaturetable = gdb.getGeodatabaseFeatureTableByLayerId(0);
//创建一个FeatureLayer来存储获取的图层,并将获取的图层加载到地图中
featurelayer = new FeatureLayer(gdbfeaturetable);
mMapView.removeAll();
mMapView.addLayer(featurelayer);    
//调用dispose()方式释放资源
gdb.dispose();

加载ShapeFile文件

ShapeFile文件:ArcGIS平台中最常见的数据格式,包含属性信息、投影信息等。新版本的SDK(10.2.4开始)可以直接加载.shp文件进行数据的展示、查询。代码加载如下:

ShapefileFeatureTable shpTable = new ShapefileFeatureTable(shpUrl);
FeatureLayer fl = new FeatureLayer(shpTable);
fl.setRenderer(new SimpleRenderer(new SimpleMarkerSymbol(
        Color.BLACK, 2, STYLE.CIRCLE)));
mapView.addLayer(fl);

参考资料
1、《ArcGIS Runtime SDK for Android开发笔记》——(10)、ArcGIS Runtime SDK支持的空间数据类型 - gis-luq - 博客园 http://www.cnblogs.com/gis-luq/p/4941737.html
2、《ArcGIS Runtime SDK for Android开发笔记》——(11)、ArcGIS Runtime SDK常见空间数据加载 - gis-luq - 博客园 http://www.cnblogs.com/gis-luq/p/5062715.html

0

评论 (7)

取消
  1. 头像
    X
    Windows 10 · Google Chrome

    FileRasterSource这个类已经不存在了,现在如何加载离线png那

    回复
    1. 头像
      wshunli 作者
      Windows 10 · Google Chrome
      @ X

      最新版 100.12.0 可以使用 Raster 类:

      Raster raster = new Raster("absolute-file-path-of-raster");
      RasterLayer rasterLayer = new RasterLayer(raster);

      回复
      1. 头像
        X
        Windows 10 · Google Chrome
        @ wshunli

        Raster raster = new Raster("file:///data/data/map/gansu/{level}/{col}/{row}.png");

        // create a raster layer
        RasterLayer rasterLayer = new RasterLayer(raster);
        ArcGISMap map = new ArcGISMap(new Basemap(rasterLayer));
        mapView.setMap(map);
        rasterLayer.addDoneLoadingListener(new Runnable() {
        @Override
        public void run() {

        }
        });
        不知您能否帮我看看,我的瓦片图为什么无法加载出来那?万分感谢

        回复
        1. 头像
          wshunli 作者
          Windows 10 · Google Chrome
          @ X

          看着你这个是瓦片数据,可以考虑生成 tpk 包

          回复
          1. 头像
            X
            Windows 10 · Google Chrome
            @ wshunli

            工作要求只能是这种格式的文件,之前我用mapbox可以用"file:///data/data/map/gansu/{level}/{col}/{row}.png"路径直接读取地图,arcGis我还没找到方法。不知您了解吗?谢谢

            回复
            1. 头像
              wshunli 作者
              Windows 10 · Google Chrome
              @ X

              不好意思,最近不做相关的项目了,不太了解

              回复
              1. 头像
                X
                Windows 10 · Google Chrome
                @ wshunli

                好的感谢,发现你的博客真好,我要多在上面学习表情

                回复