天天看点

ArcGIS for Android 10.2.9(6):GraphicsLayer绘制点,线,面,圆,添加文本和图片

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);
            }
        });
    }
           
ArcGIS for Android 10.2.9(6):GraphicsLayer绘制点,线,面,圆,添加文本和图片

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);
            }
        });
    }
           

!这里写图片描述

ArcGIS for Android 10.2.9(6):GraphicsLayer绘制点,线,面,圆,添加文本和图片

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);
            }
        });
    }
           
ArcGIS for Android 10.2.9(6):GraphicsLayer绘制点,线,面,圆,添加文本和图片

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;
    }
           
ArcGIS for Android 10.2.9(6):GraphicsLayer绘制点,线,面,圆,添加文本和图片

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好像不支持,本人也没有找到好的解决办法。

ArcGIS for Android 10.2.9(6):GraphicsLayer绘制点,线,面,圆,添加文本和图片

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);
            }
        });
    }
           
ArcGIS for Android 10.2.9(6):GraphicsLayer绘制点,线,面,圆,添加文本和图片

完整代码:

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();
    }
}