ArcGIS Runtime SDK for Android 入门(24):时态数据查询

       时态查询功能是通过用户设定的时间范围对要素表中存储的时间信息进行检索,从而获得在特定时态范围内的要素的操作。本实例以台风数据为例,通过设定的时间范围构造时态查询条件,执行Query查询得到要素的时态查询结果,并将结果要素变换为图形对象进行显示。

实现步骤:

1.创建Android项目   

2.添加Runtime SDK依赖   

    前两步本文省略,初学者可参照 ArcGIS Runtime SDK for Android 入门(1):第一个地图应用程序(二维)

3.添加权限及OpenGL ES支持

    在AndroidManifest.xml中添加:

    <!--联网权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--OpenGL ES支持 -->
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

4.设置界面布局

    布局XML代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">
        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:id="@+id/btnSetStartDate"
            android:text="设定起始日期"/>
        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:id="@+id/btnSetEndDate"
            android:text="设定结束日期"/>

    </LinearLayout>

    <com.esri.arcgisruntime.mapping.view.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="10"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btnQuery"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="QUERY" />

        <Button
            android:id="@+id/btnClearGraphics"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="清空查询结果"/>
    </LinearLayout>

</LinearLayout>

5.编写代码

思路:

(1)加载在线要素服务数据。

(2)通过设置两个按钮,弹出日期选择框,设定开始与终止日期。

(3)根据设置的开始与终止日期,执行时态查询。

步骤:

(1)变量准备:

    private ArcGISMap mMap;                                     //地图对象
    private MapView mMapView;                                   //MapView组件对象
    private ServiceFeatureTable mServiceFeatureTable;           //要素表服务对象
    private FeatureLayer mFeaturelayer;                         //要素图层对象
    private DatePickerDialog mStartDateDialog;                  //设置起始日期的日期选择框
    private DatePickerDialog mEndDateDialog;                    //设置结束日期的日期选择框
    private GregorianCalendar mStartDateCalendar;               //起始日期对象
    private GregorianCalendar mEndDateCalendar;                 //结束日期对象

(2)onCreate方法:

    //Activity初始化时触发事件执行本函数
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获得Layout中的MapView组件对象
        mMapView = (MapView)findViewById(R.id.mapView);
        //以海洋图为底图创建地图对象
        mMap = new ArcGISMap(Basemap.createOceans());
        //通过URL创建台风要素服务的要素表
        mServiceFeatureTable = new ServiceFeatureTable("https://sampleserver6.arcgisonline.com/arcgis/rest/services/Hurricanes/MapServer/0");
        //使用ServiceFeatureTable对象创建Featurelayer对象
        mFeaturelayer = new FeatureLayer(mServiceFeatureTable);
        //将图层添加到地图中
        mMap.getOperationalLayers().add(mFeaturelayer);
        //设置地图在MapView中显示
        mMapView.setMap(mMap);
        //初始化日期选择框
        initDatePickerDialog();
        //设置各个按钮的点击监听事件
        findViewById(R.id.btnSetStartDate).setOnClickListener(this);
        findViewById(R.id.btnSetEndDate).setOnClickListener(this);
        findViewById(R.id.btnQuery).setOnClickListener(this);
        findViewById(R.id.btnClearGraphics).setOnClickListener(this);
    }

(3)日期选择框初始化方法:

    //初始化日期选择框
    private void initDatePickerDialog(){
        //创建时间选择框对象并设置监听
        mStartDateDialog = new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { ;
                mStartDateCalendar=new GregorianCalendar(year, monthOfYear, dayOfMonth);
            }
        }, 2000, 7, 1);
        mEndDateDialog = new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { ;
                mEndDateCalendar=new GregorianCalendar(year, monthOfYear, dayOfMonth);
            }
        },2000,7,1);
        //设置日期选择框的时间范围
        Calendar startCalendar = Calendar.getInstance();
        Calendar endCalendar = Calendar.getInstance();
        startCalendar.set(2000,7,1);
        endCalendar.set(2000,9,31);
        mStartDateDialog.getDatePicker().setMinDate(startCalendar.getTime().getTime());
        mStartDateDialog.getDatePicker().setMaxDate(endCalendar.getTime().getTime());
        mEndDateDialog.getDatePicker().setMinDate(startCalendar.getTime().getTime());
        mEndDateDialog.getDatePicker().setMaxDate(endCalendar.getTime().getTime());
    }

(4)执行时态查询的核心方法:

    //执行Query时态查询操作,并对查询结果进行展示
    private void queryByTimeExtent(){
        //创建查询参数对象
        QueryParameters queryParameters = new QueryParameters();
        //设置where子句为查询所有要素
        queryParameters.setWhereClause("1=1");
        // 创建时间范围对象并设置起始与结束时间
        TimeExtent timeExtent = new TimeExtent(mStartDateCalendar,mEndDateCalendar);
        //设置查询参数的时间范围
        queryParameters.setTimeExtent(timeExtent);
        //进行要素查询
        final ListenableFuture<FeatureQueryResult> future = mServiceFeatureTable.queryFeaturesAsync(queryParameters);
        //当异步查询结果返回时,使用addDoneListener触发进行接收
        future.addDoneListener(new Runnable() {
            @Override
            public void run() {
                try {
                    //调用get方法获取查询结果
                    FeatureQueryResult result = future.get();
                    //创建用于显示查询结果的GraphicOverlay对象
                    GraphicsOverlay graphicsOverlay=new GraphicsOverlay();
                    //创建要素迭代器实现对查询结果的遍历
                    Iterator<Feature> iterator=result.iterator();
                    //检查并遍历查询结果
                    while(iterator.hasNext()) {
                        //对迭代器中的要素进行遍历
                        Feature feature =iterator.next();
                        //获取结果要素的几何形状对象
                        Geometry geometry=feature.getGeometry();
                        //创建用于显示查询结果的Symbol符号
                        SimpleMarkerSymbol markerSymbol=new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 8);
                        //创建用于显示查询结果的Graphic图形,并加入至GraphicOverlay
                        Graphic graphic=new Graphic(geometry,markerSymbol);
                        graphicsOverlay.getGraphics().add(graphic);
                    }
                    //显示查询结果
                    mMapView.getGraphicsOverlays().clear();
                    mMapView.getGraphicsOverlays().add(graphicsOverlay);
                    Envelope envelope = graphicsOverlay.getExtent();
                    mMapView.setViewpointGeometryAsync(envelope, 100);
                } catch (Exception e) {
                    Toast.makeText(MainActivity.this, "查询失败"  + ". Error=" + e.getMessage(),Toast.LENGTH_SHORT).show();
                    Log.e(getResources().getString(R.string.app_name),"Feature search failed " + ". Error=" + e.getMessage());
                }
            }
        });
    }

(5)点击事件监听:

    //点击事件监听
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btnSetStartDate:
                //当点击“设置起始日期”按钮时,弹出起始日期选择框
                mStartDateDialog.show();
                break;
            case R.id.btnSetEndDate:
                //当点击“设置结束日期”按钮时,弹出结束日期选择框
                mEndDateDialog.show();
                break;
            case R.id.btnQuery:
                //当点击“QUERY”按钮时,执行时态查询
                queryByTimeExtent();
                break;
            case R.id.btnClearGraphics:
                //当点击“清空查询结果”按钮时,删除MapView中的图形
                mMapView.getGraphicsOverlays().clear();
                break;
        }
    }

6.运行App:能够实现简单的时态查询操作。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值