ArcGIS for Android 100.3.0(8):绘制点,线,面,圆,添加文本和图片「建议收藏」

ArcGIS for Android 100.3.0(8):绘制点,线,面,圆,添加文本和图片「建议收藏」空间要素(Geometry)Geometries用以在特定地理位置上通过形状来表达真实世界的对象。图层范围、视图范围、GPS定位都是通过Geometries表达实现进一步的数据编辑、空间分析、地理处理、位置与面积量算都离不开空间要素。案例效果图:布局:<?xmlversion="1.0"encoding="utf-8"?><RelativeL…

大家好,又见面了,我是你们的朋友全栈君。

空间要素(Geometry)

Geometries用以在特定地理位置上通过形状来表达真实世界的对象。图层范围、视图范围、GPS定位都是通过Geometries表达实现进一步的数据编辑、空间分析、地理处理、位置与面积量算都离不开空间要素。
这里写图片描述

案例

效果图:
这里写图片描述

布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".GraphicsOverlayActivity">

    <com.esri.arcgisruntime.mapping.view.MapView  android:id="@+id/mapview" android:layout_width="match_parent" android:layout_height="match_parent"></com.esri.arcgisruntime.mapping.view.MapView>


    <RadioGroup  android:id="@+id/radiogroup" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal">

        <RadioButton  android:id="@+id/rb_draw_point" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="绘制点" />

        <RadioButton  android:id="@+id/rb_draw_polyline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="绘制线" />

        <RadioButton  android:id="@+id/rb_draw_scroll_line" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="绘制曲线" />

        <RadioButton  android:id="@+id/rb_draw_polygon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="绘制面" />

        <RadioButton  android:id="@+id/rb_add_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="添加图片" />

        <RadioButton  android:id="@+id/rb_draw_circle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="绘制圆" />

        <RadioButton  android:id="@+id/rb_draw_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="绘制文字" />
    </RadioGroup>

    <Button  android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/radiogroup" android:onClick="clear" android:text="清除" />
</RelativeLayout>

代码:

public class GraphicsOverlayActivity extends AppCompatActivity { 
   

    private MapView mMapView;

    private RadioGroup mRadioGroup;

    private GraphicsOverlay mGraphicsOverlay;

    //点集合
    private PointCollection mPointCollection = new PointCollection(SpatialReferences.getWebMercator());

