ArcGIS Runtime 100定位类——LocationDisplay

其官方解释为:管理当前位置在显示地图里的展示,包括当前位置的信息,符号,以及随地图的平移、旋转、缩放等进行自动变化。

也就是有了这个类,不仅可以获取当前位置信息进行定位,也可以将位置信息展示出来。

api:

https://developers.arcgis.com/android/latest/apireference/reference/com/esri/arcgisruntime/mapping/view/LocationDisplay.html

定位权限

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

直接上代码:

public class LocationActivity extends AppCompatActivity implements PermissionUtils.PermissionCallbacks {private static final int REQUEST_PERMISSION_CODE = 0;private MapView mMapView;private LocationDisplay mLocationDisplay;private String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_location);mMapView = (MapView) findViewById(R.id.mapview);String theURLString = "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer";ArcGISTiledLayer mainArcGISTiledLayer = new ArcGISTiledLayer(theURLString);Basemap mainBasemap = new Basemap(mainArcGISTiledLayer);ArcGISMap arcGISMap = new ArcGISMap(mainBasemap);mMapView.setMap(arcGISMap);if (PermissionUtils.hasPermissions(this, permissions)) {startLocation();} else {PermissionUtils.requestPermissions(this, REQUEST_PERMISSION_CODE, permissions);}}@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.RECENTER);//当我们执行LocationDisplay.startAsync()方法时候,会在地图上显示出我们当前位置mLocationDisplay.startAsync();//获取的点是基于当前地图坐标系的点Point point = mLocationDisplay.getMapLocation();Log.e("xyh", "point: " + point.toString());//获取基于GPS的位置信息LocationDataSource.Location location = mLocationDisplay.getLocation();//基于WGS84的经纬度坐标。Point point1 = location.getPosition();if (point1 != null) {Log.e("xyh", "point1: " + point1.toString());}//如果要在LocationDisplay里进行位置信息的自动监听,方法也很简单,只需要LocationDisplay.addLocationChangedListener即可mLocationDisplay.addLocationChangedListener(new LocationDisplay.LocationChangedListener() {@Overridepublic void onLocationChanged(LocationDisplay.LocationChangedEvent locationChangedEvent) {LocationDataSource.Location location = locationChangedEvent.getLocation();Log.e("xyh", "onLocationChanged: " + location.getPosition().toString());}});}@Overrideprotected void onPause() {super.onPause();mMapView.pause();}@Overrideprotected void onResume() {super.onResume();mMapView.resume();}@Overrideprotected void onDestroy() {super.onDestroy();mMapView.dispose();}
}

结束定位

 if (mLocationDisplay.isStarted())mLocationDisplay.stop();

位置监听的自动扫描模式

位置监听的自动扫描模式可能有点拗口,算是对于这个功能的直译吧。这个功能的意思是当你的位置信息变化时候,如何在地图上展示出来。

使用方法为:LocationDisplay.setAutoPanMode(LocationDisplay.AutoMode)。

模式一共有四种:

COMPASS_NAVIGATION 和NAVIGATION 分别最适用于步行导航和车载导航,用户的位置符号会固定显示在屏幕的某个点上,并且指向设备的顶部(也就是地图会随着用户移动而平移,随用户转弯而旋转);

OFF 模式,用户位置符号会随位置变化而移动,但地图不会动;

RECENTER模式,当用户位置处于当前地图范围内时候,用户位置符号会随位置变化而移动,但地图不会动;当用户位置处于地图边缘时候,地图会自动平移是用户的当前位置重新居于显示地图中心。

LocationDisplay类里可以直接设置位置符号样式

当我们执行LocationDisplay.startAsync()方法时候,会在地图上显示出我们当前位置,默认的符号如下所示:

如果我们想要改变这个符号样式,只需要重新设置符号即可,代码如下所示:

