1.为什么升级100.0
我之前在公司做地图一直用的是arcgis10.2,经过多年的开发,这个版本的工具类封装的非常方便,自己也没有时间去换100.0的版本。但是突然有一天工程反馈说他的9.0的安卓手机打开地图直接崩溃,在网上找了半天没有解决arcgis10在9.0手机上的兼容问题,所以只好去换最先的100.0了。但是100.0与10.0的api完全不同,在开发中踩了许多坑,所以了这篇文章希望能帮到之后遇到同样问题的同学。
下面代码如果有错误请大神指出,我会及时改正
2.集成ArcGIS Runtime SDK
集成方式在官方文档中有介绍
1.首先要在build.gradle文件中添加Esri的仓库
allprojects {
repositories {
google()
jcenter()
maven {
url 'https://esri.bintray.com/arcgis'
}
}
}
2.第二步添加依赖
dependencies {
implementation 'com.esri.arcgisruntime:arcgis-android:100.4.0'
}
3.根据官方文档要求在app模块build.gradle文件中添加如下代码设置java兼容版本
android {
[...]
module.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
4.最后一步添加权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
3.代码
首先直接上全部代码
public class MainPresenter extends BasePresenter implements MainContract.Presenter {
public static final String POLYLINE = "POLYLINE";//测量距离
public static final String POLYGON = "POLYGON";//测量面积
public static final String IDENTIFY = "IDENTIFY";//要素识别
public static final String NULL = "NULL";//什么都不做
private MapView mapView;
private ArcGISMap arcGISMap;
private GraphicsOverlay graphicsOverlay;
private String MapOperationType = NULL;
boolean isCanRotate = true;
private View contentview;
private TextView tv;
private ImageView iv;
private Callout callout;
private final MainContract.View iView;
private DecimalFormat df;
private SimpleDateFormat formatter;
Map<String,List<LayerFieldBean.FieldModels>> map=new HashMap<>();
public MainPresenter(BaseContract.View view) {
super(view);
iView = (MainContract.View) getmView();
}
//初始化地图
@SuppressLint("ClickableViewAccessibility")
@Override
public void initMap() {
mapView = iView.getMapView();
mapView.setAttributionTextVisible(false);
arcGISMap = new ArcGISMap();
//底图地址
String theURLString = common.Constance.BASE_MAP;
ArcGISTiledLayer mainArcGISVectorTiledLayer = new ArcGISTiledLayer(theURLString);
arcGISMap.setBasemap(new Basemap(mainArcGISVectorTiledLayer));
mapView.setMap(arcGISMap);
//新建并添加绘画图层
graphicsOverlay = new GraphicsOverlay();
mapView.getGraphicsOverlays().add(graphicsOverlay);
//添加地图的点击事件监听
mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(iView.getContext(), mapView) {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
switch (MapOperationType) {
case NULL:
return super.onSingleTapConfirmed(e);
case POLYLINE:
//距离测量
Point clickPoint = mapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
MeasuringDistance(clickPoint);
return true;
case POLYGON:
//测量面积
Point clickPoint2 = mapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
MeasuringArea(clickPoint2);
return true;
case IDENTIFY:
//要素识别
android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY()));
if (arcGISMap.getOperationalLayers().size() > 0) {
// IdentifyFeatures(screenPoint);
IdentifyAllFeatures(screenPoint);
} else {
iView.showError(R.string.not_cxmap_error);
}
return true;