当前位置: 首页 > news >正文

Android 利用OSMdroid开发GIS 添加 控件以及定位

部署看这个:Android 利用OSMdroid开发GIS-CSDN博客

添加控件,直接上源码

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical"><org.osmdroid.views.MapViewandroid:id="@+id/mapView"android:layout_width="match_parent"android:layout_height="match_parent"/><Buttonandroid:id="@+id/btnLocation"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="定位"android:layout_margin="10dp"android:layout_alignParentTop="true"/></RelativeLayout>

MainActivity.java: 

package com.chy.osmdroid;import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.chy.layers.LayerTileSources;
import com.chy.permission.PermissionUtils;
import org.osmdroid.api.IMapController;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.CustomZoomButtonsController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.MinimapOverlay;
import org.osmdroid.views.overlay.ScaleBarOverlay;
import org.osmdroid.views.overlay.compass.CompassOverlay;
import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider;
import org.osmdroid.views.overlay.gestures.RotationGestureOverlay;
import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider;
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay;public class MainActivity extends AppCompatActivity {private static final int REQUEST_PERMISSION_CODE = 0;// 权限所用// 动态申请权限private String[] permissions = {Manifest.permission.INTERNET,// 网络权限Manifest.permission.ACCESS_COARSE_LOCATION,// 精细定位Manifest.permission.ACCESS_FINE_LOCATION,// 粗定位Manifest.permission.ACCESS_WIFI_STATE,// 定位权限Manifest.permission.ACCESS_NETWORK_STATE,Manifest.permission.WRITE_EXTERNAL_STORAGE};private MapView mapView;private LocationManager locationManager;// 定位管理器private Button btnLocation;// 定位按钮private boolean isLocation = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);getPermission();// 获取权限initControls();}/*** 权限* */private void getPermission(){if (PermissionUtils.hasPermissions(MainActivity.this, permissions)) {initMap();// 调用初始化地图} else {PermissionUtils.requestPermissions(MainActivity.this, REQUEST_PERMISSION_CODE, permissions);Toast.makeText(getApplicationContext(), "地图加载失败!", Toast.LENGTH_SHORT).show();}}// 地图初始化private void initMap(){// 获取mapView实例mapView = findViewById(R.id.mapView);// 加载在线地图-高德地图mapView.setTileSource(LayerTileSources.AutoNaviVector);//mapView.setTileSource(LayerTileSources.TDT_IMG_W);// 设置最小缩放比例mapView.setMinZoomLevel(3.0);// 设置最大缩放比例mapView.setMaxZoomLevel(18.0);// 让瓦片适应不同像素密度:默认地图显示的字体小,图片像素高,可设置以下代码,使地图适应不同像素密度,更美观//mapView.setTilesScaledToDpi(true);IMapController mapController = mapView.getController();// 设置地图初始级别mapController.setZoom(11.0);// 设置初始中心点GeoPoint centerPoint = new GeoPoint(43.90, 125.33);mapController.setCenter(centerPoint);//启用缩放及滑动手势//mapView.setBuiltInZoomControls(true);// 废弃得方法,被下面方法所替代mapView.getZoomController().setVisibility(CustomZoomButtonsController.Visibility.NEVER);mapView.setMultiTouchControls(true);// 指南针-(不显示)CompassOverlay mCompassOverlay = new CompassOverlay(getApplicationContext(), new InternalCompassOrientationProvider(getApplicationContext()),mapView);mCompassOverlay.enableCompass();mapView.getOverlays().add(mCompassOverlay);// 小地图MinimapOverlay mMinimapOverlay = new MinimapOverlay(this, mapView.getTileRequestCompleteHandler());mMinimapOverlay.setWidth(200);mMinimapOverlay.setHeight(200);mMinimapOverlay.setTileSource(LayerTileSources.AutoNaviVector);mapView.getOverlays().add( mMinimapOverlay);// 地图旋转RotationGestureOverlay mRotationGestureOverlay = new RotationGestureOverlay(mapView);mRotationGestureOverlay.setEnabled(true);mapView.getOverlays().add(mRotationGestureOverlay);//比例尺配置ScaleBarOverlay mScaleBarOverlay = new ScaleBarOverlay(mapView);// 获取屏幕密度、宽、高等信息DisplayMetrics dm = getResources().getDisplayMetrics();float density = dm.density;// 屏幕密度(像素比例:0.75/1.0/1.5/2.0)int densityDPI = dm.densityDpi;// 屏幕密度(每寸像素:120/160/240/320)int screenWidth = dm.widthPixels;// 屏幕宽度int screenHeight = dm.heightPixels;// 屏幕高度// 比例尺显示的位置mScaleBarOverlay.setScaleBarOffset(10, screenHeight-300);mapView.getOverlays().add(mScaleBarOverlay);}// 控件初始化private void initControls(){btnLocation = findViewById(R.id.btnLocation);// 点击事件btnLocation.setOnClickListener(new View.OnClickListener() {@SuppressLint("MissingPermission")@Overridepublic void onClick(View v) {//创建位置管理器实例locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);if (!isLocation){// 注册位置监听器locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);isLocation = !isLocation;}else {// 停止位置更新locationManager.removeUpdates(locationListener);isLocation = !isLocation;Toast.makeText(getApplicationContext(),"停止位置更新",Toast.LENGTH_SHORT).show();}}});}/*** 定位监听* */LocationListener locationListener = new LocationListener() {@Overridepublic void onLocationChanged(Location location) {// 处理位置变化double latitude = location.getLatitude();double longitude = location.getLongitude();Toast.makeText(getApplicationContext(),"lat:"+latitude+"lon:"+longitude,Toast.LENGTH_SHORT).show();// 在地图上显示当前位置// 定位MyLocationNewOverlay mLocationOverlay = new MyLocationNewOverlay(new GpsMyLocationProvider(getApplicationContext()), mapView);mLocationOverlay.enableMyLocation();// osmdroid获取的坐标点为空// GeoPoint myLocation = mLocationOverlay.getMyLocation();// 使用本机获取的经纬度-设置经纬度GeoPoint myLocation = new GeoPoint(latitude,longitude);mapView.getController().setZoom(18.0);mapView.getController().setCenter(myLocation);mapView.getOverlays().add(mLocationOverlay);}@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {Toast.makeText(getApplicationContext(),"onStatusChanged",Toast.LENGTH_SHORT).show();}@Overridepublic void onProviderEnabled(String provider) {Toast.makeText(getApplicationContext(),"onProviderEnabled",Toast.LENGTH_SHORT).show();}@Overridepublic void onProviderDisabled(String provider) {Toast.makeText(getApplicationContext(),"onProviderDisabled",Toast.LENGTH_SHORT).show();}};@Overrideprotected void onDestroy() {super.onDestroy();// 停止位置更新if (locationManager != null){locationManager.removeUpdates(locationListener);}}
}