locationDisplay = mMapView.getLocationDisplay();
Resources resources=getResources();
BitmapDrawable bitmapDrawable= new BitmapDrawable(BitmapFactory.decodeResource(resources,R.drawable.location));
final PictureMarkerSymbol campsiteSymbol = new PictureMarkerSymbol(bitmapDrawable);
campsiteSymbol.loadAsync();
campsiteSymbol.addDoneLoadingListener(new Runnable() {@Overridepublic void run() {locationDisplay.setDefaultSymbol(campsiteSymbol);//设置默认符号locationDisplay.setShowAccuracy(false);//隐藏符号的缓存区域}
});

对于位置符号的设置有以下几种:

locationDisplay.setAcquiringSymbol(campsiteSymbol);//设置当前位置的填充符号
locationDisplay.setAccuracySymbol(campsiteSymbol);//设置最后一个已知位置的标记符号
locationDisplay.setPingAnimationSymbol(campsiteSymbol);//设置当前位置更新时候的动画
locationDisplay.setCourseSymbol(campsiteSymbol);//设置当前位置的路线符号
locationDisplay.setHeadingSymbol(campsiteSymbol);//设置当前位置设备面对方向的符号
locationDisplay.setDefaultSymbol(campsiteSymbol);//设置默认符号

位置符号隐藏

在ArcGIS Runtime 100里假如我们只是想获取位置信息,而不需要显示出来,我们只需要将位置监听的模式设置为OFF,然后执行以下代码即可。

locationDisplay.setShowLocation(false);//隐藏符号
locationDisplay.setShowAccuracy(false);//隐藏符号的缓存区域
locationDisplay.setShowPingAnimation(false);//隐藏位置更新的符号动画

PermissionUtils:

/*** 动态申请权限工具类* Created by xiaoyehai on 2018/4/25 0025.*/public class PermissionUtils {public static final int GOTO_SEETING_CODE = 152;/*** 判断是否有权限** @param context* @param perms* @return*/public static boolean hasPermissions(@NonNull Context context, @Size(min = 1) @NonNull String... perms) {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {return true;}if (context == null) {throw new IllegalArgumentException("Can't check permissions for null context");}for (String perm : perms) {if (ContextCompat.checkSelfPermission(context, perm) != PackageManager.PERMISSION_GRANTED) {return false;}}return true;}/*** 申请权限*/public static void requestPermissions(@NonNull Activity activity, int requestCode, String[] permissions) {List<String> permissionList = new ArrayList<>();for (String permission : permissions) {if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {permissionList.add(permission);}}String[] permissionsArray = permissionList.toArray(new String[permissionList.size()]);//将List转为数组if (permissionList.isEmpty()) {//不可能为空} else {ActivityCompat.requestPermissions(activity, permissionsArray, requestCode);//返回结果onRequestPermissionsResult}}/*** 申请权限的回调** @param requestCode  请求权限时传入的请求码,用于区别是哪一次请求的* @param permissions  所请求的所有权限的数组* @param grantResults 权限授予结果,和 permissions 数组参数中的权限一一对应,元素值为两种情况,如下:*                     授予: PackageManager.PERMISSION_GRANTED*                     拒绝: PackageManager.PERMISSION_DENIED*/public static void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults, @NonNull PermissionCallbacks callBack) {//授予的权限。List<String> granted = new ArrayList<>();//拒绝的权限List<String> denied = new ArrayList<>();for (int i = 0; i < permissions.length; i++) {String perm = permissions[i];if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {granted.add(perm);} else {denied.add(perm);}}if (null != callBack) {if (denied.isEmpty()) {callBack.onPermissionsAllGranted(requestCode, granted, denied.isEmpty());}if (!denied.isEmpty()) {callBack.onPermissionsDenied(requestCode, denied);}}}/*** 用户是否拒绝权限,并检查“不要提醒”。** @param activity* @param perms* @return*/public static boolean somePermissionPermanentlyDenied(Activity activity, @NonNull List<String> perms) {for (String deniedPermission : perms) {if (permissionPermanentlyDenied(activity, deniedPermission)) {return true;}}return false;}public static boolean permissionPermanentlyDenied(Activity activity, @NonNull String perms) {if (!ActivityCompat.shouldShowRequestPermissionRationale(activity, perms)) {return true;}return false;}public static void showDialogGoToAppSettting(final Activity activity) {AlertDialog dialog = new AlertDialog.Builder(activity).setMessage("去设置界面开启权限").setPositiveButton("确定", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {// 跳转到应用设置界面goToAppSetting(activity);}}).setCancelable(false).show();}/*** 跳转到应用设置界面*/public static void goToAppSetting(Activity activity) {Intent intent = new Intent();intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);Uri uri = Uri.fromParts("package", activity.getPackageName(), null);intent.setData(uri);activity.startActivityForResult(intent, GOTO_SEETING_CODE);}public static void showPermissionReason(final int requestCode, final Activity activity, final String[] permission, String s) {AlertDialog dialog = new AlertDialog.Builder(activity).setMessage(s).setPositiveButton("确定", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {requestPermissions(activity, requestCode, permission);}}).setCancelable(false).show();}public interface PermissionCallbacks {/*** @param isAllGranted 是否全部同意*/void onPermissionsAllGranted(int requestCode, List<String> perms, boolean isAllGranted);/***/void onPermissionsDenied(int requestCode, List<String> perms);}
}

下面来看看官方的例子

public class DisplayDeviceLocationActivity extends AppCompatActivity {private MapView mMapView;private LocationDisplay mLocationDisplay;private Spinner mSpinner;private int requestCode = 2;String[] reqPermissions = new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_display_device_location);mSpinner = (Spinner) findViewById(R.id.spinner);mMapView = (MapView) findViewById(R.id.mapView);ArcGISMap mMap = new ArcGISMap(Basemap.createImagery());mMapView.setMap(mMap);mLocationDisplay = mMapView.getLocationDisplay();// 监听位置数据源状态的更改mLocationDisplay.addDataSourceStatusChangedListener(new LocationDisplay.DataSourceStatusChangedListener() {@Overridepublic void onStatusChanged(LocationDisplay.DataSourceStatusChangedEvent dataSourceStatusChangedEvent) {// If LocationDisplay started OK, then continue.if (dataSourceStatusChangedEvent.isStarted())return;// No error is reported, then continue.if (dataSourceStatusChangedEvent.getError() == null)return;// If an error is found, handle the failure to start.// Check permissions to see if failure may be due to lack of permissions.boolean permissionCheck1 = ContextCompat.checkSelfPermission(DisplayDeviceLocationActivity.this, reqPermissions[0]) ==PackageManager.PERMISSION_GRANTED;boolean permissionCheck2 = ContextCompat.checkSelfPermission(DisplayDeviceLocationActivity.this, reqPermissions[1]) ==PackageManager.PERMISSION_GRANTED;if (!(permissionCheck1 && permissionCheck2)) {ActivityCompat.requestPermissions(DisplayDeviceLocationActivity.this, reqPermissions, requestCode);} else {// Report other unknown failure types to the user - for example, location services may not// be enabled on the device.String message = String.format("Error in DataSourceStatusChangedListener: %s", dataSourceStatusChangedEvent.getSource().getLocationDataSource().getError().getMessage());Toast.makeText(DisplayDeviceLocationActivity.this, message, Toast.LENGTH_LONG).show();// Update UI to reflect that the location display did not actually startmSpinner.setSelection(0, true);}}});// Populate the list for the Location display options for the spinner's AdapterArrayList<ItemData> list = new ArrayList<>();list.add(new ItemData("Stop", R.drawable.locationdisplaydisabled));list.add(new ItemData("On", R.drawable.locationdisplayon));list.add(new ItemData("Re-Center", R.drawable.locationdisplayrecenter));list.add(new ItemData("Navigation", R.drawable.locationdisplaynavigation));list.add(new ItemData("Compass", R.drawable.locationdisplayheading));SpinnerAdapter adapter = new SpinnerAdapter(this, R.layout.spinner_layout, R.id.txt, list);mSpinner.setAdapter(adapter);mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {switch (position) {case 0:// Stop Location Displayif (mLocationDisplay.isStarted())mLocationDisplay.stop();break;case 1:// Start Location Displayif (!mLocationDisplay.isStarted())mLocationDisplay.startAsync();break;case 2:// RECENTER模式,当用户位置处于当前地图范围内时候,用户位置符号会随位置变化而移动,但地图不会动;// 当用户位置处于地图边缘时候,地图会自动平移是用户的当前位置重新居于显示地图中心。mLocationDisplay.setAutoPanMode(LocationDisplay.AutoPanMode.RECENTER);if (!mLocationDisplay.isStarted())mLocationDisplay.startAsync();break;case 3:// Start Navigation Mode// 这种模式最适合于车载导航。mLocationDisplay.setAutoPanMode(LocationDisplay.AutoPanMode.NAVIGATION);if (!mLocationDisplay.isStarted())mLocationDisplay.startAsync();break;case 4:// Start Compass Mode// 这种模式更适合用户行走时的路标导航。mLocationDisplay.setAutoPanMode(LocationDisplay.AutoPanMode.COMPASS_NAVIGATION);if (!mLocationDisplay.isStarted())mLocationDisplay.startAsync();break;}}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}});}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {mLocationDisplay.startAsync();} else {Toast.makeText(DisplayDeviceLocationActivity.this, "权限被拒绝", Toast.LENGTH_SHORT).show();mSpinner.setSelection(0, true);}}@Overrideprotected void onPause() {super.onPause();mMapView.pause();}@Overrideprotected void onResume() {super.onResume();mMapView.resume();}@Overrideprotected void onDestroy() {super.onDestroy();mMapView.dispose();}
}

ArcGIS for Android 100.3.0(9):GPS定位相关推荐

  1. ArcGIS for Android 100.3.0(10):Callout的使用

    通过调用从MapView的getCallout()获取Callout对象. 官方API: https://developers.arcgis.com/android/latest/api-refere ...

  2. arcgis for Android 100.3.0 加载shp数据以及操作

    ArcGIS Runtime 100.2.0的正式发布带来个更多移动端的处理地图的能力,例如支持WMS图层.支持海图(ENC)图层,再如基于场景相机(Camera)的视域分析.同时还提供了新的统计查询 ...

  3. ArcGIS for Android 100.3.0(20):加载天地图

    天地图官网: http://lbs.tianditu.gov.cn/home.html 需要到天地图官网去创建应用,申请应用Key. 对天地图和ArcGIS参数不太清楚的可以参考: http://bl ...

  4. ArcGIS for Android 100.3.0(6):动态地图图层(ArcGISMapImageLayer和ArcGISMapImageSublayer)

    动态地图图层ArcGISMapImageLayer是通过访问动态地图服务MapService获取的,里面包含的是一个子图层集合SublayerList,通过这个子图层集合可以构造得到每个动态地图图层A ...

  5. ArcGIS for Android 100.3.0(14):移动地图包MMPK的使用

    MobileMapPackage 移动地图包是ArcGIS Pro里新推出的一种离线地图数据,配合ArcGIS Runtime 100使用. 移动地图包是一个以".mmpk"结尾的 ...

  6. arcgis for Android 100.2 绘制点线面(文末有三维地图)

    这是这阶段arcgis for Android 的最后一篇了,前面有三篇.对于我经常使用坐标,进行绘制点线面图形的程序员,这个必须要的.因为在项目中经常用到. arcgis for Android 1 ...

  7. arcgis for Android 100.1 在线加载天地图和谷歌地图

    距离上一篇arcgis for Android 已经很久.其实年初的时候就测试了arcgis for Android 100.1版本.搜集网上各篇文章,最后自已测试代码.修改代码.这一篇来讲一下加载在 ...

  8. arcgis for Android 100.4 面积测量

    arcgis for Android 100.4 面积测量为负时进行拓扑简化就行了.

  9. android动态获取地理位置权限,Android6.0获取GPS定位和获取位置权限和位置信息的方法...

    1.添加权限--6.0之后要动态获取,下面会说 2.直接上代码,不多说,代码中注释很详细. private static final int BAIDU_READ_PHONE_STATE = 100; ...

最新文章

  1. 曾经的全国重点大学,如今表现如何?2020年最新排名出炉!
  2. 用 Docker 构建、运行、发布来一个 Spring Boot 应用
  3. Postman请求linux服务器报错:503Forwarding failure,由于服务器端口未开放;服务器端口开放与关闭
  4. 通过 html5 FileReader 实现上传图片预览功能
  5. 关于iar加st-link,报出SWIM error [30200]错误,我自己处理的方法,usb重新插拔
  6. [jQuery]3D效果的标签云
  7. LeetCode 277. 搜寻名人(思维题)
  8. JAVA核心:内存、比较和Final
  9. 【水果识别】基于matlab GUI橙子数量识别【含Matlab源码 1821期】
  10. 颠覆传统网络管理 Aruba新一代网络解决方案重磅呈现
  11. redhat装java_redhat下安装java
  12. 【人工智能】人工智能二——遗传算法的基本概念遗传算法的基本算法(编码群体设定适应度函数选择交叉变异遗传算法步骤)解决带约束的函数优化问题多目标的遗传算法遗传算法的改进算法
  13. 金山词霸 for linux,在Linux下使用金山词霸2003
  14. 郑捷《机器学习算法原理与编程实践》学习笔记(第五章 梯度寻优)5.2 Logistic梯度下降法...
  15. C++面试之Linux操作系统
  16. 手把手教你实现百度基础地图+定位功能+设置中心点+添加Marker
  17. 简单的md5加密数据及密码复杂度校验
  18. SQL查询cross join 的用法(笛卡尔积)
  19. 【论文阅读+测试】Real-Esrgan超分辨率算法
  20. numpy 数组和矩阵的乘法的理解

热门文章

  1. i37100黑苹果_【台式机】i3-7100 微星 B250M PRO-V GTX 660 10.13.6黑苹果引导_Hackintosh_Clover...
  2. 5分钟教你部署和使用最新的Cisco Packet Tracer
  3. 动态心电图监测系统市场现状及未来发展趋势
  4. iMazing 一款替代iTunes的数据备份软件
  5. 2022新版Git教程 从入门到实战(三)Git分支管理
  6. 微信小程序嵌入Udesk即时通讯网页插件
  7. Udesk微信小程序即时通讯开发入门(二、代码篇)
  8. 物理机上架设云服务器
  9. 微服务:MQClientException: No route info of this topic, mytopic 报错解决
  10. 从无到有跑通KAPAO