部署看这个: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.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<Button
android: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;
@Override
protected 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")
@Override
public 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() {
@Override
public 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);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
Toast.makeText(getApplicationContext(),"onStatusChanged",Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderEnabled(String provider) {
Toast.makeText(getApplicationContext(),"onProviderEnabled",Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderDisabled(String provider) {
Toast.makeText(getApplicationContext(),"onProviderDisabled",Toast.LENGTH_SHORT).show();
}
};
@Override
protected void onDestroy() {
super.onDestroy();
// 停止位置更新
if (locationManager != null){
locationManager.removeUpdates(locationListener);
}
}
}