Android 百度地图-实现POI的搜索(搜索周边)

来源:互联网 发布:vc 多线程编程pdf 编辑:程序博客网 时间:2024/05/01 00:15

首先贴出主要代码

Activity

package cn.yhsh.maptest;import java.util.ArrayList;import utils.PoiOverlay;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.graphics.Color;import android.graphics.Typeface;import android.graphics.drawable.ColorDrawable;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.os.Bundle;import android.util.Log;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnLongClickListener;import android.view.View.OnTouchListener;import android.view.ViewGroup.LayoutParams;import android.view.animation.AlphaAnimation;import android.view.animation.Animation;import android.view.animation.AnimationSet;import android.view.animation.RotateAnimation;import android.view.animation.ScaleAnimation;import android.widget.Button;import android.widget.EditText;import android.widget.ImageButton;import android.widget.LinearLayout;import android.widget.PopupWindow;import android.widget.TextView;import android.widget.Toast;import com.baidu.mapapi.SDKInitializer;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;import com.baidu.mapapi.map.BitmapDescriptor;import com.baidu.mapapi.map.BitmapDescriptorFactory;import com.baidu.mapapi.map.MapStatus;import com.baidu.mapapi.map.MapStatusUpdate;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.MapViewLayoutParams;import com.baidu.mapapi.map.Marker;import com.baidu.mapapi.map.MarkerOptions;import com.baidu.mapapi.map.TextOptions;import com.baidu.mapapi.model.LatLng;import com.baidu.mapapi.model.LatLngBounds;import com.baidu.mapapi.search.core.PoiInfo;import com.baidu.mapapi.search.core.SearchResult;import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;import com.baidu.mapapi.search.poi.PoiBoundSearchOption;import com.baidu.mapapi.search.poi.PoiDetailResult;import com.baidu.mapapi.search.poi.PoiResult;import com.baidu.mapapi.search.poi.PoiSearch;public class MainActivity extends Activity implements OnMarkerClickListener,OnClickListener, OnLongClickListener {double weidu = 39.6184470000;double jindu = 116.4252280000;// 这个是百度地图公司的经纬度坐标点LatLng point = new LatLng(weidu, jindu);private IntentFilter filter;private MapView mv_maptest;private BaiduMap map;private View dialog_tv;private TextView tv_dialog;private EditText et_serach;private Button bt_search;private String et_result;private PoiInfo poiInfo;private LinearLayout ll_suofang;private LinearLayout llweixing;private LinearLayout ll_search;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);initsdk();setContentView(R.layout.activity_main);// 拿到mapview控件设置默认缩放比例mv_maptest = (MapView) findViewById(R.id.mv_maptest);et_serach = (EditText) findViewById(R.id.et_serach);bt_search = (Button) findViewById(R.id.bt_search);Button bt_putong = (Button) findViewById(R.id.bt_putong);Button bt_weixing = (Button) findViewById(R.id.bt_weixing);Button bt_jiaotong = (Button) findViewById(R.id.bt_jiaotong);ImageButton ib_da = (ImageButton) findViewById(R.id.ib_da);ImageButton ib_xiao = (ImageButton) findViewById(R.id.ib_xiao);ll_suofang = (LinearLayout) findViewById(R.id.ll_suofang);llweixing = (LinearLayout) findViewById(R.id.llweixing);ll_search = (LinearLayout) findViewById(R.id.ll_serach);map = mv_maptest.getMap();MapStatusUpdate zoom = MapStatusUpdateFactory.zoomTo(14);// 设置地图默认缩放比例为10(默认为12)map.setMapStatus(zoom);MapStatusUpdate center = MapStatusUpdateFactory.newLatLng(point);// 设置默认中心店map.setMapStatus(center);// 去掉标尺mv_maptest.showZoomControls(false);// 去掉缩放按钮mv_maptest.showScaleControl(false);boolean menu = mv_maptest.showContextMenu();Log.e("测试", menu + "");// 写文字drawtext();// 画对话框在地图上面通过点击图片后dialogpic();// ❀图片字啊地图上面drawpictuer();bt_search.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 拿到输入框的内容et_result = et_serach.getText().toString().trim();if (!et_result.equals("") && !et_result.equals(null)) {Toast.makeText(MainActivity.this, et_result,Toast.LENGTH_LONG).show();// 搜索资源serachrescours();} else {Toast.makeText(MainActivity.this, "请输入数据再点击查询按钮",Toast.LENGTH_LONG).show();}}});// 设置三个按钮点击事件tv_dialog.setOnClickListener(this);bt_putong.setOnClickListener(this);bt_weixing.setOnClickListener(this);bt_jiaotong.setOnClickListener(this);ib_da.setOnClickListener(this);ib_xiao.setOnClickListener(this);/** * 长按放大按钮隐藏缩放按钮 */ib_da.setOnLongClickListener(this);bt_putong.setOnLongClickListener(this);tv_dialog.setOnLongClickListener(this);bt_search.setOnLongClickListener(this);}/** * 在范围内搜索的方法 */private void serachrescours() {PoiSearch poiS = PoiSearch.newInstance();// 创建对象poiS.setOnGetPoiSearchResultListener(new Mypoisearch());PoiBoundSearchOption fanwei = new PoiBoundSearchOption();LatLngBounds llbs = new LatLngBounds.Builder().include(new LatLng(40.7460400000, 114.9219870000)).include(new LatLng(38.9954100000, 117.7206750000)).build();fanwei.bound(llbs).keyword(et_result);// 搜索的内容// 发起范围内搜索poiS.searchInBound(fanwei);}class Mypoisearch implements OnGetPoiSearchResultListener {@Overridepublic void onGetPoiDetailResult(PoiDetailResult arg0) {}@Overridepublic void onGetPoiResult(PoiResult result) {if (result == null|| result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {Toast.makeText(MainActivity.this, "未找到结果", Toast.LENGTH_LONG).show();return;}// 返回搜索结果PoiOverlay pioo = new MyPoiOverlay(map);// 设置覆盖物marker点击事件map.setOnMarkerClickListener(pioo);// 设置数据pioo.setData(result);// 添加地图pioo.addToMap();}// 写一类继承PoiOverlayclass MyPoiOverlay extends PoiOverlay {public MyPoiOverlay(BaiduMap baiduMap) {super(baiduMap);}/* * 重写onPoiClick点击事件方法 */@Overridepublic boolean onPoiClick(int i) {// 拿到结果PoiResult poiResult = getPoiResult();poiInfo = poiResult.getAllPoi().get(i);// 弹出吐司显示点中的点击事件Toast.makeText(getApplicationContext(), poiInfo.address,Toast.LENGTH_LONG).show();// 弹出populowindowshowPopupWindow(getCurrentFocus());// showPopupWindow(mv_maptest);return super.onPoiClick(i);}}}/** * 显示popupwindow的方法 */private void showPopupWindow(View view) {// 一个自定义的布局,作为显示的内容View contentView = View.inflate(getApplicationContext(),R.layout.activity_popupwindow, null);// 设置按钮的点击事件TextView button_popuowindow = (TextView) contentView.findViewById(R.id.tv_popuowindow);button_popuowindow.setText(poiInfo.address);button_popuowindow.setTextColor(Color.BLUE);button_popuowindow.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(getApplicationContext(), "按钮已被点击",Toast.LENGTH_SHORT).show();}});final PopupWindow popupWindow = new PopupWindow(contentView,LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, true);popupWindow.setTouchable(true);popupWindow.setTouchInterceptor(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {return false;// 这里如果返回true的话,touch事件将被拦截// 拦截后 PopupWindow的onTouchEvent不被调用,这样点击外部区域无法dismiss}});// 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框// 我觉得这里是API的一个bug// popupWindow.setBackgroundDrawable(getResources().getDrawable(// R.drawable.toum));popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));// 设置背景颜色为透明色// getResources().getDrawable(R.drawable.toum).setAlpha(0);// 设置图片透明度为0// 设置好参数之后再show// int[] location = new int [2];// view.getLocationInWindow(location);// int x = location[0];// int y = location[1];// popupWindow.showAtLocation(view, Gravity.CENTER_HORIZONTAL, x, y);popupWindow.showAsDropDown(view);// 此方法也可以// 缩放动画ScaleAnimation scanim = new ScaleAnimation(0, 1, 0, 1,Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 1.0f);scanim.setDuration(4000);// 四秒钟// 渐变动画AlphaAnimation apap = new AlphaAnimation(0.1f, 1.0f);apap.setDuration(4000);// 旋转动画RotateAnimation ra = new RotateAnimation(0, 360,Animation.RELATIVE_TO_SELF, 0.1f, Animation.RELATIVE_TO_SELF,0.1f);ra.setDuration(4000);ra.setFillAfter(true);// 动画执行完后是否停留在执行完的状态// 组合动画AnimationSet ams = new AnimationSet(true);// 共享动画插入器// 添加组合动画ams.addAnimation(ra);ams.addAnimation(scanim);ams.addAnimation(apap);// 开启动画效果contentView.startAnimation(ams);}private void dialogpic() {dialog_tv = View.inflate(getApplicationContext(),R.layout.activity_dialogpic, null);MapViewLayoutParams params = new MapViewLayoutParams.Builder().layoutMode(MapViewLayoutParams.ELayoutMode.mapMode).position(point).width(MapViewLayoutParams.WRAP_CONTENT).height(MapViewLayoutParams.WRAP_CONTENT).build();mv_maptest.addView(dialog_tv, params);dialog_tv.setVisibility(View.INVISIBLE);// 首先隐藏tv_dialog = (TextView) dialog_tv.findViewById(R.id.tv_dialog);map.setOnMarkerClickListener(this);// 设置点击事件}// 打开之前先检验key的正确与否private void initsdk() {// 注册广播filter = new IntentFilter();filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);// 网络连接错误filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);// 校验失败registerReceiver(new Mybraodcast(), filter);SDKInitializer.initialize(getApplicationContext());}class Mybraodcast extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();// 判断是否成功if (isNetworkAvailable(MainActivity.this)) {if (action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {Toast.makeText(getApplicationContext(), "校验错误。请检查校验码是否正确。",Toast.LENGTH_LONG).show();} else {if (action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {Toast.makeText(getApplicationContext(),"网络错误。请检查网络是否在正常。", Toast.LENGTH_LONG).show();}}}}}// 设置地图图层@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_1:map.setMapType(BaiduMap.MAP_TYPE_NORMAL);// 底图map.setTrafficEnabled(false);// 关闭交通图break;case KeyEvent.KEYCODE_2:map.setMapType(BaiduMap.MAP_TYPE_SATELLITE);// 卫星地图map.setTrafficEnabled(false);// 关闭交通图break;case KeyEvent.KEYCODE_3:map.setTrafficEnabled(true);// 打开交通图break;case KeyEvent.KEYCODE_4:MapStatusUpdate zoomin = MapStatusUpdateFactory.zoomIn();// 一级一级缩放// 放大map.setMapStatus(zoomin);break;case KeyEvent.KEYCODE_5:MapStatusUpdate zoomout = MapStatusUpdateFactory.zoomOut();// 一级一级缩放// 缩小map.setMapStatus(zoomout);break;case KeyEvent.KEYCODE_6:float jiaodu = map.getMapStatus().rotate;MapStatus roates = new MapStatus.Builder().rotate(jiaodu + 15).build();MapStatusUpdate roate = MapStatusUpdateFactory.newMapStatus(roates);// 旋转map.setMapStatus(roate);break;case KeyEvent.KEYCODE_7:float jiaodus = map.getMapStatus().overlook;MapStatus roatelines = new MapStatus.Builder().overlook(jiaodus - 5).build();MapStatusUpdate roateline = MapStatusUpdateFactory.newMapStatus(roatelines);// 一条线旋转map.setMapStatus(roateline);break;case KeyEvent.KEYCODE_8:MapStatusUpdate move = MapStatusUpdateFactory.newLatLng(new LatLng(39.9899560000, 116.3230660000));// 中关村地铁经纬度坐标// 移动map.animateMapStatus(move);break;case KeyEvent.KEYCODE_9:MapStatusUpdate center = MapStatusUpdateFactory.newLatLng(point);// 设置默认中心店map.setMapStatus(center);break;}return super.onKeyDown(keyCode, event);}/** * 检测网络是否可用 *  * @return */// public boolean isNetworkConnected() {// ConnectivityManager cm = (ConnectivityManager)// getSystemService(Context.CONNECTIVITY_SERVICE);// NetworkInfo ni = cm.getActiveNetworkInfo();// return ni != null && ni.isConnectedOrConnecting();// }public static boolean isNetworkAvailable(Activity activity) {Context context = activity.getApplicationContext();// 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);if (connectivityManager == null) {return false;} else {// 获取NetworkInfo对象NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo();if (networkInfo != null && networkInfo.length > 0) {for (int i = 0; i < networkInfo.length; i++) {// 判断当前网络状态是否为连接状态if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED) {return true;}}}}return false;}// 在中心点地图位置写文字标注信息private void drawtext() {TextOptions text = new TextOptions();text.position(point).// 需要标注的点的经纬度bgColor(0x01ffffff).// 文字背景色fontColor(0x99ff0000).// 文字颜色fontSize(24).// 字体大小text("北京技术股份有限公司").// 文字信息typeface(Typeface.MONOSPACE).// 安卓字体rotate(0);// .visible(false);//旋转45°,隐藏文字信息map.addOverlay(text);// 将文字信息添加到地图上面}/** * 画图片在地图上面 */private void drawpictuer() {MarkerOptions pictuer = new MarkerOptions();// 设置坐标位置pictuer.position(new LatLng(weidu + 0.005, jindu - 0.0005)).title("扬宏豕慧官方店铺(长按此处可以搜索全局\n点击此处可隐藏搜索框)").icon(BitmapDescriptorFactory.fromResource(R.drawable.caiguan));map.addOverlay(pictuer);pictuer.position(new LatLng(weidu + 0.02, jindu + 0.005)).title("扬宏豕慧店铺(长按此处可以搜索全局\n点击此处可隐藏搜索框)").icon(BitmapDescriptorFactory.fromResource(R.drawable.caiguan)).draggable(true);// 可以被拖拽map.addOverlay(pictuer);ArrayList<BitmapDescriptor> pic = new ArrayList<BitmapDescriptor>();pic.add(BitmapDescriptorFactory.fromResource(R.drawable.caiguan));pic.add(BitmapDescriptorFactory.fromResource(R.drawable.ya));pic.add(BitmapDescriptorFactory.fromResource(R.drawable.wifi));pic.add(BitmapDescriptorFactory.fromResource(R.drawable.jia));pictuer.position(new LatLng(weidu + 0.002, jindu - 0.0085)).title("扬宏豕慧周黑鸭(长按此处可以搜索全局\n点击此处可隐藏搜索框)").icons(pic).draggable(true);// 可以被拖拽map.addOverlay(pictuer);}/** * 设置覆盖物的点击事件 */@Overridepublic boolean onMarkerClick(Marker marker) {MapViewLayoutParams params = new MapViewLayoutParams.Builder().layoutMode(MapViewLayoutParams.ELayoutMode.mapMode).position(marker.getPosition()).width(MapViewLayoutParams.WRAP_CONTENT).height(MapViewLayoutParams.WRAP_CONTENT).yOffset(-40).// 标示在点中的物体上面10距离build();mv_maptest.updateViewLayout(dialog_tv, params);tv_dialog.setText(marker.getTitle());dialog_tv.setVisibility(View.VISIBLE);// 点击后显示对话框return true;// 标示消费}// 卫星图切换功能@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.bt_putong:map.setMapType(BaiduMap.MAP_TYPE_NORMAL);// 底图map.setTrafficEnabled(false);// 关闭交通图break;case R.id.bt_weixing:map.setMapType(BaiduMap.MAP_TYPE_SATELLITE);// 卫星地图map.setTrafficEnabled(false);// 关闭交通图break;case R.id.bt_jiaotong:map.setTrafficEnabled(true);// 打开交通图break;case R.id.ib_da:MapStatusUpdate zoomin = MapStatusUpdateFactory.zoomIn();// 一级一级缩放// 放大map.setMapStatus(zoomin);// 放大地图break;case R.id.ib_xiao:MapStatusUpdate zoomout = MapStatusUpdateFactory.zoomOut();// 一级一级缩放// 缩小map.setMapStatus(zoomout);// 缩小地图break;case R.id.tv_dialog:ll_search.setVisibility(View.GONE);// 隐藏搜索框break;}}@Overridepublic boolean onLongClick(View v) {switch (v.getId()) {case R.id.ib_da:ll_suofang.setVisibility(View.GONE);// 隐藏缩放按钮break;case R.id.bt_putong:llweixing.setVisibility(View.GONE);// 隐藏卫星地图切换break;case R.id.tv_dialog:ll_search.setVisibility(View.VISIBLE);// 显示搜索框llweixing.setVisibility(View.VISIBLE);// 显示维修地图按钮ll_suofang.setVisibility(View.VISIBLE);// 显示缩放按钮break;case R.id.bt_search:ll_search.setVisibility(View.GONE);// 隐藏搜索框break;}return true;}}



再贴出activity_main   xml布局文件

<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" >    <com.baidu.mapapi.map.MapView        android:id="@+id/mv_maptest"        android:layout_width="match_parent"        android:layout_height="match_parent" >    </com.baidu.mapapi.map.MapView>    <LinearLayout        android:id="@+id/ll_serach"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:orientation="horizontal" >        <!-- ##e0ffffff半透明背景色颜色   android:alpha="0.5"透明方法 -->        <EditText            android:id="@+id/et_serach"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_weight="1"            android:alpha="0.5"            android:gravity="center"            android:hint="请输入搜索内容(长按搜索按钮可隐藏)" />        <Button            android:id="@+id/bt_search"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:alpha="0.5"            android:text="点击搜索" />    </LinearLayout>    <LinearLayout        android:id="@+id/llweixing"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:layout_alignParentRight="true"        android:alpha="0.5" >        <Button            android:id="@+id/bt_putong"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="普通地图" />        <Button            android:id="@+id/bt_weixing"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="卫星地图" />        <Button            android:id="@+id/bt_jiaotong"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="交通地图" />    </LinearLayout>    <LinearLayout        android:id="@+id/ll_suofang"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:layout_centerInParent="true"        android:layout_marginRight="5dp"        android:orientation="vertical" >        <ImageButton            android:id="@+id/ib_da"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:alpha="0.5"            android:src="@drawable/da" />        <ImageButton            android:id="@+id/ib_xiao"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginTop="30dp"            android:alpha="0.5"            android:src="@drawable/xiao" />    </LinearLayout></RelativeLayout>


activity_popuwindows xml文件

<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" >    <TextView        android:gravity="center"        android:id="@+id/tv_popuowindow"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="气泡" /></RelativeLayout>


activity_dialogpic  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" >    <TextView        android:textColor="#EE6AA7"        android:id="@+id/tv_dialog"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></LinearLayout>


效果图


0 0
原创粉丝点击