无法在地图 ArcGIS 上显示路线 Android

Cannot display route on map ArcGIS Android

我正在开发一个计算两点之间路线的应用程序。下面给出的代码可以计算两点之间的路线。但我无法以图形方式在地图上显示它。

代码:

private final String routeTaskURL = "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Network/USA/NAServer/Route";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mMapView = (MapView) findViewById(R.id.map);
    addGraphicLayers();
    mMapView.enableWrapAround(true);
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                UserCredentials userCredentials = new UserCredentials();
                userCredentials.setUserToken(token, clientID);
                RouteTask routeTask = RouteTask.createOnlineRouteTask(routeTaskURL, userCredentials);
                RouteParameters routeParameters = routeTask.retrieveDefaultRouteTaskParameters();
                NAFeaturesAsFeature naFeatures = new NAFeaturesAsFeature();

                Point startPoint = new Point(-119.866896, 36.793653);
                Point stopPoint = new Point(-119.853345, 36.795488);

                StopGraphic startPnt = new StopGraphic(startPoint);
                StopGraphic stopPnt = new StopGraphic(stopPoint);

                naFeatures.setFeatures(new Graphic[] {startPnt, stopPnt});
                routeParameters.setStops(naFeatures);

                RouteResult mResults = routeTask.solve(routeParameters);
                List<Route> routes = mResults.getRoutes();
                System.out.println(mResults.getRoutes());

                Route mRoute = routes.get(0);
                Geometry geometry = mRoute.getRouteGraphic().getGeometry();
                Graphic symbolGraphic = new Graphic(geometry, new SimpleLineSymbol(Color.BLUE, 10));
                mLocationLayer.addGraphic(symbolGraphic);
                System.out.println(mResults.getStops());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
}

void addGraphicLayers() {
    // Add location layer
    if (mLocationLayer == null) {
        mLocationLayer = new GraphicsLayer();
    }
    mMapView.addLayer(mLocationLayer);

    // Add the route graphic layer
    if (mRouteLayer == null) {
        mRouteLayer = new GraphicsLayer();
    }
    mMapView.addLayer(mRouteLayer);
}

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

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

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    // Get the basemap switching menu items.
    mStreetsMenuItem = menu.getItem(0);
    mTopoMenuItem = menu.getItem(1);
    mGrayMenuItem = menu.getItem(2);
    mOceansMenuItem = menu.getItem(3);

    // Also set the topo basemap menu item to be checked, as this is the default.
    mTopoMenuItem.setChecked(true);

    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle menu item selection.
    switch (item.getItemId()) {
        case R.id.World_Street_Map:
            mMapView.setMapOptions(mStreetsBasemap);
            mStreetsMenuItem.setChecked(true);
            return true;
        case R.id.World_Topo:
            mMapView.setMapOptions(mTopoBasemap);
            mTopoMenuItem.setChecked(true);
            return true;
        case R.id.Gray:
            mMapView.setMapOptions(mGrayBasemap);
            mGrayMenuItem.setChecked(true);
            return true;
        case R.id.Ocean_Basemap:
            mMapView.setMapOptions(mOceansBasemap);
            mOceansMenuItem.setChecked(true);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

注意:mLocationLayer和mRouteLayer都是第一步声明的

您需要进行两项更改。 首先,当您添加图形图层时,底图图层可能已添加,也可能未添加。 (剧透警告:它没有。它是异步的,所以从技术上讲它可以无论哪种方式,但显然内存中图形图层比基于 Web 服务的图层创建更快。) 最后添加的图层在顶部,因此您的底图图层可能 (剧透alert: will) 位于您的图形层之上并隐藏它们。为确保您的图形图层在底图之后添加,添加一个 OnStatusChangedListener:

mMapView = (MapView) findViewById(R.id.map);
mMapView.setOnStatusChangedListener(new OnStatusChangedListener() {
    @Override
    public void onStatusChanged(Object o, STATUS status) {
        if (STATUS.INITIALIZED.equals(status)) {
            addGraphicLayers();
            mMapView.enableWrapAround(true);
            new Thread(new Runnable() {
                //Your thread code as you wrote it
            }).start();
        }
    }
});

其次,路线几何与地图具有不同的空间参考。 route service's default output spatial reference is WGS 1984, a.k.a. 4326, a.k.a. latitude and longitude. But the ArcGIS Online basemap services--World Topo Map,例如——在 Web Mercator 中,a.k.a . 3857 或 102100。有两种方法可以解决这个问题。一种方法是使用 GeometryEngine 将几何图形从 4326 投影到 3857。但更好的方法是 告诉路线服务您想要哪个空间参考。 这是通过添加获取 RouteParameters 对象后的以下代码行:

routeParameters.setOutSpatialReference(mMapView.getSpatialReference());