之前做的地圖項目都是基于百度地圖或者高德地圖嗅定,這次項目里用到的是Arcgis潦蝇,自然要學(xué)習(xí)起來了暇检。
推薦看官方的文檔入門:官方文檔账锹,下載需要注冊钥顽,不過我已經(jīng)下載好了下載鏈接设预。以上都是基于10.2.9版本的惋鹅。github上也有官方示例代碼鏈接,需要10.2.9版本的話可以在Branch中選擇Tags為10.2.9的悔据,直接點擊Download ZIP下載怎燥。
1.引入
首先在Project的gradle配置中引入maven倉庫地址:
repositories {
google()
jcenter()
maven {
url 'https://esri.bintray.com/arcgis'
}
}
然后在Module的gradle配置中添加依賴:
dependencies {
......
compile 'com.esri.arcgis.android:arcgis-android:10.2.9'
}
可能會遇到Duplicate files copied in APK META-INF/LICENSE等重復(fù)文件問題
在APP的gradle文件里添加:
packagingOptions {
exclude 'META-INF/LGPL2.1'
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
}
在Manifest文件中加入:
<uses-feature
android:glEsVersion="0x00020000"
android:required="true"/>
<uses-permission android:name="android.permission.INTERNET"/>
2.顯示地圖
在XML文件中加入MapView控件:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.map.arcgistest.MainActivity">
<com.esri.android.map.MapView
android:id="@+id/mapView"
mapoptions.MapType="SATELLITE"
mapoptions.ZoomLevel="16"
mapoptions.center="30.2872234998, 120.0115407685"
android:layout_width="match_parent"
android:layout_height="400dp" />
</android.support.constraint.ConstraintLayout>
</layout>
我因為用了DataBinding所以最外層是<layout>
這樣地圖就顯示出來了,注意MapView控件中還有3個mapoptins屬性
//地圖類型:衛(wèi)星圖蜜暑,還有其他如STREETS 街道圖、OCEAN海洋圖等
//可以在MapOptions.MapType中看到
mapoptions.MapType="SATELLITE"
//縮放比例
mapoptions.ZoomLevel="16"
//地圖中心緯經(jīng)度策肝,注意“,”后還有1個空格
mapoptions.center="30.2872234998, 120.0115407685"
如果你不加mapoptions.MapType屬性肛捍,那么地圖顯示的是一片黑色,即使你用代碼設(shè)置也沒用
MapOptions mapOptions = new MapOptions(MapOptions.MapType.SATELLITE);
mapOptions.setCenter(30.2872234998,120.0115407685);
mapOptions.setZoom(10);
mActivityMainBinding.mapView.setMapOptions(mapOptions);
因為MapView只是一個容器之众,具體的內(nèi)容需要你加拙毫,這里就涉及到圖層Layer的概念,你需要添加一個圖層:
private static final String DEFAULT_BASEMAP_SERVICE_URL = "http://services.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapServer";
mapView.addLayer(new ArcGISDynamicMapServiceLayer( DEFAULT_BASEMAP_SERVICE_URL));
我這里加了一個官方的圖層棺禾,XML里mapoptions.MapType屬性可能在MapView構(gòu)造函數(shù)中加了圖層
3.Layer圖層
圖層有點像ps里的圖層缀蹄,一層一層添加在MapView中顯示。一個MapView至少需要1個圖層
圖層分為4種:
例如
? ArcGISTiledMapServiceLayer 用于顯示緩存服務(wù),瓦片地圖缺前。
? ArcGISDynamicMapServiceLayer 用于顯示動態(tài)服務(wù)蛀醉。
? ArcGISFeatureLayer 用于顯示和操作要素圖層。
? GraphicsLayer 用來在地圖上顯示一些額外的衅码,或者臨時的元素拯刁。
4.點線面的編輯
點線面的編輯主要在GraphicsLayer圖層上操作,首先給MapView添加1個GraphicsLayer圖層:
mGraphicsLayer = new GraphicsLayer();
mapView.addLayer(mGraphicsLayer);
然后要給MapView設(shè)置一個點擊事件的監(jiān)聽:
mActivityMainBinding.mapView.setOnSingleTapListener(new OnSingleTapListener() {
@Override
public void onSingleTap(float x, float y) {
//x,y就是屏幕上點擊的坐標
}
});
4.1 Point點
添加點:
//把屏幕坐標轉(zhuǎn)化為地圖上的坐標點
Point point = mapView.toMapPoint(x, y);
//點的樣式
SimpleMarkerSymbol sms = new SimpleMarkerSymbol(Color.RED, 16, SimpleMarkerSymbol.STYLE.CIRCLE);
//把點和樣式組合成一個Graphic逝段,顯示圖形的載體
Graphic graphic = new Graphic(point, sms);
//添加到圖層上顯示
mGraphicsLayer.addGraphic(graphic)
//mGraphicsLayer.addGraphic(graphic)返回的是一個int id值垛玻,表示操作的ID,刪除Graphic需要用到
//int id = mGraphicsLayer.addGraphic(graphic)
//刪除相應(yīng)的addGraphic操作
//mGraphicsLayer.removeGraphic(int id)
4.2 Polyline線
線就是多個點連成的線奶躯,有個起點
添加線:
//是否設(shè)置了起點
private boolean mIsSetStart;
Point point = mActivityMainBinding.mapView.toMapPoint(x, y);
Polyline polyline = new Polyline();
if (!mIsSetStart) {
polyline.startPath(point);
mIsSetStart = true;
} else {
polyline.lineTo(point);
}
SimpleLineSymbol sms = new SimpleLineSymbol(Color.BLUE, 16, SimpleLineSymbol.STYLE.SOLID);
Graphic graphic = new Graphic(polyline, sms);
mGraphicsLayer.addGraphic(graphic);
4.3 Polygon面
面和線類似帚桩,也有起點。
//是否設(shè)置了起點
private boolean mIsSetStart;
Polygon polygon = new Polygon();
Point point = mActivityMainBinding.mapView.toMapPoint(x, y);
if (!mIsSetStart) {
polygon.startPath(point);
mIsSetStart = true;
} else {
polygon.lineTo(point);
}
SimpleFillSymbol sms = new SimpleFillSymbol(Color.BLUE, SimpleFillSymbol.STYLE.SOLID);
Graphic graphic = new Graphic(polygon, sms);
mGraphicsIds.add(mGraphicsLayer.addGraphic(graphic));
4.4 Graphic
大家可能都發(fā)現(xiàn)了嘹黔,點線面3者流程上都一樣账嚎,不同的是構(gòu)成Graphic參數(shù)的不同。
Graphic有3個屬性:
- Geometry:圖形的地理位置信息
點—Point参淹、線—Polyline醉锄、面——Polygon - Symbol:圖形的樣式
點— SimpleMarkerSymbol、線—SimpleLineSymbol浙值、面—— SimpleFillSymbol - attributes(可選):圖形儲存的信息恳不,以Map鍵值對的方式儲存
這篇文章記錄的就這么多,很基本的內(nèi)容开呐。接下來會記錄一些具體的操作烟勋,比如Task類種的各種查詢?nèi)蝿?wù)等。