package com.moral.mapcoordinatesapp;
|
|
import android.support.v7.app.AppCompatActivity;
|
import android.os.Bundle;
|
import android.view.View;
|
import android.widget.ImageView;
|
import android.widget.TextView;
|
|
|
import com.baidu.location.BDLocation;
|
import com.baidu.location.BDLocationListener;
|
import com.baidu.location.LocationClient;
|
import com.baidu.location.LocationClientOption;
|
import com.baidu.mapapi.map.BaiduMap;
|
import com.baidu.mapapi.map.BitmapDescriptorFactory;
|
import com.baidu.mapapi.map.MapPoi;
|
import com.baidu.mapapi.map.MapStatus;
|
import com.baidu.mapapi.map.MapStatusUpdateFactory;
|
import com.baidu.mapapi.map.MapView;
|
import com.baidu.mapapi.map.MarkerOptions;
|
import com.baidu.mapapi.map.MyLocationConfiguration;
|
import com.baidu.mapapi.map.MyLocationData;
|
import com.baidu.mapapi.model.LatLng;
|
import com.baidu.mapapi.search.core.SearchResult;
|
import com.baidu.mapapi.search.geocode.GeoCodeResult;
|
import com.baidu.mapapi.search.geocode.GeoCoder;
|
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
|
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
|
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
|
|
public class MainActivity extends AppCompatActivity implements OnGetGeoCoderResultListener {
|
private TextView tv_location,tv_coordinates;
|
private ImageView bt_change;
|
/**
|
* MapView 是地图主控件
|
*/
|
private MapView mMapView;
|
private BaiduMap mBaiduMap;
|
|
/**
|
* 当前地点击点
|
*/
|
private LatLng currentPt;
|
|
/**
|
* 定位相关
|
*/
|
LocationClient mLocClient;
|
public MyLocationListenner myListener = new MyLocationListenner();
|
private MyLocationConfiguration.LocationMode mCurrentMode;
|
boolean isFirstLoc = true; // 是否首次定位
|
|
/**
|
* 地理位置编码
|
*/
|
GeoCoder mSearch = null;
|
|
boolean isMap = true; // 是普通地图
|
@Override
|
protected void onCreate(Bundle savedInstanceState) {
|
super.onCreate(savedInstanceState);
|
setContentView(R.layout.activity_main);
|
tv_location = (TextView) findViewById(R.id.tv_location);
|
tv_coordinates = (TextView) findViewById(R.id.tv_coordinates);
|
bt_change = (ImageView) findViewById(R.id.bt_change);
|
bt_change.setOnClickListener(new View.OnClickListener() {
|
@Override
|
public void onClick(View v) {
|
if(isMap){
|
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
|
}else{
|
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
|
}
|
isMap = !isMap;
|
}
|
});
|
|
mMapView = (MapView) findViewById(R.id.bmapView);
|
mBaiduMap = mMapView.getMap();
|
mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;
|
// 开启定位图层
|
mBaiduMap.setMyLocationEnabled(true);
|
// 定位初始化
|
mLocClient = new LocationClient(this);
|
mLocClient.registerLocationListener(myListener);
|
LocationClientOption option = new LocationClientOption();
|
option.setOpenGps(true); // 打开gps
|
option.setCoorType("bd09ll"); // 设置坐标类型
|
option.setIsNeedAddress(true);
|
option.setScanSpan(60000);
|
mLocClient.setLocOption(option);
|
mLocClient.start();
|
|
/**
|
* 初始化搜索模块,注册事件监听
|
*/
|
mSearch = GeoCoder.newInstance();
|
mSearch.setOnGetGeoCodeResultListener(this);
|
|
/**
|
* 地图单击监听
|
*/
|
mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
|
//获取当前单击点的坐标
|
@Override
|
public void onMapClick(LatLng latLng) {
|
currentPt = latLng;
|
// 反Geo搜索
|
mSearch.reverseGeoCode(new ReverseGeoCodeOption()
|
.location(currentPt));
|
String info = String.format("当前经度: %f\n当前纬度:%f",
|
currentPt.longitude, currentPt.latitude);
|
tv_coordinates.setText(info);
|
}
|
|
@Override
|
public boolean onMapPoiClick(MapPoi mapPoi) {
|
return false;
|
}
|
});
|
}
|
|
/**
|
* 位置转坐标
|
* @param geoCodeResult
|
*/
|
@Override
|
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
|
|
}
|
|
/**
|
* 坐标转位置
|
* @param reverseGeoCodeResult
|
*/
|
@Override
|
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
|
if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
|
tv_location.setText("抱歉,未能找到结果");
|
return;
|
}
|
mBaiduMap.clear();
|
mBaiduMap.addOverlay(new MarkerOptions().position(reverseGeoCodeResult.getLocation())
|
.icon(BitmapDescriptorFactory
|
.fromResource(R.mipmap.location)));
|
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(reverseGeoCodeResult
|
.getLocation()));
|
tv_location.setText(reverseGeoCodeResult.getAddress());
|
}
|
|
/**
|
* 定位SDK监听函数
|
*/
|
public class MyLocationListenner implements BDLocationListener {
|
|
@Override
|
public void onReceiveLocation(BDLocation location) {
|
// map view 销毁后不在处理新接收的位置
|
if (location == null || mMapView == null) {
|
return;
|
}
|
MyLocationData locData = new MyLocationData.Builder()
|
.accuracy(30)//定位半径误差
|
// 此处设置开发者获取到的方向信息,顺时针0-360
|
.direction(100).latitude(location.getLatitude())
|
.longitude(location.getLongitude()).build();
|
mBaiduMap.setMyLocationData(locData);
|
String info = String.format("当前经度: %f\n当前纬度:%f",
|
location.getLongitude(), location.getLatitude());
|
tv_location.setText(location.getAddrStr());
|
tv_coordinates.setText(info);
|
if (isFirstLoc) {
|
isFirstLoc = false;
|
LatLng ll = new LatLng(location.getLatitude(),
|
location.getLongitude());
|
MapStatus.Builder builder = new MapStatus.Builder();
|
builder.target(ll).zoom(18.0f);
|
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
|
}
|
}
|
|
public void onReceivePoi(BDLocation poiLocation) {
|
}
|
}
|
|
@Override
|
protected void onPause() {
|
// MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
|
mMapView.onPause();
|
super.onPause();
|
}
|
|
@Override
|
protected void onResume() {
|
// MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume()
|
mMapView.onResume();
|
super.onResume();
|
}
|
|
@Override
|
protected void onDestroy() {
|
// MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()
|
// 退出时销毁定位
|
mLocClient.stop();
|
// 关闭定位图层
|
mBaiduMap.setMyLocationEnabled(false);
|
mMapView.onDestroy();
|
super.onDestroy();
|
}
|
}
|