0

我对 Java 比较陌生,并且使用适用于 Android 的 ArcGIS Runtime SDK。我正在制作一个应用程序,用户可以在其中从微调器列表中选择包裹 ID。如果用户单击“ZOOM”按钮,则地图应缩放至所选地块。这是我的代码:

    package gist8010.main;

    import java.util.ArrayList;
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.StrictMode;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.Spinner;

    import com.esri.android.map.MapView;
    import com.esri.android.map.ags.ArcGISDynamicMapServiceLayer;
    import com.esri.android.map.ags.ArcGISTiledMapServiceLayer;
    import com.esri.core.geometry.Envelope;
    import com.esri.core.geometry.Point;
    import com.esri.core.map.Feature;
    import com.esri.core.map.FeatureResult;

    import com.esri.core.tasks.query.QueryParameters;
    import com.esri.core.tasks.query.QueryTask;

    public class Spinner_WalkActivity extends Activity {

    MapView mMapView;
    Button mBtnZoom;
    ArcGISDynamicMapServiceLayer mDynamicLayer;
    Spinner mSpnParcels;
    String mMapServiceURL = "http://indy14.athena.bcit.ca:8080/"
        + "esri_rest/services/gist_8010_test_ms/MapServer";

    int mLotLayerID = 0;
    String mLotLayerURL = mMapServiceURL + "/" + mLotLayerID;
    String mLotNumColName = "PARCELS_ID";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

            /** Allow querying on main thread */
    if (android.os.Build.VERSION.SDK_INT > 9) {
                StrictMode.ThreadPolicy policy = new                                 
            StrictMode.ThreadPolicy.Builder().permitAll().build();  
                StrictMode.setThreadPolicy(policy);   
    }

            /** Create spinner and button */
    setMapView();
    this.mBtnZoom = (Button) findViewById(R.id.btnZoom);
    mBtnZoom.setOnClickListener(new OnClickListener() {

                    /** Upon click of zoom button, invoke th zoomtoFeature Method */

        public void onClick(View v) {

            zoomToFeature(v);


        }
    });
    this.mSpnParcels = (Spinner) findViewById(R.id.spnParcels);


            /** Add Layer to map */
    mDynamicLayer = new ArcGISDynamicMapServiceLayer(mMapServiceURL);
    mMapView.addLayer(mDynamicLayer);


    QueryParameters qryLotNums = new QueryParameters();
    qryLotNums.setReturnGeometry(false);
    qryLotNums.setOutFields(new String[] { mLotNumColName });
    qryLotNums.setWhere(mLotNumColName + ">0");

    com.esri.core.tasks.query.QueryTask qtask = new com.esri.core.tasks.query.QueryTask(
            mLotLayerURL);

    try {
        FeatureResult fSet = qtask.execute(qryLotNums);
        ArrayList<String> listOfLotsNums = new ArrayList<String>();
        Feature tmpFeat;

        for (Object featAsObj : fSet) {

            tmpFeat = (Feature) featAsObj;
            listOfLotsNums.add(tmpFeat.getAttributeValue(mLotNumColName)
                    .toString());
        }

        ArrayAdapter<String> adtTmp = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_dropdown_item,
                listOfLotsNums);
        mSpnParcels.setAdapter(adtTmp);

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }// of catch
}

@Override
protected void onDestroy() {
    super.onDestroy();
}

@Override
protected void onPause() {
    super.onPause();
    mMapView.pause();
}

@Override
protected void onResume() {
    super.onResume();
    mMapView.unpause();
}

// =============================================================================
// Zooms the map the the MBR of the feature selected in the spinner
// import android.view.View;
// =============================================================================
public void zoomToFeature(View v) {
    QueryParameters zoomQuery = new QueryParameters();
    zoomQuery.setReturnGeometry(true);
    zoomQuery.setOutFields(new String[] { mLotNumColName });
    zoomQuery.setWhere(mLotNumColName + "=" + mSpnParcels.getSelectedItem());


    QueryTask qtask = new QueryTask(mLotLayerURL);

    try {
        FeatureResult fset = qtask.execute(zoomQuery);
        Feature tmpFeat = (Feature) fset.iterator().next();
        Envelope envelope = new Envelope();
        envelope.queryEnvelope((Envelope) tmpFeat.getGeometry());
        getMapView().setExtent(envelope);


    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

// =============================================================================
// getter for the main map
// =============================================================================
private MapView getMapView() {
    // =============================================================================
    // if MapView is underlined in red, change the name to match your
    // MapView
    // =============================================================================
    return mMapView;
}

// =============================================================================
// setter for the main map
// =============================================================================
private void setMapView() {
    // ========================================================================
    // if mapView is underlined in red then sync class-level var names
    // if R.id.map is underlined in red ensure that you added the xml
    // fragment
    // such as "MapView Generic" to a layout
    // ========================================================================
    mMapView = (MapView) findViewById(R.id.map);
}

}

尝试调试后,我认为我的问题与 Envelope 类有关。queryEnvelope 方法接受一个 Envelope 参数。如您所见,我将 Feature tmpFeat 的几何图形从几何类型转换为 Envelope 类型。

当我在手机上运行该应用程序时,我的日志 Cat 中出现 System.Err 说:

java.lang.ClassCastException:com.esri.core.geometry.Polygon 无法转换为 com.esri.core.geometry.Envelope

我做错了吗?我想不出另一种方法将我的 Envelope 实例与我想要缩放到的要素类的几何图形联系起来。

4

1 回答 1

0

Envelop 是 com.esri.core.geometry.Geometry 的子类,反之亦然。我想这就是为什么你在做演员时失败的原因。 https://developers.arcgis.com/android/api-reference/reference/com/esri/core/geometry/Envelope.html

对于您的问题,我猜信封不需要缩放到某个功能。MapView.zoomToResolution(Point centerPt, double res) 或 zoomTo(Point centerPt, float factor) 可能是更好的选择。您可能会发现这些示例代码很有帮助: https ://developers.arcgis.com/android/sample-code/geocoding/

于 2014-07-04T07:53:09.800 回答