Android加载百度地图

简介:               1、第一步:项目中添加lib文件夹,放入百度相关jar包,如下图第二步:编写布局文件 ...

              

1、第一步:项目中添加lib文件夹,放入百度相关jar包,如下图



第二步:编写布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/back"
    android:orientation="vertical" >

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:background="#FFFF00" >


        <LinearLayout
            android:id="@+id/yqxx_table_title"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FFFF00"
            android:orientation="vertical" >


            <WebView
                android:id="@+id/webview"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:background="@drawable/back" />
        </LinearLayout>


        <com.baidu.mapapi.map.MapView
            android:id="@+id/bmapView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:clickable="true" />

    </FrameLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="55dp"
        android:orientation="horizontal" >


        <Button
            android:id="@+id/yqxx_List_Button"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/yq_list_up" />


        <Button
            android:id="@+id/yqxx_Map_Button"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/yq_map_down" />
    </LinearLayout>


</LinearLayout>




第三步:编写Acvity程序

package cn.superyouth.www;


import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import cn.superyouth.www.itools.ExitApp;
import cn.superyouth.www.itools.xmTools;


import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.ItemizedOverlay;
import com.baidu.mapapi.map.MKMapViewListener;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.OverlayItem;
import com.baidu.mapapi.map.Symbol;
import com.baidu.mapapi.map.TextItem;
import com.baidu.mapapi.map.TextOverlay;
import com.baidu.platform.comapi.basestruct.GeoPoint;


import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;


public class SYIT_SSJC extends Activity implements MKGeneralListener {


	private LinearLayout yqxxTableTitle = null;
	private BMapManager mapManager = null; // 百度地图控制器
	private MapView mMapView = null; // MapView 是地图主控件
	private MapController mMapController = null;// 用MapController完成地图控制
	private WebView webview = null;
	private Toast mToast;
	boolean isError = false;
	List<Map<String,Object>> curData = new ArrayList<Map<String, Object>>(5);				// 当前页面使用数据


	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		ExitApp.getInstance().addActivity(this);


		mapManager = new BMapManager(getApplication());
		mapManager.init("8965CE898810FCFFB38B07079D4B7208658A4F7C", null);
		setContentView(R.layout.syit_ssjc);


		webview = (WebView) findViewById(R.id.webview);
		WebSettings webSettings = webview.getSettings();
		// 设置WebView属性,能够执行Javascript脚本
		webSettings.setJavaScriptEnabled(true);
		// 设置可以访问文件
		webSettings.setAllowFileAccess(true);
		// 设置支持缩放
		webSettings.setBuiltInZoomControls(true);
		// 加载需要显示的网页
		// webview.loadUrl("http://192.168.0.121/CityLowerRoadSys/PDA/SQ_List.aspx");
		webview.loadUrl("http://61.190.32.10/CityLowerRoadSys/PDA/SQ_List.aspx");
		// 设置Web视图
		webview.setWebViewClient(new webViewClient());


		TextView titleText = (TextView) findViewById(R.id.bar_title_backTitle);
		titleText.setText("实时监测");


