时态查询功能是通过用户设定的时间范围对要素表中存储的时间信息进行检索,从而获得在特定时态范围内的要素的操作。本实例以台风数据为例,通过设定的时间范围构造时态查询条件,执行Query查询得到要素的时态查询结果,并将结果要素变换为图形对象进行显示。
实现步骤:
1.创建Android项目
2.添加Runtime SDK依赖
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:能够实现简单的时态查询操作。