ArcGis 系列(二):为地图添加点线面

545 阅读4分钟

ArcGis 系列(二):为地图添加点线面

本文概述:

  • 此为ArcGIS系列第二篇文章,期望借助简单Android 程序并配合ArcGIS官方文档实现为地图添加点、线、面;并且为了后期维护以及开发效率,封装了ArcGISUtils 工具类;关于基础环境介绍,请查阅个人ArcGIS系列第一篇文章:juejin.cn/post/711265…

运行截图:

1656322931825.png

工程结构:

1656322419050.png

代码展示:

布局文件:activity_main.xml

<?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"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
​
    <!-- MapView 对象用于显示地图 -->
    <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>
​
</RelativeLayout>

工具类:ArcGISUtils

package mapandscenes.addPTS;
​
import android.content.Context;
​
import androidx.appcompat.app.AppCompatActivity;
​
import com.cdqiantuo.arcgissdklearn.R;
import com.esri.arcgisruntime.ArcGISRuntimeEnvironment;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.geometry.PointCollection;
import com.esri.arcgisruntime.geometry.Polygon;
import com.esri.arcgisruntime.geometry.Polyline;
import com.esri.arcgisruntime.geometry.SpatialReferences;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.BasemapStyle;
import com.esri.arcgisruntime.mapping.Viewpoint;
import com.esri.arcgisruntime.mapping.view.Graphic;
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.symbology.SimpleFillSymbol;
import com.esri.arcgisruntime.symbology.SimpleLineSymbol;
import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol;
​
/*
* 本类为ArcGis SDK 抽象出来的工具类库
整体项目流程:
    1.创建mapView
    2.创建ArcGIS地图将其放到mapView上面
    3.
​
* */
public class ArcGisUtils{
​
    //提供Android 上下文,在调用处需要用到才赋值
    private Context context;
    //ArcGis 服务秘钥:若需要使用ArcGIS的定位服务就要用这个东西
    public static final String API_KEY = "AAPKff9e23809f554aabb9dd77d" +
            "5b787d700fS6GV0lVfFVpNjKH0M0KsmGBTa72eujpzghEaqPJIgb4bBvBPrDjzUXb5B5SeE9T";
​
​
​
    //设置ArcGis API密钥
    public  void setAPI_KEY(){
        ArcGISRuntimeEnvironment.setApiKey(API_KEY);
    }
​
    //去掉ArcGis 显示水印:这个在之前版本有效,但一次更新后失效,在近期版本中又有效了
    public void removeWatermark(){
        ArcGISRuntimeEnvironment.setLicense("runtimelite,1000,rud4449636536," +
                "none,NKMFA0PL4S0DRJE15166");
    }
​
    //初始化ArcGis地图:根据业务选择合适的地图模式,添加到MapView上
    public ArcGISMap arcGISMapInit(){
        ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_TOPOGRAPHIC);
        return arcGISMap;
    }
​
    //初始化MapView:根据具体的ArcGISMap,来初始化具体MapView
    public MapView mapViewInit(MapView mapView){
        ArcGISMap arcGISMap = arcGISMapInit();
        //Kotlin 中使用运算符重载替换掉了setXXX,直接可以点属性
        mapView.setMap(arcGISMap);
        mapView.setViewpoint(new Viewpoint(34.0270, -118.8050, 72000.0));
        return mapView;
    }
