Android載入百度地圖
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);
}
}
}
相關文章
- Android Studio 百度地圖導航Android地圖
- Android 圖片載入框架Android框架
- Android專案匯入高德地圖Android地圖
- Android 高效安全載入圖片Android
- 百度地圖POI爬取寫入TXT地圖
- 前端 – 百度地圖 API 基礎入門前端地圖API
- Android開發百度地圖指南針消失問題Android地圖
- Android Studio匯入並顯示國內地圖SDK步驟對比以及需要注意的點(百度地圖和高德地圖為例)Android地圖
- Android 百度地圖InfoWindow 出現重疊的問題Android地圖
- Android偽圖片載入進度效果Android
- Android 基礎之圖片載入(二)Android
- 求索十五載:百度地圖繪就的時代浪漫地圖
- 百度地圖GeoUtils示例地圖
- 百度地圖開發-引入地圖SDK並配置 02地圖
- Android圖片載入框架Fresco使用詳解Android框架
- [譯] 在Android中高效的載入大圖Android
- Android 圖片載入庫Glide知其然知其所以然之載入AndroidIDE
- 對接百度地圖API地圖API
- 自定義百度地圖元件地圖元件
- 百度地圖-課程安排地圖
- mapboxgl 糾偏百度地圖地圖
- 地圖資料採集,包括百度地圖採集,高德地圖採集,360地圖採集地圖
- 百度地圖開發-顯示地圖預設介面 03地圖
- 百度地圖開發-與地圖的互動功能 06地圖
- 百度地圖開發-實現離線地圖功能 05地圖
- MapBox載入GeoServer釋出的WMS地圖服務Server地圖
- Android高德地圖貼合圖片完成手繪地圖展示Android地圖
- Android9.0使用Glide載入圖片問題AndroidIDE
- 百度離線地圖瓦片圖製作地圖
- 百度地圖開發-在地圖上檢索資料 08地圖
- 地圖開發筆記(一):百度地圖介紹、使用和Qt內嵌地圖Demo地圖筆記QT
- 百度地圖軌跡(Andriod SDK)地圖
- 百度地圖爬蟲(c#)地圖爬蟲C#
- 百度地圖API功能演示地圖API
- 造“車輪”的百度地圖地圖
- 百度地圖反饋樣式地圖
- 百度地圖API基本使用(一)地圖API
- 百度地圖:2020年春運出行預測報告(附下載)地圖
- 百度地圖 :2022年五一假期出行預測報告(附下載)地圖