		// 按钮返回
		Button btnBack = (Button) findViewById(R.id.bar_title_backButton);
		btnBack.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v) {
				finish();
			}
		});


		// 设置列表和地图按钮---------------------------------------------------------------------
		final Button ListButton = (Button) findViewById(R.id.yqxx_List_Button);
		final Button MapButton = (Button) findViewById(R.id.yqxx_Map_Button);
		// UI
		// 列表layout层----------------------------------------------------------------------
		yqxxTableTitle = (LinearLayout) findViewById(R.id.yqxx_table_title);
		// 列表按钮事件---------------------------------------------------------------------------
		ListButton.setOnClickListener(new ImageView.OnClickListener() {
			public void onClick(View v) {
				// 隐藏地图、显示列表
				// 并设置按钮图片的状态----------------------------------------------
				yqxxTableTitle.setVisibility(View.VISIBLE);
				mMapView.setVisibility(View.GONE);
				ListButton.setBackgroundResource(R.drawable.yq_list_down);
				MapButton.setBackgroundResource(R.drawable.yq_map_up);
			}
		});
		// 地图按钮事件----------------------------------------------------------------------------
		MapButton.setOnClickListener(new ImageView.OnClickListener() {
			public void onClick(View v) {
				// 隐藏列表、显示地图
				// 并设置按钮图片的状态-----------------------------------------------
				yqxxTableTitle.setVisibility(View.GONE);
				mMapView.setVisibility(View.VISIBLE);
				ListButton.setBackgroundResource(R.drawable.yq_list_up);
				MapButton.setBackgroundResource(R.drawable.yq_map_down);
			}
		});


		// -------------设置地图的初始化和绑定----------------------------------------------
		mMapView = (MapView) findViewById(R.id.bmapView);
		mMapController = mMapView.getController();     // * 获取地图控制器
		mMapController.enableClick(true);                //*  设置地图是否响应点击事件  .
		mMapController.setZoom(12);                 // * 设置地图缩放级别
		mMapView.setBuiltInZoomControls(true);      // * 显示内置缩放控件
		mMapView.setTraffic(true);                //设置显示为卫星地图:


	     // 开启线程
	 		new Thread() {
	 			@Override
	 			public void run() {
	 				try {
	 					
	 				} catch (Exception e) {
	 					isError = true;
	 					System.out.println(e.toString());
	 				}
	 				handler.sendEmptyMessage(0); 				
	 			}
	 		}.start();
	}
	
	/**
	 * 用Handler来更新UI
	 */
	private Handler handler = new Handler() {
		public void handleMessage(Message msg) {
			if(isError){
				 //创建提示
				Dialog alertDialog = new AlertDialog.Builder(SYIT_SSJC.this). 
		                setTitle("提示"). 
		                setMessage("服务器无响应,请稍候再试!"). 
		                setIcon(R.drawable.ic_launcher). 
		                create(); 
		        alertDialog.show();
			}else{
				new ReadHttpGet().execute("http://61.190.32.10/CityLowerRoadSys/ashx/ssjc.ashx");
			}
		}
	};
	
	// * 显示Toast消息
	private void showToast(String msg) {
		if (mToast == null) {
			mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
		} else {
			mToast.setText(msg);
			mToast.setDuration(Toast.LENGTH_SHORT);
		}
		mToast.show();
	}


	// Web视图
	private class webViewClient extends WebViewClient {
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			view.loadUrl(url);
			return true;
		}
	}


	@Override
	protected void onPause() {
		// MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
		mMapView.onPause();
		super.onPause();
	}


	@Override
	protected void onResume() {
		// MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
		mMapView.onResume();
		super.onResume();
	}


	@Override
	protected void onDestroy() {
		// MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()
		mMapView.destroy();
		// 退出应用调用BMapManager的destroy()方法
		if (mapManager != null) {
			mapManager.destroy();
			mapManager = null;
		}
		super.onDestroy();
	}


	public void onGetNetworkState(int arg0) {


	}


	public void onGetPermissionState(int arg0) {


	}


	@SuppressLint("Override")
	class ReadHttpGet extends AsyncTask<Object, Object, Object> {
		@Override
		protected Object doInBackground(Object... params) {
			HttpGet httpRequest = new HttpGet(params[0].toString());
			try {
				HttpClient httpClient = new DefaultHttpClient();
				HttpResponse httpResponse = httpClient.execute(httpRequest);
				if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
					String strResult = EntityUtils.toString(httpResponse
							.getEntity());
					return strResult;
				} else {
					return "请求出错";
				}
			} catch (ClientProtocolException e) {
			} catch (IOException e) {
				e.printStackTrace();
			}
			return null;
		}


		protected void onCancelled(Object result) {
			super.onCancelled();
		}


		@SuppressLint("Override")
		@Override
		protected void onPostExecute(Object result) {
			super.onPostExecute(result);
			
			mMapView.regMapViewListener(mapManager, new MKMapViewListener() {
				// * 地图移动完成时会回调此接口 方法
				public void onMapMoveFinish() {
					showToast("地图移动完毕!");
				}


				// * 地图加载完毕回调此接口方法
				public void onMapLoadFinish() {
					showToast("地图载入完毕!");
				}


				// * 地图完成带动画的操作(如: animationTo())后,此回调被触发
				public void onMapAnimationFinish() {
				}


				// * 点击地图上被标记的点回调此方法
				public void onClickMapPoi(MapPoi arg0) {
					if (arg0 != null) {
						showToast(arg0.strText);
					}
				}
				
				// 当调用过 mMapView.getCurrentMap()后,此回调会被触发 可在此保存截图至存储设备
				public void onGetCurrentMap(Bitmap arg0) {
					// TODO Auto-generated method stub
				}
			});


			try {
				// 创建一个JSON对象
				JSONObject jsonObject = new JSONObject(result.toString())
						.getJSONObject("parent");
				// 获取某个对象的JSON数组
				JSONArray jsonArray = jsonObject.getJSONArray("children");
				StringBuilder builder = new StringBuilder();
				for (int i = 0; i < jsonArray.length(); i++) {
					// 新建一个JSON对象,该对象是某个数组里的其中一个对象
					JSONObject jsonObject2 = (JSONObject) jsonArray.opt(i);
					Map<String, Object> map = new HashMap<String, Object>();
					map.put("id", jsonObject2.getString("id"));
					map.put("name", jsonObject2.getString("name"));
					map.put("depth", jsonObject2.getString("depth"));
					map.put("lgtd", jsonObject2.getString("lgtd"));
					map.put("lttd", jsonObject2.getString("lttd"));
					curData.add(map);
				}
				
				Drawable marker = getResources().getDrawable(R.drawable.map_yqtag); // 得到需要标在地图上的资源
				marker.setBounds(0, 0, marker.getIntrinsicWidth(),
						marker.getIntrinsicHeight()); // 为maker定义位置和边界
				OverItemCrossBridgeInfo itemOverlay = new OverItemCrossBridgeInfo(marker,SYIT_SSJC.this,curData,mMapView);
				// 绘制文字
				TextOverlay textOverlay = new TextOverlay(mMapView);
				
				mMapView.getOverlays().clear();
				
				for (int i = 0; i < jsonArray.length(); i++) {
					// 新建一个JSON对象,该对象是某个数组里的其中一个对象
					JSONObject jsonObject2 = (JSONObject) jsonArray.opt(i);
					// 准备要添加的Overlay
					double mLat1 = Double.valueOf(jsonObject2.getString("lttd"));
					double mLon1 = Double.valueOf(jsonObject2.getString("lgtd"));
					// 用给定的经纬度构造GeoPoint,单位是微度 (度 * 1E6)
					GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));
					mMapController.setCenter(p1);
					// 用OverlayItem准备Overlay数据
					OverlayItem item1 = new OverlayItem(p1, jsonObject2.getString("name"), jsonObject2.getString("depth"));
					// 现在所有准备工作已准备好,使用以下方法管理overlay.
					// 添加overlay, 当批量添加Overlay时使用addItem(List<OverlayItem>)效率更高
					itemOverlay.addItem(item1);
					
					//mMapView.getOverlays().add(textOverlay);
					textOverlay.addText(drawText(mLat1,mLon1,jsonObject2.getString("name")+" "+jsonObject2.getString("depth")+"cm"));
				}
				// 将IteminizedOverlay添加到MapView中
				mMapView.getOverlays().add(textOverlay);
				mMapView.getOverlays().add(itemOverlay);
				
				mMapView.refresh();
				System.out.println(builder.toString());
				//加载设置地图中心点位置
				initMap();
			} catch (JSONException e) {
				e.printStackTrace();
			}
		}


		protected void onPreExecute() {
			Toast.makeText(getApplicationContext(), "开始HTTP GET请求",
					Toast.LENGTH_LONG).show();
		}


		protected void onProgressUpdate(Object... values) {
			super.onProgressUpdate(values);
		}
		
		
	}
	
	/**
	 * 绘制文字,该文字随地图变化有透视效果
	 * 
	 * @return 文字对象
	 */
	public TextItem drawText(double mLat,double mLon,String text) {
		int lat = (int) (mLat * 1E6);
		int lon = (int) (mLon * 1E6);
		// 构建文字
		TextItem item = new TextItem();
		// 设置文字位置
		item.pt = new GeoPoint(lat, lon);
		// 设置文件内容
		item.text = text;
		// 设文字大小
		item.fontSize = 30;
		Symbol symbol = new Symbol();
		Symbol.Color bgColor = symbol.new Color();
		// 设置文字背景色
		bgColor.red = 0;
		bgColor.blue = 0;
		bgColor.green = 255;
		bgColor.alpha = 50;


		Symbol.Color fontColor = symbol.new Color();
		// 设置文字着色
		fontColor.alpha = 255;
		fontColor.red = 0;
		fontColor.green = 0;
		fontColor.blue = 255;
		// 设置对齐方式
		item.align = TextItem.ALIGN_CENTER;
		// 设置文字颜色和背景颜色
		item.fontColor = fontColor;
		//item.bgColor = bgColor;
		return item;
	}
	
	/**
	 * 设置地图的坐标点在最中心显示
	 */
	public void initMap(){
		GeoPoint p;									// 保存精度和纬度的类,
		
		double eastMax = 0.0;						//经度最大值	东
		double southMin = 0.0;						//纬度最小值	南
		double westMin = 0.0;						//经度最小值	西
		double northMax = 0.0;						//纬度最大值	北
		
		double eastX = 0.0;							//经度最大值	东
		double eastY = 0.0;							//经度最大值	东
		double southX = 0.0;						//纬度最小值	南
		double southY = 0.0;						//纬度最小值	南
		double westX = 0.0;							//经度最小值	西
		double westY = 0.0;							//经度最小值	西
		double northX = 0.0;						//纬度最大值	北
		double northY = 0.0;						//纬度最大值	北
		
		for (int i = 0; i < curData.size(); i++)	// 计算经纬度中心点 先计算出最东、最西、最南、最北四个点 
		{
			Map<String, Object> mapItem = curData.get(i);
			
			double lttd = Double.parseDouble(mapItem.get("lttd").toString());
			double lgtd = Double.parseDouble(mapItem.get("lgtd").toString());
			
			if(lgtd > eastMax)						// 获取经度最大值	东
				eastMax = lgtd;
			if(lttd < southMin || southMin == 0.0)	// 获取纬度最小值	南
				southMin = lttd;
			if(lgtd < westMin || westMin == 0.0)	// 获取经度最小值	西
				westMin = lgtd;
			if(lttd > northMax)						// 获取纬度最大值	北
				northMax = lttd;
		}
		
		Log.i(xmTools.Tag, "经度最大值 :" + eastMax + "纬度最小值:" + southMin + "经度最小值 :" + eastMax + "纬度最大值:" + southMin);
		
		for (int i = 0; i < curData.size(); i++)	// 计算经纬度中心点 先计算出最东、最西、最南、最北四个点 
		{
			Map<String, Object> mapItem = curData.get(i);
			
			double lttd = Double.parseDouble(mapItem.get("lttd").toString());
			double lgtd = Double.parseDouble(mapItem.get("lgtd").toString());
			
			// 获取经度最大值	东
			if(lgtd == eastMax){
				eastX = lgtd;
				eastY = lttd;
			}
			// 获取纬度最小值	南
			if(lttd == southMin){
				southX = lgtd;
				southY = lttd;
			}
			// 获取经度最小值	西
			if(lgtd == westMin){
				westX = lgtd;
				westY = lttd;
			}
			// 获取纬度最大值	北
			if(lttd == northMax){
				northX = lgtd;
				northY = lttd;
			}
			
		}
		
		// 计算最东南西北四个坐标的中心点 设置p地方为中心点
		double centerX = eastX - ((eastX - westX)/2);
		double centerY = northY - ((northY - southY) /2);
		p = new GeoPoint( (int)(centerY * 1e6 ) ,(int)(centerX * 1e6));
		
		
		// 计算地图缩放比例
		// 设置地图缩放级别
		int spanLatDelta = (int) ((int) (Math.abs((eastX - westX) * 1e6) ) * 1.1);
	    int spanLngDelta = (int) ((int) (Math.abs((northY - southY) * 1e6) ) * 1.1);
		double temp1 = spanLatDelta;
		double temp2 = spanLngDelta;


		mMapController.zoomToSpan(spanLatDelta, spanLngDelta);
		//设置中心点经纬度
		mMapController.animateTo(p);
//		mMapController.setCenter(p);
	}


	
	/**
	 * 地图标记类
	 *
	 */
	class OverItemCrossBridgeInfo extends ItemizedOverlay<OverlayItem> {


		public List<OverlayItem> mGeoList = new ArrayList<OverlayItem>();
		private Drawable marker;
		private Context mContext;


		private double mLat3 = 39.90923;
		private double mLon3 = 116.437428;


		private List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();


		public OverItemCrossBridgeInfo(Drawable marker, Context context, List<Map<String,Object>> allArray,MapView mapView) {
			
			super(marker,mapView);
			//得到需要标在地图上的资源
			Drawable markerGreen = context.getResources().getDrawable(R.drawable.map_yqtag); 
			//为maker定义位置和边界
			markerGreen.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight());   
			
			this.marker = marker;
			this.mContext = context;
			this.list = allArray;


			// 处理经纬度坐标
			for (int i = 0; i < list.size(); i++) {
				Map<String, Object> mapItem = list.get(i);


				//赋值给字符串
//				String idStr = mapItem.get("id").toString();
				String name = mapItem.get("name").toString();
				String ydStr = mapItem.get("depth").toString();
				
				double lttd = Double.parseDouble(mapItem.get("lttd").toString() );
				double lgtd = Double.parseDouble(mapItem.get("lgtd").toString() );
				
				GeoPoint p1 = new GeoPoint((int) (lttd * 1E6),(int) (lgtd * 1E6));
				OverlayItem myPosOverlayitem = new OverlayItem(p1, name, name);
				mGeoList.add(myPosOverlayitem);
				
				//绘制文字
		        TextOverlay textOverlay = new TextOverlay(mapView);
		        mapView.getOverlays().add(textOverlay);
		        textOverlay.addText(drawText(lttd, lgtd, name));
			}
			
			this.addItem(mGeoList);
		}


		@Override
		// 处理当点击事件
		protected boolean onTap(int i) {
			try
			{
				Map<String, Object> mapItem = list.get(i);
				//赋值给字符串
				String stringId = mapItem.get("id").toString();
				String name = mapItem.get("name").toString();
				String ym = mapItem.get("depth").toString();
				
				SYIT_SSJC_Detail.crossBridgeID = stringId;
				SYIT_SSJC_Detail.crossBridgeName = name;
		
				Toast.makeText(this.mContext, mGeoList.get(i).getSnippet(),Toast.LENGTH_SHORT).show();
				
				Intent intent = new Intent(this.mContext, SYIT_SSJC_Detail.class);
				this.mContext.startActivity(intent);
				return true;
			}
			catch(Exception e)
			{
				return false;
			}
		}


		@Override
		public boolean onTap(GeoPoint arg0, MapView arg1) {
			// TODO Auto-generated method stub
			// 消去弹出的气泡
			// ItemizedOverlayDemo.mPopView.setVisibility(View.GONE);
			return super.onTap(arg0, arg1);
		}
		
	}
}



