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 加载天地图相关推荐
- Arcgis For Android 加载天地图(拥有缓存功能)
天地图做为国家发布的地理信息公共服务平台,"天地图"网站装载了覆盖全球的地理信息数据,这些数据以矢量.影像.三维3种模式全方位.多角度展现,可漫游.能缩放,具有多类型全面的地理信息 ...
- 天地图 android studio,AndroidStudio 加载 天地图 (2019年后开发授权申请)
本文主要内容讲述从申请天地图开发授权到AndroidStudio3.0加载天地图官网快速入门Demo的整个过程.对于刚出入AndroidStudio和天地图开发的小白有一定的帮助. 1.申请天地图密钥 ...
- arcgis for Android 100.1 在线加载天地图和谷歌地图
距离上一篇arcgis for Android 已经很久.其实年初的时候就测试了arcgis for Android 100.1版本.搜集网上各篇文章,最后自已测试代码.修改代码.这一篇来讲一下加载在 ...
- Android Arcgis入门(12)、加载天地图
在项目中可以经常需要动态加载一些图层,像投影地图服务.投影地图服务器.其实网上有大量这样的服务,比如天地图官网, . 随便点开一个服务,里面有相关的信息.那如何加载这样图层服务呢. 一.首先感谢这篇博 ...
- arcgis android 天地图,Arcgis runtime for Android 100.5 加载天地图
说明一下,什么时候加载高德地图,什么时候加载天地图 使用原生定位或者使用arcgis提供的LocationDisplay的定位时,需要加载天地图,因为原生定位返回的坐标是wgs84的坐标,而高德地图是 ...
- Arcgis for android 加载谷歌、高德和天地图
1.加载谷歌地图 工具类: package com.chy.google;import com.esri.arcgisruntime.arcgisservices.LevelOfDetail; imp ...
- Vue+Openlayers实现加载天地图WMTS服务显示
场景 Vue中使用Openlayers加载OSM(Open Street Map)显示街道地图: Vue中使用Openlayers加载OSM(Open Street Map)显示街道地图_BADAO_ ...
- leaflet加载天地图
概述: leaflet是一个轻量级的并且开源的地图框架,是由esri发起的,由于其轻量.简单而被大家喜欢,本文带你学习如何在leaflet中加载天地图. 实现: leaflet加载天地图比较简单,做了 ...
- 关于 android 加载 res 图片 out of memory 问题 解决 同样适用于 sd卡图片
2019独角兽企业重金招聘Python工程师标准>>> 发现android 加载res图片如果过多也会崩溃 android 也是使用 Bitmap bm = BitmapFacto ...
- osgEarth3.0 加载天地图
2.8版本里面有个xyz图层的例子,稍作修改就可以加载天地图的影像图层.在3.0版本中,XYZ , bing 等图层已经被移植到内核中.所以我们直接用XYZ图层来加载天地图即可 XYZImageLay ...
最新文章
- 2022-2028年中国高密度聚乙烯(HDPE)行业市场发展调研及投资前景分析报告
- Spring-Quartz (一)
- 数据结构和算法(03)---栈和队列(c++)
- 爆料喽!!!开源日志库Logger的剖析分析
- 用HTML写一个仓库管理系统,welcome.html
- 计算机一级office操作题题库百度云,不容错过!计算机等级考试题库之一级MS Office操作题与答案...
- python样条插值(二)
- ORACLE EBS 启用REST服务-1-环境安装篇
- 量子力学的计算机模拟,量子力学虚拟试验的MATLAB演示-大学物理-北京师范大学.PDF...
- 如何解决电脑桌面图标显示为空白文件?
- 生成身份证校验码(c语言)
- SQL数据库面试题以及答案(50例题优化版-增加图片):你必知必会的SQL语句练习
- c++动态存储空间分配
- 《F4+2—团队项目设计完善编码测试》
- 使用gn创建HelloWorld工程
- 10 条关于 2018 年软件开发的预测,不仅仅是区块链……
- python创业公司做什么最赚钱农村_最适合农村的创业项目,成本不超过500块,做好就能快速发家致富...
- 群晖NAS备份建议及备份方式
- amd6800h安装ubuntu22.04 笔记本休眠花屏解决办法
- mpvue开发美团外卖点餐小程序