    private List<Point> mPointList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_graphics_overlay);

        findViews();

        addBasemap();

        initListener();
    }

    private void addBasemap() {
        ArcGISMap arcGISMap = new ArcGISMap(Basemap.Type.OCEANS, 56.075844, -2.681572, 11);
        mMapView.setMap(arcGISMap);


        mGraphicsOverlay = new GraphicsOverlay();
        mMapView.getGraphicsOverlays().add(mGraphicsOverlay);
    }

    private void initListener() {
        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_scroll_line: //绘制曲线
                        drawScrollline();
                        break;
                    case R.id.rb_draw_polygon: //绘制面
                        drawPolygon();
                        break;
                    case R.id.rb_add_image: //添加图片
                        addImage();
                        break;
                    case R.id.rb_draw_circle: //绘制圆
                        drawCircle();
                        break;
                    case R.id.rb_draw_text: //绘制文字
                        drawText();
                        break;
                }
            }
        });
    }

    /** * 绘制点 */
    private void drawPoint() {
        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                Point clickPoint = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
                SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 20);
                Graphic graphic = new Graphic(clickPoint, simpleMarkerSymbol);
                //清除上一个点
                mGraphicsOverlay.getGraphics().clear();
                mGraphicsOverlay.getGraphics().add(graphic);

                //使用渲染器
                // Graphic graphic1 = new Graphic(clickPoint);
                // SimpleRenderer simpleRenderer = new SimpleRenderer(simpleMarkerSymbol);
                // mGraphicsOverlay.setRenderer(simpleRenderer);
                // mGraphicsOverlay.getGraphics().clear();
                // mGraphicsOverlay.getGraphics().add(graphic1);

                return super.onSingleTapConfirmed(e);
            }
        });
    }

    /** * 绘制线 */
    private void drawPolyline() {
        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                Point point = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
                mPointCollection.add(point);

                Polyline polyline = new Polyline(mPointCollection);

                //点
                SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10);
                Graphic pointGraphic = new Graphic(point, simpleMarkerSymbol);
                mGraphicsOverlay.getGraphics().add(pointGraphic);

                //线
                SimpleLineSymbol simpleLineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.parseColor("#FC8145"), 3);
                Graphic graphic = new Graphic(polyline, simpleLineSymbol);
                mGraphicsOverlay.getGraphics().add(graphic);

                return super.onSingleTapConfirmed(e);
            }
        });
    }

    /** * 绘制曲线 */
    private void drawScrollline() {
        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                Point point1 = mMapView.screenToLocation(new android.graphics.Point(Math.round(e1.getX()), Math.round(e1.getY())));
                Point point2 = mMapView.screenToLocation(new android.graphics.Point(Math.round(e2.getX()), Math.round(e2.getY())));

                mPointCollection.add(point1);
                mPointCollection.add(point2);
                Polyline polyline = new Polyline(mPointCollection);

                Graphic graphic = new Graphic(polyline, new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.parseColor("#FC8145"), 3));
                mGraphicsOverlay.getGraphics().add(graphic);
                return true;
            }
        });
    }

    /** * 绘制面 */
    private void drawPolygon() {

        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {

                mGraphicsOverlay.getGraphics().clear();
                Point point = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
                mPointCollection.add(point);

                Polygon polygon = new Polygon(mPointCollection);

                if (mPointCollection.size() == 1) {
                    SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10);
                    Graphic pointGraphic = new Graphic(point, simpleMarkerSymbol);
                    mGraphicsOverlay.getGraphics().add(pointGraphic);
                }

                SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.GREEN, 3.0f);
                SimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.parseColor("#33e97676"), lineSymbol);
                Graphic graphic = new Graphic(polygon, simpleFillSymbol);
                mGraphicsOverlay.getGraphics().add(graphic);

                return super.onSingleTapConfirmed(e);
            }
        });
    }

    /** * 添加图片 */
    private void addImage() {
        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {

                Point clickPoint = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
                Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
                BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap);
                PictureMarkerSymbol pictureMarkerSymbol = new PictureMarkerSymbol(bitmapDrawable);
                final Graphic graphic = new Graphic(clickPoint, pictureMarkerSymbol);

                //涉及到加载图片到符号里,所以需要一个异步监听操作
                pictureMarkerSymbol.loadAsync();
                pictureMarkerSymbol.addDoneLoadingListener(new Runnable() {
                    @Override
                    public void run() {
                        mGraphicsOverlay.getGraphics().clear();
                        mGraphicsOverlay.getGraphics().add(graphic);
                    }
                });

                return super.onSingleTapConfirmed(e);
            }
        });
    }

    /** * 绘制文字 */
    private void drawText() {
        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {

                Point clickPoint = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
                TextSymbol textSymbol = new TextSymbol(20, "绘制文字", Color.RED,
                        TextSymbol.HorizontalAlignment.CENTER, TextSymbol.VerticalAlignment.MIDDLE);
                Graphic graphic = new Graphic(clickPoint, textSymbol);
                mGraphicsOverlay.getGraphics().clear();
                mGraphicsOverlay.getGraphics().add(graphic);

                return super.onSingleTapConfirmed(e);
            }
        });
    }

    /** * 绘制圆 */
    private void drawCircle() {

        mPointList = new ArrayList<>();

        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {

                double radius = 0;

                Point point = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));

                mPointList.add(point);
                if (mPointList.size() == 2) {
                    double x = (mPointList.get(1).getX() - mPointList.get(0).getX());
                    double y = (mPointList.get(1).getY() - mPointList.get(0).getY());
                    radius = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
                }

                getCircle(mPointList.get(0), radius);

                return super.onSingleTapConfirmed(e);
            }
        });
    }


    private void getCircle(Point point, double radius) {
        // polygon.setEmpty();
        Point[] points = getPoints(point, radius);
        mPointCollection.clear();
        for (Point p : points) {
            mPointCollection.add(p);
        }

        Polygon polygon = new Polygon(mPointCollection);

        SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10);
        Graphic pointGraphic = new Graphic(point, simpleMarkerSymbol);
        mGraphicsOverlay.getGraphics().add(pointGraphic);

        SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.parseColor("#FC8145"), 3.0f);
        SimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.parseColor("#33e97676"), lineSymbol);

        Graphic graphic = new Graphic(polygon, simpleFillSymbol);

        mGraphicsOverlay.getGraphics().add(graphic);
    }

    /** * 通过中心点和半径计算得出圆形的边线点集合 * * @param center * @param radius * @return */
    private static Point[] getPoints(Point center, double radius) {
        Point[] points = new Point[50];
        double sin;
        double cos;
        double x;
        double y;
        for (double i = 0; i < 50; i++) {
            sin = Math.sin(Math.PI * 2 * i / 50);
            cos = Math.cos(Math.PI * 2 * i / 50);
            x = center.getX() + radius * sin;
            y = center.getY() + radius * cos;
            points[(int) i] = new Point(x, y);
        }
        return points;
    }


    /** * 清除 * * @param view */
    public void clear(View view) {
        mGraphicsOverlay.getGraphics().clear();
        mPointCollection.clear();
        if (mPointList != null) {
            mPointList.clear();
        }
    }

    private void findViews() {
        mMapView = (MapView) findViewById(R.id.mapview);
        mRadioGroup = (RadioGroup) findViewById(R.id.radiogroup);
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160604.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android StrictMode学习

    Android StrictMode学习最新的Android平台中(Android2.3起),新增加了一个新的类,叫StrictMode(android.os.StrictMode)。这个类可以用来帮助开发者改进他们编写的应用,并且提供了各种的策略,这些策略能随时检查和报告开发者开发应用中存在的问题,比如可以监视那些本不应该在主线程中完成的工作或者其他的一些不规范和不好的代码。  StrictMode有多种不同的策略,每一种策

    2022年5月1日
    45
  • Java——流

    Java——流

    2021年5月25日
    121
  • 软件架构设计—软件架构概述[通俗易懂]

    软件架构设计—软件架构概述[通俗易懂]像学写文章一样,在学会字、词、句之后,就应上升到段落,就应追求文章的“布局谋篇”,这就是架构。通俗地讲,软件架构设计就是软件系统的“布局谋篇”。人们在软件工程实践中,逐步认识到了软件架构的重要性,从而开辟了一个崭新的研究领域。软件架构的研究内容主要涉及软件架构描述、软件架构设计、软件架构风格、软件架构评价和软件架构的形成方法等。软件设计人员学习软件架构知识旨在站在…

    2022年5月7日
    68
  • 如何防御udp攻击_编码可以防御哪些攻击

    如何防御udp攻击_编码可以防御哪些攻击原理​UDPFlood是日渐猖厥的流量型DoS攻击,原理也很简单。常见的情况是利用大量UDP小包冲击DNS服务器或Radius认证服务器、流媒体视频服务器。100kpps的UDPFlood经常将线路上的骨干设备例如防火墙打瘫,造成整个网段的瘫痪。由于UDP协议是一种无连接的服务,在UDPFLOOD攻击中,攻击者可发送大量伪造源IP地址的小UDP包。但是,由于UDP协议是无连接性的,所以只要开了一个UDP的端口提供相关服务的话,那么就可针对相关的服务进行攻击。正常应用情况下,UDP包双向流量会基本相等,而

    2022年10月2日
    3
  • splice方法最详细最全面的解释!!!

    splice方法最详细最全面的解释!!!文章目录前言一、splice方法官方文档节选二、根据文档测试方法一:方法二:方法三:方法四:总结前言在学前端的时候一直对splice方法不太清楚,今天特意总结了一下!一、splice方法官方文档节选查阅了splice方法的示例文档,如下:(不想看论述的,可以直接跳到下面看总结!)splice返回值:Array所属对象:ArrayTheelementstoaddtothearray.Ifyoudon’tspecifyanyelements,splice

    2022年9月24日
    3
  • js中三种弹出框[通俗易懂]

    js中三种弹出框[通俗易懂]javascript的三种对话框是通过调用window对象的三个方法alert(),confirm()和prompt()来获得,可以利用这些对话框来完成js的输入和输出,实现与用户能进行交互的js代码

    2022年8月3日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号