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(); } }