http://www.lryc.cn/news/446377.html

相关文章:

  • 前端vue-实现富文本组件
  • AUTOSAR汽车电子嵌入式编程精讲300篇-基于CAN总线的气动控制(中)
  • 国内可用ChatGPT-4中文镜像网站整理汇总【持续更新】
  • 前端sm2国密加密时注意
  • LeetCode 面试经典150题 9.回文数
  • select 函数简介
  • python - 在linux上编译py文件为【.so】文件部署项目运行
  • SQL_having_pandas_filter
  • 从软件架构设计角度理解Kafka
  • 什么是中断?
  • 后端(实例)08
  • 【stm32】TIM定时器输出比较-PWM驱动LED呼吸灯/舵机/直流电机
  • 如何使用ssm实现线上旅游体验系统+vue
  • 探索JMeterTools:一个Python驱动的JMeter脚本生成器
  • 【React】组件通信
  • C++核心编程和桌面应用开发 第七天(运算符重载 智能指针)
  • echarts地图的简单使用
  • Qt 项目优化实践方向
  • 常见的15个:自然语言处理(NLP)实战项目
  • CKKS同态加密通用函数近似方法和openFHE实现
  • Webpack 5的新特性:Asset Modules与Dynamic Import
  • 解释python requests包的timeout
  • 蒙语学习快速方法,速记蒙语单词怎么学习更高效!
  • Vue3组件通信13种方法
  • Servlet入门:服务端小程序的初试(自己学习整理的资料)
  • 代码随想录算法训练营第三七天| 动态规划:完全背包理论基础 518.零钱兑换II 377. 组合总和 Ⅳ 322. 零钱兑换
  • [报错解决] 运行MATCHA时需要在线下载Arial.TTF字体,但是无法连接huggingface
  • B-树(不是B减树)原理剖析(1)
  • 【shell脚本8】Shell脚本学习--其他
  • 《深度学习》ResNet残差网络、BN批处理层 结构、原理详解