如何在 ArcGIS API 中使 android 的 Identify 任务与标准 WMS 一起工作
How to makeIdentify Task in ArcGIS API for android work with a standard WMS
我想在 ARCGIS API 中使用 Identify Task
用于 android.I 使用 this 示例并且它工作正常但是当我尝试更改 URL从另一个 WMS 获取数据时显示错误
这是我的另一个 wms
我在下面的行
中收到错误
for (int index = 0; index < results.length; index++) {
result_1 = results[index];
String displayFieldName = result_1.getDisplayFieldName();
Map<String, Object> attr = result_1.getAttributes();
for (String key : attr.keySet()) {
if (key.equalsIgnoreCase(displayFieldName)) {
resultList.add(result_1);
}
}
}
在这个 class 中,我从示例中得到
package com.esri.arcgis.android.samples.identifytask;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.esri.android.action.IdentifyResultSpinner;
import com.esri.android.action.IdentifyResultSpinnerAdapter;
import com.esri.android.map.Callout;
import com.esri.android.map.MapView;
import com.esri.android.map.ags.ArcGISTiledMapServiceLayer;
import com.esri.android.map.event.OnSingleTapListener;
import com.esri.core.geometry.Envelope;
import com.esri.core.geometry.Point;
import com.esri.core.tasks.identify.IdentifyParameters;
import com.esri.core.tasks.identify.IdentifyResult;
import com.esri.core.tasks.identify.IdentifyTask;
/**
* This sample allows the user to identify data based on single tap and view the
* results in a callout window which has a spinner in its layout. Also the user
* can select any of the results displayed and view its details. The details are
* the attribute values.
*
* The output value shown in the spinner is the display field.
*
*/
public class Identify extends Activity {
// create ArcGIS objects
MapView mMapView = null;
IdentifyParameters params = null;
// create UI objects
static ProgressDialog dialog;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Retrieve the map and initial extent from XML layout
mMapView = (MapView) findViewById(R.id.map);
// add demographic layer to the map
mMapView.addLayer(new ArcGISTiledMapServiceLayer(this.getResources()
.getString(R.string.identify_task_url_for_avghouseholdsize)));
// set Identify Parameters
params = new IdentifyParameters();
params.setTolerance(20);
params.setDPI(98);
params.setLayers(new int[] { 4 });
params.setLayerMode(IdentifyParameters.ALL_LAYERS);
// Identify on single tap of map
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
private static final long serialVersionUID = 1L;
@Override
public void onSingleTap(final float x, final float y) {
if (!mMapView.isLoaded()) {
return;
}
// Add to Identify Parameters based on tapped location
Point identifyPoint = mMapView.toMapPoint(x, y);
params.setGeometry(identifyPoint);
params.setSpatialReference(mMapView.getSpatialReference());
params.setMapHeight(mMapView.getHeight());
params.setMapWidth(mMapView.getWidth());
params.setReturnGeometry(false);
// add the area of extent to identify parameters
Envelope env = new Envelope();
mMapView.getExtent().queryEnvelope(env);
params.setMapExtent(env);
// execute the identify task off UI thread
MyIdentifyTask mTask = new MyIdentifyTask(identifyPoint);
mTask.execute(params);
}
});
}
private ViewGroup createIdentifyContent(final List<IdentifyResult> results) {
// create a new LinearLayout in application context
LinearLayout layout = new LinearLayout(this);
// view height and widthwrap content
layout.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
// default orientation
layout.setOrientation(LinearLayout.HORIZONTAL);
// Spinner to hold the results of an identify operation
IdentifyResultSpinner spinner = new IdentifyResultSpinner(this, results);
// make view clickable
spinner.setClickable(false);
spinner.canScrollHorizontally(BIND_ADJUST_WITH_ACTIVITY);
// MyIdentifyAdapter creates a bridge between spinner and it's data
MyIdentifyAdapter adapter = new MyIdentifyAdapter(this, results);
spinner.setAdapter(adapter);
spinner.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT));
layout.addView(spinner);
return layout;
}
/**
* This class allows the user to customize the string shown in the callout.
* By default its the display field name.
*
* A spinner adapter defines two different views; one that shows the data in
* the spinner itself and one that shows the data in the drop down list when
* spinner is pressed.
*
*/
public class MyIdentifyAdapter extends IdentifyResultSpinnerAdapter {
String m_show = null;
List<IdentifyResult> resultList;
int currentDataViewed = -1;
Context m_context;
public MyIdentifyAdapter(Context context, List<IdentifyResult> results) {
super(context, results);
this.resultList = results;
this.m_context = context;
}
// Get a TextView that displays identify results in the callout.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String LSP = System.getProperty("line.separator");
StringBuilder outputVal = new StringBuilder();
// Resource Object to access the Resource fields
Resources res = getResources();
// Get Name attribute from identify results
IdentifyResult curResult = this.resultList.get(position);
if (curResult.getAttributes().containsKey(
res.getString(R.string.NAME))) {
outputVal.append("Place: "
+ curResult.getAttributes()
.get(res.getString(R.string.NAME)).toString());
outputVal.append(LSP);
}
if (curResult.getAttributes().containsKey(
res.getString(R.string.ID))) {
outputVal.append("State ID: "
+ curResult.getAttributes()
.get(res.getString(R.string.ID)).toString());
outputVal.append(LSP);
}
if (curResult.getAttributes().containsKey(
res.getString(R.string.ST_ABBREV))) {
outputVal.append("Abbreviation: "
+ curResult.getAttributes()
.get(res.getString(R.string.ST_ABBREV))
.toString());
outputVal.append(LSP);
}
if (curResult.getAttributes().containsKey(
res.getString(R.string.TOTPOP_CY))) {
outputVal.append("Population: "
+ curResult.getAttributes()
.get(res.getString(R.string.TOTPOP_CY))
.toString());
outputVal.append(LSP);
}
if (curResult.getAttributes().containsKey(
res.getString(R.string.LANDAREA))) {
outputVal.append("Area: "
+ curResult.getAttributes()
.get(res.getString(R.string.LANDAREA))
.toString());
outputVal.append(LSP);
}
// Create a TextView to write identify results
TextView txtView;
txtView = new TextView(this.m_context);
txtView.setText(outputVal);
txtView.setTextColor(Color.BLACK);
txtView.setLayoutParams(new ListView.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
txtView.setGravity(Gravity.CENTER_VERTICAL);
return txtView;
}
}
@Override
protected void onPause() {
super.onPause();
mMapView.pause();
}
@Override
protected void onResume() {
super.onResume();
mMapView.unpause();
}
private class MyIdentifyTask extends
AsyncTask<IdentifyParameters, Void, IdentifyResult[]> {
IdentifyTask task = new IdentifyTask(Identify.this.getResources()
.getString(R.string.identify_task_url_for_avghouseholdsize));
IdentifyResult[] M_Result;
Point mAnchor;
MyIdentifyTask(Point anchorPoint) {
mAnchor = anchorPoint;
}
@Override
protected void onPreExecute() {
// create dialog while working off UI thread
dialog = ProgressDialog.show(Identify.this, "Identify Task",
"Identify query ...");
}
protected IdentifyResult[] doInBackground(IdentifyParameters... params) {
// check that you have the identify parameters
if (params != null && params.length > 0) {
IdentifyParameters mParams = params[0];
try {
// Run IdentifyTask with Identify Parameters
M_Result = task.execute(mParams);
} catch (Exception e) {
e.printStackTrace();
}
}
return M_Result;
}
@Override
protected void onPostExecute(IdentifyResult[] results) {
// dismiss dialog
if (dialog.isShowing()) {
dialog.dismiss();
}
ArrayList<IdentifyResult> resultList = new ArrayList<IdentifyResult>();
IdentifyResult result_1;
for (int index = 0; index < results.length; index++) {
result_1 = results[index];
String displayFieldName = result_1.getDisplayFieldName();
Map<String, Object> attr = result_1.getAttributes();
for (String key : attr.keySet()) {
if (key.equalsIgnoreCase(displayFieldName)) {
resultList.add(result_1);
}
}
}
Callout callout = mMapView.getCallout();
callout.setContent(createIdentifyContent(resultList));
callout.show(mAnchor);
}
}
}
这是错误
06-11 19:01:21.384 18989-18989/com.tehranuni.hazard.hazard E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.tehranuni.hazard.hazard, PID: 18989
java.lang.NullPointerException: Attempt to get length of null array
at com.tehranuni.hazard.hazard.gatter_geo_data$MyIdentifyTask.onPostExecute(gatter_geo_data.java:714)
at com.tehranuni.hazard.hazard.gatter_geo_data$MyIdentifyTask.onPostExecute(gatter_geo_data.java:661)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access0(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:211)
at android.app.ActivityThread.main(ActivityThread.java:5321)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:117)
由于错误说 results
是空的,我认为这是因为它没有从 WMS layer.What 获取字段所以你考虑这个错误?有什么办法可以解决它吗?
非常感谢您的帮助
IdentifyTask
仅适用于 ArcGIS Server 地图服务,不适用于 WMS。
我想在 ARCGIS API 中使用 Identify Task
用于 android.I 使用 this 示例并且它工作正常但是当我尝试更改 URL从另一个 WMS 获取数据时显示错误
这是我的另一个 wms
我在下面的行
for (int index = 0; index < results.length; index++) {
result_1 = results[index];
String displayFieldName = result_1.getDisplayFieldName();
Map<String, Object> attr = result_1.getAttributes();
for (String key : attr.keySet()) {
if (key.equalsIgnoreCase(displayFieldName)) {
resultList.add(result_1);
}
}
}
在这个 class 中,我从示例中得到
package com.esri.arcgis.android.samples.identifytask;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.esri.android.action.IdentifyResultSpinner;
import com.esri.android.action.IdentifyResultSpinnerAdapter;
import com.esri.android.map.Callout;
import com.esri.android.map.MapView;
import com.esri.android.map.ags.ArcGISTiledMapServiceLayer;
import com.esri.android.map.event.OnSingleTapListener;
import com.esri.core.geometry.Envelope;
import com.esri.core.geometry.Point;
import com.esri.core.tasks.identify.IdentifyParameters;
import com.esri.core.tasks.identify.IdentifyResult;
import com.esri.core.tasks.identify.IdentifyTask;
/**
* This sample allows the user to identify data based on single tap and view the
* results in a callout window which has a spinner in its layout. Also the user
* can select any of the results displayed and view its details. The details are
* the attribute values.
*
* The output value shown in the spinner is the display field.
*
*/
public class Identify extends Activity {
// create ArcGIS objects
MapView mMapView = null;
IdentifyParameters params = null;
// create UI objects
static ProgressDialog dialog;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Retrieve the map and initial extent from XML layout
mMapView = (MapView) findViewById(R.id.map);
// add demographic layer to the map
mMapView.addLayer(new ArcGISTiledMapServiceLayer(this.getResources()
.getString(R.string.identify_task_url_for_avghouseholdsize)));
// set Identify Parameters
params = new IdentifyParameters();
params.setTolerance(20);
params.setDPI(98);
params.setLayers(new int[] { 4 });
params.setLayerMode(IdentifyParameters.ALL_LAYERS);
// Identify on single tap of map
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
private static final long serialVersionUID = 1L;
@Override
public void onSingleTap(final float x, final float y) {
if (!mMapView.isLoaded()) {
return;
}
// Add to Identify Parameters based on tapped location
Point identifyPoint = mMapView.toMapPoint(x, y);
params.setGeometry(identifyPoint);
params.setSpatialReference(mMapView.getSpatialReference());
params.setMapHeight(mMapView.getHeight());
params.setMapWidth(mMapView.getWidth());
params.setReturnGeometry(false);
// add the area of extent to identify parameters
Envelope env = new Envelope();
mMapView.getExtent().queryEnvelope(env);
params.setMapExtent(env);
// execute the identify task off UI thread
MyIdentifyTask mTask = new MyIdentifyTask(identifyPoint);
mTask.execute(params);
}
});
}
private ViewGroup createIdentifyContent(final List<IdentifyResult> results) {
// create a new LinearLayout in application context
LinearLayout layout = new LinearLayout(this);
// view height and widthwrap content
layout.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
// default orientation
layout.setOrientation(LinearLayout.HORIZONTAL);
// Spinner to hold the results of an identify operation
IdentifyResultSpinner spinner = new IdentifyResultSpinner(this, results);
// make view clickable
spinner.setClickable(false);
spinner.canScrollHorizontally(BIND_ADJUST_WITH_ACTIVITY);
// MyIdentifyAdapter creates a bridge between spinner and it's data
MyIdentifyAdapter adapter = new MyIdentifyAdapter(this, results);
spinner.setAdapter(adapter);
spinner.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT));
layout.addView(spinner);
return layout;
}
/**
* This class allows the user to customize the string shown in the callout.
* By default its the display field name.
*
* A spinner adapter defines two different views; one that shows the data in
* the spinner itself and one that shows the data in the drop down list when
* spinner is pressed.
*
*/
public class MyIdentifyAdapter extends IdentifyResultSpinnerAdapter {
String m_show = null;
List<IdentifyResult> resultList;
int currentDataViewed = -1;
Context m_context;
public MyIdentifyAdapter(Context context, List<IdentifyResult> results) {
super(context, results);
this.resultList = results;
this.m_context = context;
}
// Get a TextView that displays identify results in the callout.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String LSP = System.getProperty("line.separator");
StringBuilder outputVal = new StringBuilder();
// Resource Object to access the Resource fields
Resources res = getResources();
// Get Name attribute from identify results
IdentifyResult curResult = this.resultList.get(position);
if (curResult.getAttributes().containsKey(
res.getString(R.string.NAME))) {
outputVal.append("Place: "
+ curResult.getAttributes()
.get(res.getString(R.string.NAME)).toString());
outputVal.append(LSP);
}
if (curResult.getAttributes().containsKey(
res.getString(R.string.ID))) {
outputVal.append("State ID: "
+ curResult.getAttributes()
.get(res.getString(R.string.ID)).toString());
outputVal.append(LSP);
}
if (curResult.getAttributes().containsKey(
res.getString(R.string.ST_ABBREV))) {
outputVal.append("Abbreviation: "
+ curResult.getAttributes()
.get(res.getString(R.string.ST_ABBREV))
.toString());
outputVal.append(LSP);
}
if (curResult.getAttributes().containsKey(
res.getString(R.string.TOTPOP_CY))) {
outputVal.append("Population: "
+ curResult.getAttributes()
.get(res.getString(R.string.TOTPOP_CY))
.toString());
outputVal.append(LSP);
}
if (curResult.getAttributes().containsKey(
res.getString(R.string.LANDAREA))) {
outputVal.append("Area: "
+ curResult.getAttributes()
.get(res.getString(R.string.LANDAREA))
.toString());
outputVal.append(LSP);
}
// Create a TextView to write identify results
TextView txtView;
txtView = new TextView(this.m_context);
txtView.setText(outputVal);
txtView.setTextColor(Color.BLACK);
txtView.setLayoutParams(new ListView.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
txtView.setGravity(Gravity.CENTER_VERTICAL);
return txtView;
}
}
@Override
protected void onPause() {
super.onPause();
mMapView.pause();
}
@Override
protected void onResume() {
super.onResume();
mMapView.unpause();
}
private class MyIdentifyTask extends
AsyncTask<IdentifyParameters, Void, IdentifyResult[]> {
IdentifyTask task = new IdentifyTask(Identify.this.getResources()
.getString(R.string.identify_task_url_for_avghouseholdsize));
IdentifyResult[] M_Result;
Point mAnchor;
MyIdentifyTask(Point anchorPoint) {
mAnchor = anchorPoint;
}
@Override
protected void onPreExecute() {
// create dialog while working off UI thread
dialog = ProgressDialog.show(Identify.this, "Identify Task",
"Identify query ...");
}
protected IdentifyResult[] doInBackground(IdentifyParameters... params) {
// check that you have the identify parameters
if (params != null && params.length > 0) {
IdentifyParameters mParams = params[0];
try {
// Run IdentifyTask with Identify Parameters
M_Result = task.execute(mParams);
} catch (Exception e) {
e.printStackTrace();
}
}
return M_Result;
}
@Override
protected void onPostExecute(IdentifyResult[] results) {
// dismiss dialog
if (dialog.isShowing()) {
dialog.dismiss();
}
ArrayList<IdentifyResult> resultList = new ArrayList<IdentifyResult>();
IdentifyResult result_1;
for (int index = 0; index < results.length; index++) {
result_1 = results[index];
String displayFieldName = result_1.getDisplayFieldName();
Map<String, Object> attr = result_1.getAttributes();
for (String key : attr.keySet()) {
if (key.equalsIgnoreCase(displayFieldName)) {
resultList.add(result_1);
}
}
}
Callout callout = mMapView.getCallout();
callout.setContent(createIdentifyContent(resultList));
callout.show(mAnchor);
}
}
}
这是错误
06-11 19:01:21.384 18989-18989/com.tehranuni.hazard.hazard E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.tehranuni.hazard.hazard, PID: 18989
java.lang.NullPointerException: Attempt to get length of null array
at com.tehranuni.hazard.hazard.gatter_geo_data$MyIdentifyTask.onPostExecute(gatter_geo_data.java:714)
at com.tehranuni.hazard.hazard.gatter_geo_data$MyIdentifyTask.onPostExecute(gatter_geo_data.java:661)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access0(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:211)
at android.app.ActivityThread.main(ActivityThread.java:5321)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:117)
由于错误说 results
是空的,我认为这是因为它没有从 WMS layer.What 获取字段所以你考虑这个错误?有什么办法可以解决它吗?
非常感谢您的帮助
IdentifyTask
仅适用于 ArcGIS Server 地图服务,不适用于 WMS。