绘制图层GraphicsOverlay
100版本单独把绘制图层拿出来的一个好处就是,它将永远置于地图内容之上。在以前我们如果要在MapView里加载一个新的图层,必须先remove带有图形的FeatureLayer,加载这个图层之后再加载一次带有图形的FeatureLayer,否则我们这个FeatureLayer将会被新加载的图层所覆盖。现在这个问题就不复存在了。
GraphicsOverlay graphicsOverlay1 = new GraphicsOverlay();
GraphicsOverlay graphicsOverlay2 = new GraphicsOverlay(GraphicsOverlay.RenderingMode.DYNAMIC);
mMapView.getGraphicsOverlays().add(graphicsOverlay1);
GraphicsOverlay默认的构造模式一共有两种:DYNAMIC和STATIC,默认的是动态渲染模式DYNAMIC。
当为DYNAMIC模式时候,每当图形有变化时候GraphicsOverlay会立刻更新图形;
而为STATIC模式时候,图形变化了不会马上更新,而是在进行地图的缩放、旋转和平移时候才更新图层,适合于绘制图层里含有大量图形时候使用,以防图形更新太慢影响体验。
举个例子:绘制点
mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
@Override
public boolean onSingleTapConfirmed(MotionEvent v) {
Point clickPoint = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
GraphicsOverlay graphicsOverla=new GraphicsOverlay();
SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10);
Graphic pointGraphic = new Graphic(clickPoint,simpleMarkerSymbol);
graphicsOverlay.getGraphics().add(pointGraphic);
mMapView.getGraphicsOverlays().add(graphicsOverlay);
return true;
}
});
符号与渲染器(Symbols and Renderers),通过色彩值、大小、形状、边线、透明度来表达空间要素的具体含义。如果仅仅有位置,而没有位置上的属性信息,位置也会失去意义,符号与渲染器是呈现位置上属性信息的最直接表达方式。对于Graphic(GraphicsOverlay),可以直接赋值符号或者设置渲染器,而对于Feature(FeatureLayer)只能通过渲染器进行设置。
符号Symbol使用
Symbol类是一个用来控制显示图形符号样式的类。
1.点符号(MarkerSymbol)
点符号,顾名思义就是用来修饰Point的符号。包含三种类型,分别是
PictureMarkerSymbol(图片点符号),
SimpleMarkerSymbol(简单点符号),
TextSymbol(文本符号)。
2.线符号(LineSymbol)
线符号是用来修饰线PolyLine的符号。只有一种类型,SimpleLineSymbol(简单线符号)。
3.面符号(FillSymbol)
面符号是用来修饰面Polygon的符号,一共有两种PictureFillSymbol(图片面符号), SimpleFillSymbol(简单面符号)。
渲染Renderer使用
渲染也是设置图形样式,相比起符号来,渲染就相当于是批量的图形样式设置。但是当渲染和符号同时存在时候,会优先使用符号的样式。
渲染一共包含了ClassBreaksRenderer, HeatmapRenderer, SimpleRenderer, UniqueValueRenderer, UnsupportedRenderer五大类,这里简要以SimpleRenderer介绍下吧。
单一符号渲染(SimpleRenderer)
官方案例:
public class AddGraphicsRendererActivity extends AppCompatActivity {
private MapView mMapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_graphics_renderer);
mMapView = (MapView) findViewById(R.id.mapView);
ArcGISMap mMap = new ArcGISMap(Basemap.Type.TOPOGRAPHIC, 15.169193, 16.333479, 2);
addGraphicsOverlay();
mMapView.setMap(mMap);
}
private void addGraphicsOverlay() {
// point graphic
Point pointGeometry = new Point(40e5, 40e5, SpatialReferences.getWebMercator());
// red diamond point symbol
SimpleMarkerSymbol pointSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.DIAMOND, Color.RED, 10);
// create graphic for point
Graphic pointGraphic = new Graphic(pointGeometry);
// create a graphic overlay for the point
GraphicsOverlay pointGraphicOverlay = new GraphicsOverlay();
// create simple renderer
SimpleRenderer pointRenderer = new SimpleRenderer(pointSymbol);
pointGraphicOverlay.setRenderer(pointRenderer);
// add graphic to overlay
pointGraphicOverlay.getGraphics().add(pointGraphic);
// add graphics overlay to the MapView
mMapView.getGraphicsOverlays().add(pointGraphicOverlay);
// line graphic
PolylineBuilder lineGeometry = new PolylineBuilder(SpatialReferences.getWebMercator());
lineGeometry.addPoint(-10e5, 40e5);
lineGeometry.addPoint(20e5, 50e5);
// solid blue line symbol
SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.BLUE, 5);
// create graphic for polyline
Graphic lineGraphic = new Graphic(lineGeometry.toGeometry());
// create graphic overlay for polyline
GraphicsOverlay lineGraphicOverlay = new GraphicsOverlay();
// create simple renderer
SimpleRenderer lineRenderer = new SimpleRenderer(lineSymbol);
// add graphic to overlay
lineGraphicOverlay.setRenderer(lineRenderer);
// add graphic to overlay
lineGraphicOverlay.getGraphics().add(lineGraphic);
// add graphics overlay to the MapView
mMapView.getGraphicsOverlays().add(lineGraphicOverlay);
//polygon graphic
PolygonBuilder polygonGeometry = new PolygonBuilder(SpatialReferences.getWebMercator());
polygonGeometry.addPoint(-20e5, 20e5);
polygonGeometry.addPoint(20e5, 20e5);
polygonGeometry.addPoint(20e5, -20e5);
polygonGeometry.addPoint(-20e5, -20e5);
// solid yellow polygon symbol
SimpleFillSymbol polygonSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.YELLOW, null);
// create graphic for polygon
Graphic polygonGraphic = new Graphic(polygonGeometry.toGeometry());
// create graphic overlay for polygon
GraphicsOverlay polygonGraphicOverlay = new GraphicsOverlay();
// create simple renderer
SimpleRenderer polygonRenderer = new SimpleRenderer(polygonSymbol);
// add graphic to overlay
polygonGraphicOverlay.setRenderer(polygonRenderer);
// add graphic to overlay
polygonGraphicOverlay.getGraphics().add(polygonGraphic);
// add graphics overlay to MapView
mMapView.getGraphicsOverlays().add(polygonGraphicOverlay);
}
@Override
protected void onPause() {
super.onPause();
mMapView.pause();
}
@Override
protected void onResume() {
super.onResume();
mMapView.resume();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.dispose();
}
}
效果图:
唯一值渲染(UniqueValueRenderer)
UniqueValueRenderer表示具有匹配属性的功能/图形组。这在名义或字符串数据中最常见。
UniqueValueRenderer用于绘制具有不同符号的多个要素/图形,并将UniqueValueRenderer中的字段名称与UniqueValues中的值进行匹配。
示例:使用UniqueValueRenderer对分区指定进行符号化:黄色表示“住宅”,紫色表示“工业”,红色表示“商业”,等等。
public class UniqueValueRendererActivity extends AppCompatActivity {
private MapView mMapView;
private String sample_service_url = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_unique_value_renderer);
mMapView = (MapView) findViewById(R.id.mapView);
ArcGISMap map = new ArcGISMap(Basemap.createTopographic());
//[DocRef: Name=Unique Value Renderer, Topic=Symbols and Renderers, Category=Fundamentals]
// Create service feature table
ServiceFeatureTable serviceFeatureTable = new ServiceFeatureTable(sample_service_url);
// Create the feature layer using the service feature table
FeatureLayer featureLayer = new FeatureLayer(serviceFeatureTable);
// Override the renderer of the feature layer with a new unique value renderer
UniqueValueRenderer uniqueValueRenderer = new UniqueValueRenderer();
// Set the field to use for the unique values
//You can add multiple fields to be used for the renderer in the form of a list, in this case
uniqueValueRenderer.getFieldNames().add("STATE_ABBR");
// we are only adding a single field
// Create the symbols to be used in the renderer
SimpleFillSymbol defaultFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.NULL, Color.BLACK,
new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.GRAY, 2));
SimpleFillSymbol californiaFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.RED,
new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.RED, 2));
SimpleFillSymbol arizonaFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.GREEN,
new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.GREEN, 2));
SimpleFillSymbol nevadaFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.BLUE,
new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.BLUE, 2));
// Set default symbol
uniqueValueRenderer.setDefaultSymbol(defaultFillSymbol);
uniqueValueRenderer.setDefaultLabel("Other");
// Set value for california
List<Object> californiaValue = new ArrayList<>();
// You add values associated with fields set on the unique value renderer.
// If there are multiple values, they should be set in the same order as the fields are set
californiaValue.add("CA");
uniqueValueRenderer.getUniqueValues().add(
new UniqueValueRenderer.UniqueValue("California", "State of California", californiaFillSymbol,
californiaValue));
// Set value for arizona
List<Object> arizonaValue = new ArrayList<>();
// You add values associated with fields set on the unique value renderer.
// If there are multiple values, they should be set in the same order as the fields are set
arizonaValue.add("AZ");
uniqueValueRenderer.getUniqueValues()
.add(new UniqueValueRenderer.UniqueValue("Arizona", "State of Arizona", arizonaFillSymbol, arizonaValue));
// Set value for nevada
List<Object> nevadaValue = new ArrayList<>();
// You add values associated with fields set on the unique value renderer.
// If there are multiple values, they should be set in the same order as the fields are set
nevadaValue.add("NV");
uniqueValueRenderer.getUniqueValues()
.add(new UniqueValueRenderer.UniqueValue("Nevada", "State of Nevada", nevadaFillSymbol, nevadaValue));
// Set the renderer on the feature layer
featureLayer.setRenderer(uniqueValueRenderer);
//[DocRef: END]
// add the layer to the map
map.getOperationalLayers().add(featureLayer);
map.setInitialViewpoint(new Viewpoint(
new Envelope(-13893029.0, 3573174.0, -12038972.0, 5309823.0, SpatialReferences.getWebMercator())));
// set the map to be displayed in the mapview
mMapView.setMap(map);
}
@Override
protected void onPause() {
super.onPause();
// pause MapView
mMapView.pause();
}
@Override
protected void onResume() {
super.onResume();
// resume MapView
mMapView.resume();
}
@Override
protected void onDestroy() {
super.onDestroy();
// dispose MapView
mMapView.dispose();
}
}