Android 加载天地图
生活随笔
收集整理的這篇文章主要介紹了
Android 加载天地图
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Android? 通過ArcGis 來加載天地圖,研究了一個星期 整理成了一個小demo,附上部分源碼,底部附上源碼demo,
package com.luao.arcgisdemo;import android.Manifest; import android.annotation.SuppressLint; import android.app.admin.SystemUpdateInfo; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.os.Build; import android.support.annotation.DrawableRes; import android.support.annotation.NonNull; import android.support.annotation.RequiresApi; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.TextView;import com.esri.arcgisruntime.geometry.Point; import com.esri.arcgisruntime.geometry.SpatialReference; import com.esri.arcgisruntime.layers.ArcGISTiledLayer; import com.esri.arcgisruntime.layers.WebTiledLayer; import com.esri.arcgisruntime.location.LocationDataSource; import com.esri.arcgisruntime.mapping.ArcGISMap; import com.esri.arcgisruntime.mapping.view.Graphic; import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; import com.esri.arcgisruntime.mapping.view.LocationDisplay; import com.esri.arcgisruntime.mapping.view.MapView; import com.esri.arcgisruntime.symbology.PictureMarkerSymbol; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.luao.arcgisdemo.entity.SysUnitInfo; import com.luao.arcgisdemo.gisutils.ArcGisUtil; import com.luao.arcgisdemo.gisutils.PermissionUtils; import com.luao.arcgisdemo.gisutils.SecondActivity; import com.luao.arcgisdemo.gisutils.TianDiMapUtils;import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Scanner;public class MainActivity extends AppCompatActivity implements PermissionUtils.PermissionCallbacks{private MapView mMapView;private ArcGISMap map;private WebTiledLayer imageBaseMap;private WebTiledLayer imageBaseMapAnno;private WebTiledLayer vectorBaseMap;private WebTiledLayer vectorBaseMapAnno;private WebTiledLayer terrainBaseMap;private WebTiledLayer terrainBaseMapAnno;private Point center;/*** 坐標系*/final SpatialReference wgs84 = SpatialReference.create(4326);/*** 加載的圖層*/private ArcGISTiledLayer tiledLayerBaseMap;/*** 圖層切換按鈕*/private TextView layerChangeBtn;/*** 當前圖層*/private int currentLayer;/*** 泵站信息list*/private List<Graphic> graphicListPump;/*** 水廠圖層list*/private List<Graphic> graphicListWaterStation;/*** 設備列表*/private List<SysUnitInfo> sysUnitInfos;/*** 泵站圖層*/private GraphicsOverlay graphicsOverlayPump;/*** 水清圖層*/private GraphicsOverlay graphicsOverlayWaterStation;/*** 功能根據*/private ArcGisUtil arcGisUtil;/*** 點擊彈窗*/private TextView calloutContent;private LocationDisplay mLocationDisplay;@RequiresApi(api = Build.VERSION_CODES.M)private static final int REQUEST_PERMISSION_CODE = 0;private String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION};@SuppressLint("NewApi")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mMapView = findViewById(R.id.gis_map);layerChangeBtn = findViewById(R.id.layerChangeBtn);arcGisUtil = new ArcGisUtil(this, mMapView);final SpatialReference SRID_MERCATOR = SpatialReference.create(102100);map = new ArcGISMap(SRID_MERCATOR);center = new Point(106.4360552458, 38.2487400748, SpatialReference.create(4326));imageBaseMap = TianDiMapUtils.getTianDiMap(TianDiMapUtils.MapType.URL_CN_IMAGEBASEMAP);imageBaseMapAnno = TianDiMapUtils.getTianDiMap(TianDiMapUtils.MapType.URL_CN_IMAGEBASEMAP_ANNOTATION);terrainBaseMap = TianDiMapUtils.getTianDiMap(TianDiMapUtils.MapType.URL_CN_TERRAINBASEMAP);terrainBaseMapAnno = TianDiMapUtils.getTianDiMap(TianDiMapUtils.MapType.URL_CN_TERRAINBASEMAP_ANNOTATION);vectorBaseMap = TianDiMapUtils.getTianDiMap(TianDiMapUtils.MapType.URL_CN_VECTORBASEMAP);vectorBaseMapAnno = TianDiMapUtils.getTianDiMap(TianDiMapUtils.MapType.URL_CN_VECTORBASEMAP_ANNOTATION);final List<WebTiledLayer> imageBaseMapLayerList = new ArrayList<>();imageBaseMapLayerList.add(imageBaseMap);imageBaseMapLayerList.add(imageBaseMapAnno);final List<WebTiledLayer> terrainBaseMapLayerList = new ArrayList<>();terrainBaseMapLayerList.add(terrainBaseMap);terrainBaseMapLayerList.add(terrainBaseMapAnno);final List<WebTiledLayer> vectorBaseMapLayerList = new ArrayList<>();vectorBaseMapLayerList.add(vectorBaseMap);vectorBaseMapLayerList.add(vectorBaseMapAnno);map.setMaxScale(TianDiMapUtils.getSCALES()[TianDiMapUtils.getSCALES().length - 1]);mMapView.setMap(map);map.getOperationalLayers().addAll(imageBaseMapLayerList);imageBaseMap.loadAsync();imageBaseMapAnno.loadAsync();terrainBaseMap.loadAsync();terrainBaseMapAnno.loadAsync();vectorBaseMap.loadAsync();vectorBaseMapAnno.loadAsync();if (PermissionUtils.hasPermissions(this, permissions)) {startLocation();} else {PermissionUtils.requestPermissions(this, REQUEST_PERMISSION_CODE, permissions);}layerChangeBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {map.getOperationalLayers().clear();currentLayer++;switch (currentLayer % 3) {case 0:map.getOperationalLayers().addAll(imageBaseMapLayerList);break;case 1:map.getOperationalLayers().addAll(terrainBaseMapLayerList);break;case 2:map.getOperationalLayers().addAll(vectorBaseMapLayerList);break;default:map.getOperationalLayers().addAll(imageBaseMapLayerList);break;}}});calloutContent = new TextView(this);calloutContent.setTextColor(Color.BLACK);calloutContent.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, SecondActivity.class);startActivity(intent);}});arcGisUtil.setOnClickMapListener(new ArcGisUtil.OnClickMapListener() {@Overridepublic void onClickMap(Graphic graphicsFromLayer, Point point) {Object name = graphicsFromLayer.getAttributes().get("name");if (name != null) {calloutContent.setText(name.toString());arcGisUtil.showPop(calloutContent, point);}}});loadUnitMarkerData();}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);PermissionUtils.onRequestPermissionsResult(requestCode, permissions, grantResults, this);}@Overridepublic void onPermissionsAllGranted(int requestCode, List<String> perms, boolean isAllGranted) {if (isAllGranted) {startLocation();}}@Overridepublic void onPermissionsDenied(int requestCode, List<String> perms) {}private void startLocation() {mLocationDisplay = mMapView.getLocationDisplay();mLocationDisplay.setAutoPanMode(LocationDisplay.AutoPanMode.NAVIGATION);//當我們執行LocationDisplay.startAsync()方法時候,會在地圖上顯示出我們當前位置mLocationDisplay.startAsync();//獲取的點是基于當前地圖坐標系的點Point point = mLocationDisplay.getMapLocation();Log.d("xyh1", "point: " + point.toString());//獲取基于GPS的位置信息LocationDataSource.Location location = mLocationDisplay.getLocation();//基于WGS84的經緯度坐標。Point point1 = location.getPosition();if (point1 != null) {Log.d("xyh2", "point1: " + point1.toString());}// //如果要在LocationDisplay里進行位置信息的自動監聽,方法也很簡單,只需要LocationDisplay.addLocationChangedListener即可 // mLocationDisplay.addLocationChangedListener(new LocationDisplay.LocationChangedListener() { // @Override // public void onLocationChanged(LocationDisplay.LocationChangedEvent locationChangedEvent) { // LocationDataSource.Location location = locationChangedEvent.getLocation(); // Log.d("xyh", "onLocationChanged: " + location.getPosition().toString()); // } // });}public static String getOriginalFundData(Context context) {InputStream input = null;try {input = context.getAssets().open("unit.json");String json = convertStreamToString(input);return json;} catch (Exception e) {e.printStackTrace();}return null;}private static String convertStreamToString(java.io.InputStream is) {String s = null;try {Scanner scanner = new Scanner(is, "UTF-8").useDelimiter("\\A");if (scanner.hasNext()) {s = scanner.next();}is.close();} catch (IOException e) {e.printStackTrace();}return s;}/*** 加載地圖marker元素數據*/private void loadUnitMarkerData() {String unitDataJson = getOriginalFundData(this);List<SysUnitInfo> sysUnitInfoList = new Gson().fromJson(unitDataJson, new TypeToken<List<SysUnitInfo>>() {}.getType());//添加點graphicsOverlayPump = arcGisUtil.addGraphicsOverlay();graphicsOverlayWaterStation = arcGisUtil.addGraphicsOverlay();PictureMarkerSymbol iconPump = new PictureMarkerSymbol(new BitmapDrawable(changeSize(R.drawable.gis_ic_bengzhan)));PictureMarkerSymbol iconWaterStation = new PictureMarkerSymbol(new BitmapDrawable(changeSize(R.drawable.gis_ic_shuichang)));graphicListPump = new ArrayList<>();graphicListWaterStation = new ArrayList<>();for (SysUnitInfo sysUnitInfo : sysUnitInfoList) {Point point = new Point(sysUnitInfo.getLgtd(), sysUnitInfo.getLttd(), wgs84);HashMap<String, Object> stringStringHashMap = new HashMap<>();stringStringHashMap.put("name", sysUnitInfo.getName());if (sysUnitInfo.getKey1().equals("1")) {graphicListPump.add(new Graphic(point, stringStringHashMap, iconPump));} else if (sysUnitInfo.getKey1().equals("5")) {graphicListWaterStation.add(new Graphic(point, stringStringHashMap, iconWaterStation));}}graphicsOverlayPump.getGraphics().addAll(graphicListPump);graphicsOverlayWaterStation.getGraphics().addAll(graphicListWaterStation);}/*** 移動地圖中心** @param point 中心點*/private void moveMapCenter(Point point) {mMapView.setViewpointCenterAsync(point, TianDiMapUtils.getSCALES()[11]);}/*** 圖片資源大小不契合,需要縮放** @param drawable 圖片資源* @return 新的圖片資源*/private Bitmap changeSize(@DrawableRes int drawable) {Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), drawable);int originalWidth = originalBitmap.getWidth();int originalHeight = originalBitmap.getHeight();int newWidth = 30;int newHeight = 70; // 自定義 高度 暫時沒用float scale = ((float) newHeight) / originalHeight;Matrix matrix = new Matrix();matrix.postScale(scale, scale);return Bitmap.createBitmap(originalBitmap, 0, 0,originalWidth, originalHeight, matrix, true);//你的 ImageView} }demo下載地址:Android通過Arcgis加載天地圖-Android文檔類資源-CSDN下載通過Arcgis加載天地圖,并且定位到當前,同時可以生成maker,并添加點擊事件,,如果地圖加載更多下載資源、學習資料請訪問CSDN下載頻道.https://download.csdn.net/download/t747515714/48945799
總結
以上是生活随笔為你收集整理的Android 加载天地图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Taro+react开发(28)本地用r
- 下一篇: [高通MSM8909][Android7