我正在开发一个计算两点之间路线的应用程序。下面给出的代码可以计算两点之间的路线。但是我无法以图形方式在地图上显示它。
代码:
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服务的层的创建更快。)添加的最后一层在最顶层,因此您的底图图层可能(剧透警报:将)位于图形图层的顶部,并将其隐藏。为确保在底图之后添加图形图层,请添加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();
}
}
});
其次,路线的几何参考与地图的参考有所不同。的路由服务的默认输出空间参考是WGS 1984,又名4326,又名纬度和经度。但是,ArcGIS Online底图服务(例如World Topo Map)位于Web Mercator中,又名3857或102100。有两种解决方法。一种方法是用来GeometryEngine
投影从4326到3857的几何。但是更好的方法是告诉路线服务您想要哪个空间参考。这是通过在获取RouteParameters
对象之后添加以下代码行来完成的:
routeParameters.setOutSpatialReference(mMapView.getSpatialReference());
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句