ArcGis 系列(二):为地图添加点线面
本文概述:
- 此为ArcGIS系列第二篇文章,期望借助简单Android 程序并配合ArcGIS官方文档实现为地图添加点、线、面;并且为了后期维护以及开发效率,封装了ArcGISUtils 工具类;关于基础环境介绍,请查阅个人ArcGIS系列第一篇文章:juejin.cn/post/711265…
运行截图:
工程结构:
代码展示:
布局文件: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();
}
}
\