安卓智能地图开发与实施七:在线业务图层(浏览查询)

来源:互联网 发布:淘宝订单体检不清洗 编辑:程序博客网 时间:2024/05/01 18:55

业务图层(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)索要。

0 0
原创粉丝点击