上一篇文章介绍了Symol接口和图层Layer。今天具体介绍点线面的绘制。
需求分析:
我们需要实现的是,选择划线,多次点击地图,实现划线;选择面积多次点击,实现画面。如下图demo实例:
效果图.gif
实现步骤:
1,初始化相关对象:
private Button Polyline;//划线
private Button Polygon;//
private MapView mapview;
GraphicsLayer graphicsLayer;//图层,用于显示点线面要素
SimpleLineSymbol simpleLineSymbol;//线
SimpleMarkerSymbol simpleMarkerSymbol;//点
SimpleFillSymbol simpleFillSymbol;//面
List<Point> points=new ArrayList<>();//承载点击的位置点信息
private int tag=0;//划线还是画面的标记 0划线,1画面 默认划线
2,实例化:
Polygon=(Button)findViewById(R.id.Polygon);//划线button
Polyline=(Button)findViewById(R.id.Polyline);//面button
mapview=findViewById(R.id.map);//地图
graphicsLayer=new GraphicsLayer();//图层添加对象
mapview.addLayer(graphicsLayer);//把该对象加载到地图上
//点要素实例化并设置颜色和宽度
simpleMarkerSymbol= new SimpleMarkerSymbol(Color.RED, 7, SimpleMarkerSymbol.STYLE.CIRCLE);
simpleMarkerSymbol.setOutline(new SimpleLineSymbol(Color.BLUE, 1));
3,两个划线,和面的button的监听事件:
Polyline.setOnClickListener(new View.OnClickListener() {
//选择划线监听事件
@Override
public void onClick(View view) {
tag=0;
//把之前的要素清楚
if (points.size()>0){
points.clear();
}
if (graphicsLayer!=null){
graphicsLayer.removeAll();
}
}
});
Polygon.setOnClickListener(new View.OnClickListener() {
//选择画面监听事件
@Override
public void onClick(View view) {
tag=1;
//把之前的要素清楚
if (points.size()>0){
points.clear();
}
if (graphicsLayer!=null){
graphicsLayer.removeAll();
}
}
});
4,划线和画面的具体方法
线:
private void drawline(float v, float v1) {
simpleLineSymbol=new SimpleLineSymbol(Color.BLUE, 3);//创建线要素对象
points.add(mapview.toMapPoint(v,v1));//把点击的点坐标添加到list集合
//显示点
graphicsLayer.addGraphic(new Graphic(mapview.toMapPoint(v,v1),simpleMarkerSymbol));
com.esri.core.geometry.Polyline polyline=new Polyline();//arcgis 线的对象
//生成线
if (points.size()>1) {
//依次把点转成Polyline
for (int i = 0; i < points.size(); i++) {
if (i == 0) {
polyline.startPath(points.get(i));
} else {
polyline.lineTo(points.get(i));
}
}
//绘制线 因为graphicsLayer在上面已经加载到地图上面了,
// 所以这里需要把要素和点的集合加载到graphicsLayer图层对象上就可以加显示在地图上
graphicsLayer.addGraphic(new Graphic(polyline, simpleLineSymbol));
}
}
面
private void drawgon(float v,float v1) {
//画面的方法
simpleFillSymbol = new SimpleFillSymbol(Color.BLUE);//创建面要素对象
points.add(mapview.toMapPoint(v, v1));//把点击的点坐标添加到list集合
//显示点
graphicsLayer.addGraphic(new Graphic(mapview.toMapPoint(v, v1), simpleMarkerSymbol));
//生成面积
com.esri.core.geometry.Polygon polygon = new Polygon();//arcgis 面的对象
if (points.size() > 1) {
//依次把点转成Polygon
for (int i = 0; i < points.size(); i++) {
if (i == 0) {
polygon.startPath(points.get(i));
} else {
polygon.lineTo(points.get(i));
}
}
//绘制面,因为graphicsLayer在上面已经加载到地图上面了,
// 所以这里需要把要素和点的集合加载到graphicsLayer图层对象上就可以加显示在地图上
graphicsLayer.addGraphic(new Graphic(polygon, simpleFillSymbol));
}
}
5,地图的点击事件中判断选择了划线还是画面的按钮来确定执行上面的哪个方法:
mapview.setOnSingleTapListener(new OnSingleTapListener() {
//地图的点击监听事件
@Override
public void onSingleTap(float v, float v1) {
if (tag==0){
drawline(v, v1);//画线
}else {
drawgon(v,v1);//画面
}
}
});
demo 下载地址:
https://github.com/liuxiting/DemoDraw
网友评论