展示底图 ArcGISTiledLayer :
ArcGISTiledLayer arcGISTiledLayer; private GraphicsOverlay overlay; arcGISMap = new ArcGISMap(Basemap.Type.IMAGERY, 26.75, 106.82, 9); mapView.setMap(arcGISMap); overlay = new GraphicsOverlay(); mapView.getGraphicsOverlays().add(overlay); //去除水印 ArcGISRuntimeEnvironment.setLicense("runtimelite,1000,rud4449636536,none,NKMFA0PL4S0DRJE15166"); mapView.setAttributionTextVisible(false); //最大放大范围 arcGISMap.setMaxScale(1000.0); 切换底图: 1其他底图: arcGISMap.getOperationalLayers().remove(basemap); tiledLayer = new ArcGISTiledLayer("http://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer"); basemap = new Basemap(tiledLayer); arcGISMap.setBasemap(basemap); mapView.setMap(arcGISMap); 2初始原图: arcGISMap.getOperationalLayers().remove(basemap); basemap = Basemap.createImagery(); arcGISMap.setBasemap(basemap); mapView.setMap(arcGISMap);
添加要素图层 FeatureLayer:
ServiceFeatureTable table = new ServiceFeatureTable( "http://10.0.0.4:6080/arcgis/rest/services/GYLY_SPECDATA/GYS_SLHZ/MapServer/0"); FeatureLayer layer = new FeatureLayer(table);
arcGISMap.getOperationalLayers().add(layer);
为FeatureLayer设置样式
SimpleLineSymbol lineSymbol = new SimpleLineSymbol( SimpleLineSymbol.Style.SOLID, 0xFFF7FCEF, 1F); layer.setRenderer(new SimpleRenderer(new SimpleFillSymbol( SimpleFillSymbol.Style.SOLID, 0x00000000, lineSymbol)));
加载完成后定位到该区域:
layer.addDoneLoadingListener(() -> { Envelope envelope = layer.getFeatureTable().getExtent(); mapView.setViewpointGeometryAsync(envelope, 20); });
加载 ArcGISMapImageLayer :
ArcGISMapImageLayer imageLayer = new ArcGISMapImageLayer( "https://sampleserver6.arcgisonline.com/arcgis/rest/services/SampleWorldCities/MapServer"); imageLayer.addDoneLoadingListener(() -> { // 隐藏Continent和World两个图层(仅保存WorldCities点图层) imageLayer.getSubLayerContents().get(1).setVisible(false); imageLayer.getSubLayerContents().get(2).setVisible(false); });
可以在 ArcGISMapImageLayer 取出某一个图层单独加载:
FeatureLayer layer1 = new FeatureLayer( new ServiceFeatureTable( "https://sampleserver6.arcgisonline.com/arcgis/rest/services/SampleWorldCities/MapServer/0"));
点击要素获取区域范围然后再定位到该区域:
mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mapView){ @Override public boolean onSingleTapConfirmed(MotionEvent e) { android.graphics.Point point = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); ListenableFuture<IdentifyLayerResult> future = mapView.identifyLayerAsync(arcGISMap.getOperationalLayers().get(0), point, 8.0, false, -1); future.addDoneListener(() -> { try { //将当前区域放大 GeoElement element = future.get().getElements().get(0); Envelope envelope = element.getGeometry().getExtent(); mapView.setViewpointGeometryAsync(envelope, 20); //当前区域使用实线标记边界 // SimpleLineSymbol lineSymbol = new SimpleLineSymbol( // SimpleLineSymbol.Style.SOLID, 0xFFFF0000, 0.5F); // overlay.getGraphics().add(new Graphic(geometry, lineSymbol)); //当前区域使用颜色填充 SimpleFillSymbol fillSymbol = new SimpleFillSymbol( SimpleFillSymbol.Style.SOLID, 0x88FF0000, null); overlay.getGraphics().add(new Graphic(geometry, fillSymbol)); } catch (ExecutionException | InterruptedException executionException) { executionException.printStackTrace(); } }); return super.onSingleTapConfirmed(e); } });
Geometry有多个面,获取出最大的面,然后取中心点显示名称
private Geometry maxGeometry(Geometry geometry){
return GeometryEngine.labelPoint((Polygon) geometry);
}
直接查询元素并绘制文字边界和透明图形,和 setRenderer 绘制样式是一样的效果
overlay = new GraphicsOverlay(); mapView.getGraphicsOverlays().add(overlay); parameters = new QueryParameters(); table = new ServiceFeatureTable("url"); layer = new FeatureLayer(table); table.loadAsync(); table.addDoneLoadingListener(() -> { parameters.setGeometry(table.getExtent()); ListenableFuture<FeatureQueryResult> future = table.queryFeaturesAsync( parameters, ServiceFeatureTable.QueryFeatureFields.LOAD_ALL); future.addDoneListener(() -> { try { for (Feature feature : future.get()) { Geometry element = feature.getGeometry(); TextSymbol drapedText = new TextSymbol(10, "十字", 0xFFDDDDDD, TextSymbol.HorizontalAlignment.CENTER, TextSymbol.VerticalAlignment.MIDDLE); SimpleLineSymbol lineSymbol = new SimpleLineSymbol( SimpleLineSymbol.Style.SOLID, 0xFFF7FCEF, 1F); SimpleFillSymbol fillSymbol = new SimpleFillSymbol( SimpleFillSymbol.Style.SOLID, 0x00000000, lineSymbol); overlay.getGraphics().add(new Graphic(element, fillSymbol)); overlay.getGraphics().add(new Graphic(element, drapedText)); } } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } }); });
查询绘制的图层并放大区域
mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mapView) { @Override public boolean onSingleTapConfirmed(MotionEvent e) { android.graphics.Point poi = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); ListenableFuture<IdentifyGraphicsOverlayResult> future = mapView.identifyGraphicsOverlayAsync(overlay, poi, 10, false, 1); future.addDoneListener(() -> { try { IdentifyGraphicsOverlayResult result = future.get(); if (result.getGraphics().size() > 0) { GeoElement element = future.get().getGraphics().get(0); Envelope envelope = element.getGeometry().getExtent(); mapView.setViewpointGeometryAsync(envelope, 20); } } catch (ExecutionException | InterruptedException executionException) { executionException.printStackTrace(); } }); return super.onSingleTapConfirmed(e); } });