​
    //向地图图层添加点、线、面
    //添加代码:向地图图层添加点
    public MapView addGraphicsPoint(MapView mMapView) {
    /*1.创建一个图形叠加并将其添加到地图视图
      2.创建点的实例(对其进行修饰)
      3.创建点对应的几何图形与符号
      4.将这个集合图形放到进去
    * */
        //创建一个图形叠加并将其添加到地图视图
        GraphicsOverlay graphicsOverlay = new GraphicsOverlay();
        mMapView.getGraphicsOverlays().add(graphicsOverlay);
​
        //创建一个点实例(传入经纬度)
        //创建一个点几何位置和空间参考
        Point point = new Point(-118.8065, 34.0005, SpatialReferences.getWgs84());
​
        //创建一个不透明的橙色(0xFFFF5733)点符号和一个蓝色(0xFF0063FF)轮廓符号
        SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(
                SimpleMarkerSymbol.Style.CIRCLE, -0xa8cd, 10f);
​
        SimpleLineSymbol blueOutlineSymbol = new SimpleLineSymbol(
                SimpleLineSymbol.Style.SOLID, -0xff9c01, 2f);
        simpleMarkerSymbol.setOutline(blueOutlineSymbol);
​
        //创建一个点几何图形和符号
        Graphic pointGraphic = new Graphic(point, simpleMarkerSymbol);
​
        //将点图形添加到图形叠加:出来了
        graphicsOverlay.getGraphics().add(pointGraphic);
​
        //返回修改过的mapView图层
        return mMapView;
    }
    //添加代码:向地图图层添加线
    public MapView addGraphicsLine(MapView mMapView){
​
        //创建一个图形叠加并将其添加到地图视图
        GraphicsOverlay graphicsOverlay = new GraphicsOverlay();
        mMapView.getGraphicsOverlays().add(graphicsOverlay);
​
        //开始添加线条:创建一个带有空间引用的点集合,并向其中添加三个点
        PointCollection polylinePoints = new PointCollection(SpatialReferences.getWgs84());
        polylinePoints.add(new Point(-118.8215, 34.0139));
        polylinePoints.add(new Point(-118.8148, 34.0080));
        polylinePoints.add(new Point(-118.8088, 34.0016));
​
        //从点集合创建折线几何图形
        Polyline polyline = new Polyline(polylinePoints);
​
        //为折线创建一个蓝色的线条符号
        SimpleLineSymbol polylineSymbol = new SimpleLineSymbol(
                SimpleLineSymbol.Style.SOLID, -0xff9c01, 3f);
​
        //使用折线几何图形和符号创建折线图形
        Graphic polylineGraphic = new Graphic(polyline, polylineSymbol);
​
        //将折线图形添加到图形叠加
        graphicsOverlay.getGraphics().add(polylineGraphic);
        return mMapView;
    }
​
    //添加代码:向地图图层添加面
    public MapView addGraphicsPolygon(MapView mMapView){
​
        //创建一个图形叠加并将其添加到地图视图
        GraphicsOverlay graphicsOverlay = new GraphicsOverlay();
        mMapView.getGraphicsOverlays().add(graphicsOverlay);
​
        //创建一个带有空间引用的点集合,并向其中添加五个点
        PointCollection polygonPoints = new PointCollection(SpatialReferences.getWgs84());
​
        //点(经度、纬度)(传入绘图的坐标即可)
        polygonPoints.add(new Point(-118.8189, 34.0137));
        polygonPoints.add(new Point(-118.8067, 34.0215));
        polygonPoints.add(new Point(-118.7914, 34.0163));
        polygonPoints.add(new Point(-118.7959, 34.0085));
        polygonPoints.add(new Point(-118.8085, 34.0035));
        polygonPoints.add(new Point(-118.8085, 34.0098));
​
        //从点集合创建多边形几何图形
        Polygon polygon = new Polygon(polygonPoints);
​
        //那个blueOutLineSymbol
        SimpleLineSymbol blueOutlineSymbol = new SimpleLineSymbol(
                SimpleLineSymbol.Style.SOLID, -0xff9c01, 2f);
​
        //创建一个橙色填充符号,透明度为20%,蓝色简单线条符号
        SimpleFillSymbol polygonFillSymbol =
                new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, -0x7f00a8cd, blueOutlineSymbol);
​
        //从多边形几何图形和符号创建一个多边形图形
        Graphic polygonGraphic = new Graphic(polygon, polygonFillSymbol);
​
        //将多边形图形添加到图形叠加
        graphicsOverlay.getGraphics().add(polygonGraphic);
​
        return mMapView;
    }
}

MainActivity

package mapandscenes.addPTS;
​
import androidx.appcompat.app.AppCompatActivity;
​
​
import android.os.Bundle;
​
​
import com.cdqiantuo.arcgissdklearn.R;
import com.esri.arcgisruntime.mapping.view.MapView;
​
​
​
​
/*
* ArcGis 地图添加点线面*/
public class MainActivity extends AppCompatActivity {
​
    private MapView mMapView;
    //实例化工具类
    private ArcGisUtils utils = new ArcGisUtils();
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        //去掉水印;
        utils.removeWatermark();
        //设置API_KEY
        utils.setAPI_KEY();
        //初始化MapView
        mMapView = findViewById(R.id.mapView2);
        //调用mapViewInit(),对mapView实例进行初始化操作
        utils.mapViewInit(mMapView);
​
        //添加点
        utils.addGraphicsPoint(mMapView);
        //添加线
        utils.addGraphicsLine(mMapView);
        //添加面
        utils.addGraphicsPolygon(mMapView);
    }
​
    @Override
    protected void onPause() {
        mMapView.pause();
        super.onPause();
    }
​
    @Override
    protected void onResume() {
        super.onResume();
        mMapView.resume();
    }
​
    @Override
    protected void onDestroy() {
        mMapView.dispose();
        super.onDestroy();
    }
}

\