Android 开发百度地图之三GEO
2016-03-10 20:35
531 查看
百度地图Geo实现
本篇文章还是基于百度地图的geo功能的实现,例子主要是在地图上点击一个地图地点,调用接口将经纬度坐标转换为具体地点。首先先在原有的布局上加一个显示地点的TextView
<?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" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainMapActivity"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="Hello Map!" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="地点信息:"/> <TextView android:id="@+id/tv_info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=""/> </LinearLayout> <com.baidu.mapapi.map.TextureMapView android:id="@+id/bmapView" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" /> </LinearLayout> </RelativeLayout>
在java代码中监听地图点击事件,将点击获取的经纬度转换为具体地点信息,并在点击的位置做个标记。
package com.hand.jimda.mybaidumap; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.InfoWindow; 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.Marker; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.MyLocationConfiguration; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.map.TextureMapView; import com.baidu.mapapi.model.LatLng; 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 MainMapActivity extends AppCompatActivity implements OnGetGeoCoderResultListener { TextView mTvinfo; TextureMapView mMapView = null; private BaiduMap mBaiduMap; private Marker mMark; ////loc////// private MyLocationListener mLocationListener; private LocationClient mLocationClient; private MyLocationConfiguration.LocationMode mCurrentMode; //geo private GeoCoder mGeoSearch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main_map); mMapView = (TextureMapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap(); initview(); intloc(); initGEO(); } private void initview() { mTvinfo =(TextView)findViewById(R.id.tv_info); } @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); mLocationClient.stop(); mGeoSearch.destroy(); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); mLocationClient.start(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); mLocationClient.stop(); } ////////////////////////////////////////////////////////////////////////////////// //定位 private void intloc() { mBaiduMap.setMyLocationEnabled(true); mLocationClient = new LocationClient(this); mLocationListener = new MyLocationListener(); mLocationClient.registerLocationListener(mLocationListener); initLocation(); } /** * 定位SDK监听函数 */ public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { mBaiduMap.setMyLocationEnabled(true); MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) // 此处设置开发者获取到的方向信息,顺时针0-360 .direction(100).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); // 设置定位数据 mBaiduMap.setMyLocationData(locData); // 设置定位图层的配置(定位模式,是否允许方向信息,用户自定义定位图标) //mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked); MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, null); //第三个参数是位置图片没有就默认 mBaiduMap.setMyLocationConfigeration(config); //以我的位置为中心 LatLng latlng = new LatLng(location.getLatitude(), location.getLongitude()); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(latlng)); } } /** * 定位初始化 */ private void initLocation() { LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy );//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备 option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系 int span = 10000; option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要 option.setOpenGps(true);//可选,默认false,设置是否使用gps option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果 option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近” option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到 option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死 option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集 option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要 mLocationClient.setLocOption(option); mLocationClient.start(); } ///geo private void initGEO() { //Geo mGeoSearch = GeoCoder.newInstance(); mGeoSearch.setOnGetGeoCodeResultListener(this); ////////////////////////////////////////////////////////////////////////////////// /*地图监听GEO转换*/ mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { final LatLng lat = latLng; mGeoSearch.reverseGeoCode(new ReverseGeoCodeOption() .location(lat)); } @Override public boolean onMapPoiClick(MapPoi mapPoi) { return false; } }); //////////////////////////////BaiduMap.OnMapClickListener/////////////////////////////////// } ///////////////OnGetGeoCoderResultListener//////////////////////////////////////////// @Override public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) { } @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) { if (TextUtils.isEmpty(reverseGeoCodeResult.getAddress())) { Toast.makeText(MainMapActivity.this, "地点解析失败,请重新选择", Toast.LENGTH_SHORT).show(); } else { if (null != mMark) { mMark.remove(); } mTvinfo.setText(reverseGeoCodeResult.getAddress()); /////show pos LatLng from = new LatLng(reverseGeoCodeResult.getLocation().latitude, reverseGeoCodeResult.getLocation().longitude); BitmapDescriptor bdB = BitmapDescriptorFactory .fromResource(R.drawable.ic_baidumap_start); OverlayOptions ooP = new MarkerOptions().position(from).icon(bdB); mMark = (Marker) (mBaiduMap.addOverlay(ooP)); MapStatus mMapStatus = new MapStatus.Builder().target(from) .build(); /////show pos } } ///////////////OnGetGeoCoderResultListener//////////////////////////////////////////// }
效果图:
相关文章推荐
- Java以及Android回调机制的一些理解
- Android实现控件动画效果
- Android音频开发(2):如何采集一帧音频
- Android——ListView的setSelection()和setSelectionFromTop()联系
- 浅学android 动画
- Android 全景框架了解
- Android返回数据给上一个活动-startActivityForResult
- android开发之java内存泄露分析
- android源码设计模式解析与实战 读书笔记 2 单例模式(上)
- android开发系列之代码整洁之道
- android随笔:计量单位之dp,sp,px
- Android之Button
- 【android】ListView 的 stackFromBottom 选项
- Android签名机制之---签名验证过程详解
- android基础开发之RecycleView(1)---基本使用方式
- Android能发音的生词本
- Android开发小知识-Spinner控件使用
- Android监听事件四种方法
- Android:Service的非绑定式的创建和生命周期
- Android Studio--五大布局