天天看點

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