相关文章
|
8月前
|
定位技术 API 开发工具
Android 按照步骤接入百度地图API,定位显示不了解决办法
Android 按照步骤接入百度地图API,定位显示不了解决办法
229 0
|
Android开发
Android 13 平板Taskbar加载流程
Android 13 平板Taskbar加载流程
1369 0
|
Android开发
Android 13 Qs面板的加载流程
Android 13 Qs面板的加载流程
Android 13 Qs面板的加载流程
|
Android开发 开发者
Android 13 NotificationChannels与Notification的加载流程
Android 13 NotificationChannels与Notification的加载流程
Android 13 NotificationChannels与Notification的加载流程
|
6月前
|
API Android开发 数据安全/隐私保护
解决android webview 加载http url 失败 net::ERR_CLEARTEXT_NOT_PERMITTED 错误
解决android webview 加载http url 失败 net::ERR_CLEARTEXT_NOT_PERMITTED 错误
235 0
|
2天前
|
Android开发
Android Mediatek NVRAM 加载 MAC 地址并禁用 MAC 地址更新
Android Mediatek NVRAM 加载 MAC 地址并禁用 MAC 地址更新
6 0
|
4月前
|
XML Java Android开发
Android Studio App开发中异步任务AsynTask与异步服务IntentService的讲解与实战(实现四大名著的加载进度条 附源码)
Android Studio App开发中异步任务AsynTask与异步服务IntentService的讲解与实战(实现四大名著的加载进度条 附源码)
60 0
|
9月前
|
XML Java 数据处理
Android:RecyclerView封装,打造列表极简加载
此库的封装,除了刷新加载库使用了SmartRefreshLayout,其他的都是自己从0到1的开发,目前,自己已经在项目中使用,暂时没有出现任何问题,当然了,后续,也会不断的对其进行优化,增加一些其他的功能,希望有需要的小伙伴,长期关注。
236 0
|
10月前
|
缓存 物联网 定位技术
Android引入.so文件的正确姿势以及加载指定CPU架构的so库(android is 32-bit instead of 64-bit)
Android引入.so文件的正确姿势以及加载指定CPU架构的so库(android is 32-bit instead of 64-bit)