安卓智能地图开发与实施七:在线业务图层(浏览查询) - ArcGIS Runtime SDK for Android(Version 100.0.0)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/allenlu2008/article/details/71440288

业务图层(OperationalLayers)

业务图层(OperationalLayers)旨在可视化变化频繁的数据,可以通过ArcGISMapImageLayer加载现有的可视化成果,可以通过FeatureLayer来可视化要素,甚至查询、编辑。

这里写图片描述

对业务图层(OperationalLayers)的加载,针对移动端的处理方式分为在线和离线方式。在线方式主要通过ArcGIS Server 、ArcGIS Online、Portal for ArcGIS发布的地图服务(Map Service、 Feature Service)进行调用。离线方式主要通过ArcGIS Desktop(Geodatabase文件)、ArcGIS Pro(MMPK文件)生产的离线数据包进行访问。

在线业务图层 - 要素服务(Feature Service)

这里写图片描述

在线FeatureLayer通过ServiceFeatureTable来解析Feature Service。添加FeatureLayer,理论上或者说代码层面是可以不需要基础底图(Basemap),展示的结果就只是业务图层。但是ArcGISMap对象是需要新建出来的。例如:

ArcGISMap mainArcGISMap =new ArcGISMap();
mainMapView.setMap(mainArcGISMap);

在线FeatureLayer也可以通过PortalItem来承载,当然这个PortalItem必须包含Feature Service。

这里写图片描述

package hymn.esrichina.displayamapusingfeaturelayer;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.esri.arcgisruntime.data.ServiceFeatureTable;
import com.esri.arcgisruntime.geometry.Envelope;
import com.esri.arcgisruntime.geometry.SpatialReferences;
import com.esri.arcgisruntime.layers.FeatureLayer;
import com.esri.arcgisruntime.loadable.LoadStatus;
import com.esri.arcgisruntime.loadable.LoadStatusChangedEvent;
import com.esri.arcgisruntime.loadable.LoadStatusChangedListener;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.LayerList;
import com.esri.arcgisruntime.mapping.MobileMapPackage;
import com.esri.arcgisruntime.mapping.Viewpoint;
import com.esri.arcgisruntime.mapping.view.MapView;

import java.util.List;

public class MainActivity extends AppCompatActivity {
    private MapView mainMapView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            String mainFeatureLayerURL =
                    "http://sampleserver6.arcgisonline.com/arcgis/rest/services/PoolPermits/FeatureServer/0";
            mainMapView = (MapView) findViewById(R.id.mainMapView);
            final ServiceFeatureTable mainServiceFeatureTable = new ServiceFeatureTable(mainFeatureLayerURL);
            mainServiceFeatureTable.setFeatureRequestMode(ServiceFeatureTable.FeatureRequestMode.ON_INTERACTION_NO_CACHE);
            mainServiceFeatureTable.addLoadStatusChangedListener(new LoadStatusChangedListener() {
                @Override
                public void loadStatusChanged(LoadStatusChangedEvent loadStatusChangedEvent) {
                    if (loadStatusChangedEvent.getNewLoadStatus() == LoadStatus.LOADED) {
                        ServiceFeatureTable.FeatureRequestMode mainFeatureRequestMode =
                                mainServiceFeatureTable.getFeatureRequestMode();
                        String mainFeatureRequestModeName = mainFeatureRequestMode.name();
                    }
                }
            });
            FeatureLayer mainFeatureLayer = new FeatureLayer(mainServiceFeatureTable);
            ArcGISMap mainArcGISMap = new ArcGISMap();
            mainMapView.setMap(mainArcGISMap);
            mainArcGISMap.getOperationalLayers().add(mainFeatureLayer);
            mainArcGISMap.setInitialViewpoint(
                    new Viewpoint(
                            new Envelope(
                                    -1.30758164047166E7,
                                    4014771.46954516,
                                    -1.30730056797177E7,
                                    4016869.78617381,
                                    SpatialReferences.getWebMercator())));

        } catch (Exception e) {

        }
    }
}

ServiceFeatureTable加载完成之前,其图层中要素请求模式(getFeatureRequestMode())为UNDEFINED(未定义);加载完成后其图层中要素请求模式为ON_INTERACTION_CACHE(响应地图交互缓存),随着地图的操作(缩放、平移、旋转)自动缓存到本端。还可以通过设置BufferFactor属性,来预加载比当前地图范围更大的缓存。

这里写图片描述

图层中要素请求模式(FeatureRequestMode)

  • MANUAL_CACHE (手动缓存)
  • ON_INTERACTION_CACHE(响应地图交互缓存)
  • ON_INTERACTION_NO_CACHE(响应地图交互实时请求)
  • UNDEFINED(未定义)

对于一些多人协同编辑的业务,要素时时刻刻都有可能变化,建议设置图层中要素请求模式为ON_INTERACTION_NO_CACHE(响应地图交互实时请求),这样一来地图的每次交互都会从服务端请求最新的要素来显示。
对于设计数据量非常大的业务,实时加载在地图操作时已经影响到性能,建议设置图层中要素请求模式为MANUAL_CACHE (手动缓存),在需要显示图层要素时,再调用populateFromService方法来手动加载显示。

在线业务图层 - 动态地图服务(Map Service)

这里写图片描述

动态地图服务(Map Service)通过ArcGISMapImageLayer进行承载。直接给予动态地图服务地址(通过ArcGIS Server发布)即可。也可以通过PortalItem进行加载,PortalItem必须包含Map Service。

就ArcGISMapImageLayer自身而言,也可以加入基础底图(Basemap)中,当动态的底图使用。

这里写图片描述

ArcGISMapImageLayer包含着诸多自图层,通过SublayerList装载,每一个自图层为ArcGISMapImageSublayer对象。

package hymn.esrichina.displayamapusingarcgismapimagelayer;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.esri.arcgisruntime.layers.ArcGISMapImageLayer;
import com.esri.arcgisruntime.layers.ArcGISMapImageSublayer;
import com.esri.arcgisruntime.layers.SublayerList;
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 mainMapView;
    private ArcGISMapImageLayer mainMapImageLayer;
    private SublayerList mainSublayerList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            String mainArcGISMapImageLayerURL =
                    "http://sampleserver6.arcgisonline.com/arcgis/rest/services/SampleWorldCities/MapServer";
            mainMapView = (MapView) findViewById(R.id.mainMapView);
            ArcGISMap mainArcGISMap = new ArcGISMap(Basemap.Type.TOPOGRAPHIC, 48.354406, -99.998267, 2);
            mainMapImageLayer = new ArcGISMapImageLayer(mainArcGISMapImageLayerURL);
            mainMapImageLayer.addDoneLoadingListener(new Runnable() {
                @Override
                public void run() {
                    mainSublayerList = mainMapImageLayer.getSublayers();
                    ArcGISMapImageSublayer mainMapImageSublayer = (ArcGISMapImageSublayer) mainSublayerList.get(0);
                }
            });
            mainMapImageLayer.setOpacity(0.5f);
            mainArcGISMap.getOperationalLayers().add(mainMapImageLayer);
            mainMapView.setMap(mainArcGISMap);
        } catch (Exception e) {

        }
    }
}

结尾

源程序包含:

DisplayAMapUsingArcGISMapImageLayer
DisplayAMapUsingFeatureLayer
请自行下载:
链接:http://pan.baidu.com/s/1sli5MhR 密码:8gh8
若失效,可发邮件给韩源萌(polyline@126.com)索要。

展开阅读全文

没有更多推荐了,返回首页