binbinyang-----百度地图拖动定位,显示附近地址poi提示搜索
来源:互联网 发布:笔记本修改mac地址 编辑:程序博客网 时间:2024/04/30 09:44
先看看效果图
一。配置百度地图
Android Studio工程配置方法
第一步:在工程app/libs目录下放入baidumapapi_vX_X_X.jar包,在src/main/目录下新建jniLibs目录,工程会自动加载src目录下的so动态库,放入libBaiduMapSDK_vX_X_X_X.so如下图所示,注意jar和so的前3位版本号必须一致,并且保证使用一次下载的文件夹中的两个文件,不能不同功能组件的jar或so交叉使用。
so的配置也可以参考demo给出的目录结构,如下图所示,在app工程路径下,新建libs,并在libs目录下放入对应不同CPU架构的so文件。这样工程并不会自动加载libs下的so,需在gradle编译时,通过加入代码: jniLibs.srcDir 'libs' 来说明so的路径为该libs路径。
第二步:工程配置还需要把jar包集成到自己的工程中,如图上图所示,放入libs目录下。对于每个jar文件,右键-选择Add As Library,导入到工程中。对应在build.gradle生成工程所依赖的jar文件说明,如图所示:
jar的配置也可参考eclipse方法,进行以下操作:
菜单栏选择 File —>Project Structure。
在弹出的Project Structure 对话框中, 选择module, 然后点击 Dependencies 选项卡.
点击绿色的加号选择File dependency. 然后选择要添加的jar包即可 完成上边的操作后在app目录下的build.gradle文件中,会有引入的类库,如上图所示。
这是我项目的LIBS图二。xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" android:fitsSystemWindows="true" android:orientation="vertical"> <RelativeLayout android:id="@+id/rl_search" android:layout_width="match_parent" android:layout_height="45dp" android:background="#90d7ec" android:visibility="visible"> <ImageView android:id="@+id/iv_left" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_marginLeft="6dp" android:padding="14dp" android:src="@drawable/arrow_left" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="280dp" android:orientation="vertical" android:visibility="visible"> <com.baidu.mapapi.map.MapView android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" android:onClick="true"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:background="#00000000" android:src="@drawable/gps_red" /> </RelativeLayout> <ListView android:id="@+id/lv_near_address" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:cacheColorHint="#00000000" android:descendantFocusability="beforeDescendants" android:fastScrollEnabled="true" android:scrollbars="none" /></LinearLayout>
listview的item---xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp" > <LinearLayout android:id="@+id/locationpois_linearlayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal" > <ImageView android:id="@+id/iv_gps" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="4dp" android:src="@drawable/gps_grey" /> <TextView android:id="@+id/locationpois_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="6dp" android:text="威盛大厦" android:textColor="#4A4A4A" android:textSize="14sp" /> </LinearLayout> <TextView android:id="@+id/locationpois_address" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="24dp" android:layout_marginTop="4dp" android:text="威盛大厦" android:textColor="#ffa9a9a9" android:textSize="12sp" /></LinearLayout>
三。拖动界面上的红色坐标图,拖动到某个位置,listview会根据当前经纬度反地理编码拿到附近的地址列表,listview第一个item写的是当前位置,点击item可以拿到坐标点 经纬度
public class MapActivity extends Activity implements View.OnClickListener, OnGetSuggestionResultListener, BaiduMap.OnMapStatusChangeListener, BDLocationListener, OnGetGeoCoderResultListener { private ImageView iv_left; protected static final String TAG = "MapActivity——mwork"; private ListView lv_near_address; private SuggestionSearch mSuggestionSearch = null; private BaiduMap mBaiduMap = null; private double latitude; private double longitude; private ArrayAdapter<String> sugAdapter = null; private MapView map; private MyLocationConfiguration.LocationMode mCurrentMode; private LocationClient mLocClient; private GeoCoder geoCoder; private String city; private boolean isFirstLoc = true; private LatLng locationLatLng; private LatLng ll; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_map); initData(); } private void initData() { map = (MapView) findViewById(R.id.map); mBaiduMap = map.getMap(); MapStatus mapStatus = new MapStatus.Builder().zoom(15).build(); MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus); mBaiduMap.setMapStatus(mMapStatusUpdate); // 地图状态改变相关监听 mBaiduMap.setOnMapStatusChangeListener(this); // 开启定位图层 mBaiduMap.setMyLocationEnabled(true); // 定位图层显示方式 mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL; mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, null)); mLocClient = new LocationClient(this); // 注册定位监听 mLocClient.registerLocationListener(this); // 定位选项 LocationClientOption option = new LocationClientOption(); /** * coorType - 取值有3个: * 返回国测局经纬度坐标系:gcj02 * 返回百度墨卡托坐标系 :bd09 * 返回百度经纬度坐标:bd09ll */ option.setCoorType("bd09ll"); // 设置是否需要地址信息,默认为无地址 option.setIsNeedAddress(true); // 设置是否需要返回位置语义化信息,可以在BDLocation.getLocationDescribe()中得到数据,ex:"在天安门附近", // 可以用作地址信息的补充 option.setIsNeedLocationDescribe(true); // 设置是否需要返回位置POI信息,可以在BDLocation.getPoiList()中得到数据 option.setIsNeedLocationPoiList(true); /** * 设置定位模式 Battery_Saving 低功耗模式 Device_Sensors 仅设备(Gps)模式 Hight_Accuracy * 高精度模式 */ option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); // 设置是否打开gps进行定位 option.setOpenGps(true); // 设置扫描间隔,单位是毫秒 当<1000(1s)时,定时定位无效 option.setScanSpan(1000); // 设置 LocationClientOption mLocClient.setLocOption(option); // 开始定位 mLocClient.start(); lv_near_address = (ListView) findViewById(R.id.lv_near_address); // 初始化搜索模块,注册搜索事件监听 mSuggestionSearch = SuggestionSearch.newInstance(); mSuggestionSearch.setOnGetSuggestionResultListener(this); sugAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line); iv_left = (ImageView) findViewById(R.id.iv_left); iv_left.setOnClickListener(this); }/* * 接受周边地理位置结果 */ @Override protected void onDestroy() { super.onDestroy(); mLocClient.stop(); mBaiduMap.setMyLocationEnabled(false); map.onDestroy(); if (geoCoder != null) { geoCoder.destroy(); } map = null; mSuggestionSearch.destroy(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.iv_left: finish(); break; default: break; } } public void onResume() { super.onResume(); map.onResume(); if (getIntent().getStringExtra("latitude") != null && (!"".equals(getIntent().getStringExtra("latitude")))) { latitude = Double.parseDouble(getIntent().getStringExtra("latitude")); longitude = Double.parseDouble(getIntent().getStringExtra("longitude")); } } public void onPause() { super.onPause(); map.onPause(); } @Override public void onGetSuggestionResult(SuggestionResult res) { if (res == null || res.getAllSuggestions() == null) { return; } sugAdapter.clear(); for (SuggestionResult.SuggestionInfo info : res.getAllSuggestions()) { if (info.key != null) sugAdapter.add(info.key + " " + info.city + info.district); } sugAdapter.notifyDataSetChanged(); } @Override public void onMapStatusChange(MapStatus mapStatus) { } @Override public void onMapStatusChangeFinish(MapStatus mapStatus) { // 地图操作的中心点 LatLng cenpt = mapStatus.target; geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(cenpt)); } @Override public void onMapStatusChangeStart(MapStatus mapStatus) { } @Override public void onReceiveLocation(BDLocation bdLocation) { // 如果bdLocation为空或mapView销毁后不再处理新数据接收的位置 if (bdLocation == null || mBaiduMap == null) { return; } // 定位数据 MyLocationData data = new MyLocationData.Builder() // 定位精度bdLocation.getRadius() .accuracy(bdLocation.getRadius()) // 此处设置开发者获取到的方向信息,顺时针0-360 .direction(bdLocation.getDirection()) // 经度 .latitude(bdLocation.getLatitude()) // 纬度 .longitude(bdLocation.getLongitude()) // 构建 .build(); // 设置定位数据 mBaiduMap.setMyLocationData(data); // 是否是第一次定位 if (isFirstLoc) { isFirstLoc = false; ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude()); Toast.makeText(MapActivity.this, ll + "", Toast.LENGTH_SHORT).show(); MapStatusUpdate msu = MapStatusUpdateFactory.newLatLngZoom(ll, 18); mBaiduMap.animateMapStatus(msu); } locationLatLng = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude()); // 获取城市,待会用于POISearch city = bdLocation.getCity(); // 创建GeoCoder实例对象 geoCoder = GeoCoder.newInstance(); // 发起反地理编码请求(经纬度->地址信息) ReverseGeoCodeOption reverseGeoCodeOption = new ReverseGeoCodeOption(); // 设置反地理编码位置坐标 reverseGeoCodeOption.location(new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude())); geoCoder.reverseGeoCode(reverseGeoCodeOption); // 设置查询结果监听者 geoCoder.setOnGetGeoCodeResultListener(this); } @Override public void onGetGeoCodeResult(GeoCodeResult arg0) { } // 拿到变化地点后的附近地址 @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) { final List<PoiInfo> poiInfos = reverseGeoCodeResult.getPoiList(); Log.i(TAG, "这里的值:" + poiInfos); if (poiInfos != null && !"".equals(poiInfos)) { PoiAdapter poiAdapter = new PoiAdapter(MapActivity.this, poiInfos); mLocClient.stop(); lv_near_address.setAdapter(poiAdapter); lv_near_address.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String name = poiInfos.get(position).name.toString(); LatLng latLng = poiInfos.get(position).location; double lat = poiInfos.get(position).location.latitude; double lon = poiInfos.get(position).location.longitude; Toast.makeText(MapActivity.this, name + lat + lon + "", Toast.LENGTH_LONG).show(); System.out.println(ll + "==" + latLng + "=====" + DistanceUtil.getDistance(ll, latLng) + "==================="); } }); } } /** * listview列表适配器 */ class PoiAdapter extends BaseAdapter { private Context context; private List<PoiInfo> pois; private LinearLayout linearLayout; PoiAdapter(Context context, List<PoiInfo> pois) { this.context = context; this.pois = pois; } @Override public int getCount() { return pois.size(); } @Override public Object getItem(int position) { return pois.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.item_locationpois, null); linearLayout = (LinearLayout) convertView.findViewById(R.id.locationpois_linearlayout); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } if (position == 0) { holder.iv_gps.setImageDrawable(getResources().getDrawable(R.drawable.gps_grey)); holder.locationpoi_name.setTextColor(Color.parseColor("#FF9D06")); holder.locationpoi_address.setTextColor(Color.parseColor("#FF9D06")); } if (position == 0 && linearLayout.getChildCount() < 2) { ImageView imageView = new ImageView(context); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(32, 32); imageView.setLayoutParams(params); imageView.setBackgroundColor(Color.TRANSPARENT); imageView.setImageResource(R.drawable.gps_grey); imageView.setScaleType(ImageView.ScaleType.FIT_XY); linearLayout.addView(imageView, 0, params); holder.locationpoi_name.setTextColor(Color.parseColor("#FF5722")); } PoiInfo poiInfo = pois.get(position); holder.locationpoi_name.setText(poiInfo.name); holder.locationpoi_address.setText(poiInfo.address); return convertView; } class ViewHolder { ImageView iv_gps; TextView locationpoi_name; TextView locationpoi_address; ViewHolder(View view) { locationpoi_name = (TextView) view.findViewById(R.id.locationpois_name); locationpoi_address = (TextView) view.findViewById(R.id.locationpois_address); iv_gps = (ImageView) view.findViewById(R.id.iv_gps); } } }}
- binbinyang-----百度地图拖动定位,显示附近地址poi提示搜索
- 仿百度外卖3_7_1百度地图拖动定位,显示附近地址poi提示搜索
- 仿百度外卖3_7_1百度地图拖动定位,显示附近地址poi提示搜索
- 高仿百度外卖地址添加功能(百度地图拖动定位,poi搜索,设置配送范围)
- 百度地图 定位,地图中心坐标,拖动后获取地图中心点坐标,poi搜索
- 百度地图的定位和poi搜索
- android调用百度地图定位与附近搜索
- html5 百度 google地图定位关键字搜索附近
- 百度地图api实现的定位,导航,附近搜索
- Android百度地图的搜索及附近地址的检索
- 使用百度地图实现拖动定位、搜索定位
- 百度地图拖动定位
- ios百度地图附近搜索
- 安卓百度地图附近poi搜索以及到指定poi的换乘方案
- 百度地图简单基础显示+定位+搜索
- 百度地图--poi搜索
- Android百度地图API 之 定位周边搜索POI
- 百度地图Poi关键字查询附近地点
- 优先队列
- Media Queries详解---转载
- java中的compareto方法的详细介绍
- JS——js语法
- 栈之出栈序列判定
- binbinyang-----百度地图拖动定位,显示附近地址poi提示搜索
- Java中创建对象的5种方式
- Android WiFi调试
- 【Dev Club分享第三期】iOS黑客技术大揭秘
- Druid的简介
- C#控制台 访问基类被屏蔽的方法
- python __call__ 内置函数的使用
- c++ 中new基本用法之使用错误
- jQuery.hover() 函数详解