GraphicsLayer是图形图层,可以自定义图形添加到地图上。
调用GraphicsLayer的addGraphic方法就能添加图形,
此方法要一个Graphic对象,此对象的构造方法是Graphic(Geometry geometry, Symbol symbol),
前面第一个是要素,而Geometry的子类有Envelope, MultiPath, MultiPoint, Point, Segment,Line, Polygon, Polyline。我们所常用的有点Point,线Polyline,面Polygon。
而后面一个参数是样式,点的样式是SimpleMarkerSymbol,线的样式是SimpleLineSymbol,面的样式是SimpleFillSymbol。
1.绘制点:
/**
* 绘制点
*/
private void drawPoint() {
//地图单击事件
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
@Override
public void onSingleTap(float v, float v1) {
mGraphicsLayer.removeAll();
Point point = mMapView.toMapPoint(v, v1); //将屏幕坐标转换为地图坐标
Graphic graphic = new Graphic(point, new SimpleMarkerSymbol
(Color.RED, , SimpleMarkerSymbol.STYLE.CIRCLE));
mGraphicsLayer.addGraphic(graphic);
}
});
}
2.绘制线:
/**
* 绘制线
*/
private void drawPolyLine() {
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
@Override
public void onSingleTap(float v, float v1) {
Point point = mMapView.toMapPoint(v, v1); //将屏幕坐标转换为地图坐标
mGraphicsLayer.removeAll();
pointList.add(point);
Polyline polyline = new Polyline();
if (pointList.size() > ) {
for (int i = ; i < pointList.size(); i++) {
if (i == ) {
polyline.startPath(pointList.get(i));
} else {
polyline.lineTo(pointList.get(i));
}
}
}
//点
//SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(Color.RED, 10, SimpleMarkerSymbol.STYLE.CIRCLE);
// Graphic pointGraphic = new Graphic(point, simpleMarkerSymbol);
//mGraphicsLayer.addGraphic(pointGraphic);
Graphic graphic = new Graphic(polyline, new SimpleLineSymbol(Color.RED, , SimpleLineSymbol.STYLE.SOLID));
mGraphicsLayer.addGraphic(graphic);
}
});
}
!这里写图片描述
3.绘制面:
/**
* 绘制面
*/
private void drawPolygon() {
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
@Override
public void onSingleTap(float v, float v1) {
Point point = mMapView.toMapPoint(v, v1); //将屏幕坐标转换为地图坐标
mGraphicsLayer.removeAll();
pointList.add(point);
Polygon polygon = new Polygon();
for (int i = ; i < pointList.size(); i++) {
if (i == ) {
polygon.startPath(pointList.get(i)); //起点
} else {
polygon.lineTo(pointList.get(i));
}
}
//点
//SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(Color.GREEN, 10, SimpleMarkerSymbol.STYLE.CIRCLE);
// Graphic pointGraphic = new Graphic(point, simpleMarkerSymbol);
//mGraphicsLayer.addGraphic(pointGraphic);
SimpleLineSymbol lineSymbol = new SimpleLineSymbol(Color.RED, , SimpleLineSymbol.STYLE.SOLID);
SimpleFillSymbol fillSymbol = new SimpleFillSymbol(Color.YELLOW);
fillSymbol.setOutline(lineSymbol);
Graphic graphic = new Graphic(polygon, fillSymbol);
mGraphicsLayer.addGraphic(graphic);
}
});
}
4.绘制圆:
/**
* 绘制圆
*/
private void drawCircle() {
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
@Override
public void onSingleTap(float v, float v1) {
double radius = ; //半径
Point point = mMapView.toMapPoint(v, v1);
mGraphicsLayer.removeAll();
pointList.add(point);
Polyline polyline = new Polyline();
if (pointList.size() == ) {
for (int i = ; i < pointList.size(); i++) {
if (i == ) {
polyline.startPath(pointList.get(i)); //开始点
} else {
polyline.lineTo(pointList.get(i));
}
}
radius = polyline.calculateLength2D(); //计算半径长度
}
Polygon polygon = new Polygon();
getCircle(pointList.get(), radius, polygon);
}
});
}
private void getCircle(Point point, double radius, Polygon polygon) {
polygon.setEmpty();
//圆形的边线点集合
Point[] points = getPoints(point, radius);
polygon.startPath(points[]);
for (int i = ; i < points.length; i++) {
polygon.lineTo(points[i]);
}
SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(Color.RED, , SimpleMarkerSymbol.STYLE.CIRCLE);
Graphic pointGraphic = new Graphic(point, simpleMarkerSymbol);
mGraphicsLayer.addGraphic(pointGraphic);
SimpleLineSymbol lineSymbol = new SimpleLineSymbol(Color.YELLOW, );
SimpleFillSymbol fillSymbol = new SimpleFillSymbol(Color.GREEN);
fillSymbol.setOutline(lineSymbol);
Graphic graphic = new Graphic(polygon, fillSymbol);
mGraphicsLayer.addGraphic(graphic);
}
/**
* 通过中心点和半径计算得出圆形的边线点集合
*
* @param center
* @param radius
* @return
*/
private static Point[] getPoints(Point center, double radius) {
Point[] points = new Point[];
double sin;
double cos;
double x;
double y;
for (double i = ; i < ; i++) {
sin = Math.sin(Math.PI * * i / );
cos = Math.cos(Math.PI * * i / );
x = center.getX() + radius * sin;
y = center.getY() + radius * cos;
points[(int) i] = new Point(x, y);
}
return points;
}
5.添加文本:
/**
* 添加文本
*/
private void addText() {
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
@Override
public void onSingleTap(float v, float v1) {
mGraphicsLayer.removeAll();
Point point = mMapView.toMapPoint(v, v1);
TextSymbol textSymbol = new TextSymbol(, "I is text", Color.RED);
textSymbol.setSize();
Graphic textGraphic = new Graphic(point, textSymbol);
mGraphicsLayer.addGraphic(textGraphic);
}
});
}
上面的代码没有设置使用哪种字体,Arcgis会默认的字体。如果 我们想添加中文,要设置textSymbol.setFontFamily(“DroidSansFallback.ttf”);,为textSymbol设置字体,arcgis会到system\fonts下找到此字体。但有时我们设置此代码时中文并没有出现,可能会有乱码等,是因为系统的fonts下面并没有此字体,解决的办法有,将手机root,将DroidSansFallback.ttf字体添加到system\fonts下。华为的手机是有此字体的,而三星5.0以上则没有此字体,在华为手机上还有一款中文DroidSansChinese.ttf字体arcgis也是支持的。而三星5.0以上的中文字体好像不是ttf字体,而是otf字体,Arcgis好像不支持,本人也没有找到好的解决办法。
6.添加图片:
/**
* 添加图片
*/
private void addImage() {
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
@Override
public void onSingleTap(float v, float v1) {
mGraphicsLayer.removeAll();
Point point = mMapView.toMapPoint(v, v1);
Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);
PictureMarkerSymbol pictureMarkerSymbol = new PictureMarkerSymbol(drawable);
Graphic graphic = new Graphic(point, pictureMarkerSymbol);
mGraphicsLayer.addGraphic(graphic);
}
});
}
完整代码:
package com.example.administrator.arcgis1029;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.RadioGroup;
import com.esri.android.map.GraphicsLayer;
import com.esri.android.map.MapView;
import com.esri.android.map.ags.ArcGISTiledMapServiceLayer;
import com.esri.android.map.event.OnSingleTapListener;
import com.esri.core.geometry.Point;
import com.esri.core.geometry.Polygon;
import com.esri.core.geometry.Polyline;
import com.esri.core.map.Graphic;
import com.esri.core.renderer.SimpleRenderer;
import com.esri.core.symbol.PictureMarkerSymbol;
import com.esri.core.symbol.SimpleFillSymbol;
import com.esri.core.symbol.SimpleLineSymbol;
import com.esri.core.symbol.SimpleMarkerSymbol;
import com.esri.core.symbol.TextSymbol;
import java.util.ArrayList;
import java.util.List;
/**
* 绘制点,线,面,圆
* GraphicsLayer是图形图层,可以自定义图形添加到地图上。
*/
public class Main3Activity extends AppCompatActivity {
private MapView mMapView;
private String mapServerUrl = "http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer";
private RadioGroup mRadioGroup;
private GraphicsLayer mGraphicsLayer;
//点集合
private List<Point> pointList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
mMapView = (MapView) findViewById(R.id.mapview);
mRadioGroup = (RadioGroup) findViewById(R.id.radiogroup);
ArcGISTiledMapServiceLayer arcGISTiledMapServiceLayer = new ArcGISTiledMapServiceLayer(mapServerUrl);
mMapView.addLayer(arcGISTiledMapServiceLayer);
mGraphicsLayer = new GraphicsLayer();
mMapView.addLayer(mGraphicsLayer);
mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.rb_draw_point: //绘制点
drawPoint();
break;
case R.id.rb_draw_polyline: //绘制线
drawPolyLine();
break;
case R.id.rb_draw_polygon: //绘制面
drawPolygon();
break;
case R.id.rb_draw_circle: //绘制圆
drawCircle();
break;
case R.id.rb_add_text: //添加文本
addText();
break;
case R.id.rb_add_image: //添加图片
addImage();
break;
}
}
});
}
/**
* 绘制圆
*/
private void drawCircle() {
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
@Override
public void onSingleTap(float v, float v1) {
double radius = ; //半径
Point point = mMapView.toMapPoint(v, v1);
mGraphicsLayer.removeAll();
pointList.add(point);
Polyline polyline = new Polyline();
if (pointList.size() == ) {
for (int i = ; i < pointList.size(); i++) {
if (i == ) {
polyline.startPath(pointList.get(i)); //开始点
} else {
polyline.lineTo(pointList.get(i));
}
}
radius = polyline.calculateLength2D(); //计算半径长度
}
Polygon polygon = new Polygon();
getCircle(pointList.get(), radius, polygon);
}
});
}
private void getCircle(Point point, double radius, Polygon polygon) {
polygon.setEmpty();
//圆形的边线点集合
Point[] points = getPoints(point, radius);
polygon.startPath(points[]);
for (int i = ; i < points.length; i++) {
polygon.lineTo(points[i]);
}
SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(Color.RED, , SimpleMarkerSymbol.STYLE.CIRCLE);
Graphic pointGraphic = new Graphic(point, simpleMarkerSymbol);
mGraphicsLayer.addGraphic(pointGraphic);
SimpleLineSymbol lineSymbol = new SimpleLineSymbol(Color.YELLOW, );
SimpleFillSymbol fillSymbol = new SimpleFillSymbol(Color.GREEN);
fillSymbol.setOutline(lineSymbol);
Graphic graphic = new Graphic(polygon, fillSymbol);
mGraphicsLayer.addGraphic(graphic);
}
/**
* 通过中心点和半径计算得出圆形的边线点集合
*
* @param center
* @param radius
* @return
*/
private static Point[] getPoints(Point center, double radius) {
Point[] points = new Point[];
double sin;
double cos;
double x;
double y;
for (double i = ; i < ; i++) {
sin = Math.sin(Math.PI * * i / );
cos = Math.cos(Math.PI * * i / );
x = center.getX() + radius * sin;
y = center.getY() + radius * cos;
points[(int) i] = new Point(x, y);
}
return points;
}
/**
* 绘制点
*/
private void drawPoint() {
//地图单击事件
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
@Override
public void onSingleTap(float v, float v1) {
mGraphicsLayer.removeAll();
Point point = mMapView.toMapPoint(v, v1); //将屏幕坐标转换为地图坐标
Graphic graphic = new Graphic(point, new SimpleMarkerSymbol
(Color.RED, , SimpleMarkerSymbol.STYLE.CIRCLE));
mGraphicsLayer.addGraphic(graphic);
}
});
}
/**
* 绘制线
*/
private void drawPolyLine() {
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
@Override
public void onSingleTap(float v, float v1) {
Point point = mMapView.toMapPoint(v, v1); //将屏幕坐标转换为地图坐标
mGraphicsLayer.removeAll();
pointList.add(point);
Polyline polyline = new Polyline();
if (pointList.size() > ) {
for (int i = ; i < pointList.size(); i++) {
if (i == ) {
polyline.startPath(pointList.get(i));
} else {
polyline.lineTo(pointList.get(i));
}
}
}
//点
//SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(Color.RED, 10, SimpleMarkerSymbol.STYLE.CIRCLE);
// Graphic pointGraphic = new Graphic(point, simpleMarkerSymbol);
//mGraphicsLayer.addGraphic(pointGraphic);
Graphic graphic = new Graphic(polyline, new SimpleLineSymbol(Color.RED, , SimpleLineSymbol.STYLE.SOLID));
mGraphicsLayer.addGraphic(graphic);
}
});
}
/**
* 绘制面
*/
private void drawPolygon() {
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
@Override
public void onSingleTap(float v, float v1) {
Point point = mMapView.toMapPoint(v, v1); //将屏幕坐标转换为地图坐标
mGraphicsLayer.removeAll();
pointList.add(point);
Polygon polygon = new Polygon();
for (int i = ; i < pointList.size(); i++) {
if (i == ) {
polygon.startPath(pointList.get(i)); //起点
} else {
polygon.lineTo(pointList.get(i));
}
}
//点
//SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(Color.GREEN, 10, SimpleMarkerSymbol.STYLE.CIRCLE);
// Graphic pointGraphic = new Graphic(point, simpleMarkerSymbol);
//mGraphicsLayer.addGraphic(pointGraphic);
SimpleLineSymbol lineSymbol = new SimpleLineSymbol(Color.RED, , SimpleLineSymbol.STYLE.SOLID);
SimpleFillSymbol fillSymbol = new SimpleFillSymbol(Color.YELLOW);
fillSymbol.setOutline(lineSymbol);
Graphic graphic = new Graphic(polygon, fillSymbol);
mGraphicsLayer.addGraphic(graphic);
}
});
}
/**
* 添加文本
*/
private void addText() {
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
@Override
public void onSingleTap(float v, float v1) {
mGraphicsLayer.removeAll();
Point point = mMapView.toMapPoint(v, v1);
TextSymbol textSymbol = new TextSymbol(, "I is text", Color.RED);
textSymbol.setSize();
Graphic textGraphic = new Graphic(point, textSymbol);
mGraphicsLayer.addGraphic(textGraphic);
}
});
}
/**
* 添加图片
*/
private void addImage() {
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
@Override
public void onSingleTap(float v, float v1) {
mGraphicsLayer.removeAll();
Point point = mMapView.toMapPoint(v, v1);
Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);
PictureMarkerSymbol pictureMarkerSymbol = new PictureMarkerSymbol(drawable);
Graphic graphic = new Graphic(point, pictureMarkerSymbol);
mGraphicsLayer.addGraphic(graphic);
}
});
}
/**
* 清除
*
* @param view
*/
public void clear(View view) {
mGraphicsLayer.removeAll();
pointList.clear();
}
}