首页 > 代码库 > 百度地图开发-将多个地点标记在地图上,点击节点弹出PopupWindow

百度地图开发-将多个地点标记在地图上,点击节点弹出PopupWindow

最近在写一个安卓程序,用到了百度地图API的一些内容,就随便玩耍了一下。


这个DEMO是用来将多个地点标记在地图上,然后点击节点弹出PopupWindow


下面是一些截图:





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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.baidumaptest.MainActivity" >
    
    <LinearLayout 
        android:id="@+id/ll_baidumap"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal"
        >
       
       <TextView 
           android:id="@+id/tv_showinfo"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           />
        
    </LinearLayout>
    
      <com.baidu.mapapi.map.MapView
          android:id="@+id/bmapView"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent" />

</RelativeLayout>


popupwindow_showlocations.xml

<?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="wrap_content"
    android:orientation="vertical" 
    android:background="#89D3D3D3"
    >
    
        <TextView 
            android:id="@+id/tv_locationname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="地点:"
            android:textSize="20sp"
            />
        
        <TextView 
            android:id="@+id/tv_locationtime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="时间:"
            android:textSize="20sp"
            />
        

</LinearLayout>


MainActivity.java
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.MapStatusUpdate;
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.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;

import android.support.v7.app.ActionBarActivity;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {
	private MapView mMapView;
	private BaiduMap mBaiduMap;
	private Marker marker[];
	private TextView locationName;
	private TextView locationTime;
	private PopupWindow infoPopupWindow;
	
	BitmapDescriptor bitmapDescriptor;	
	BitmapDescriptor bdGround;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		SDKInitializer.initialize(getApplicationContext());
		setContentView(R.layout.layout_showlocations);
		
		locationName = (TextView)findViewById(R.id.tv_locationname);
		locationTime = (TextView)findViewById(R.id.tv_locationtime);
		
		LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
		View popupWindow = layoutInflater.inflate(R.layout.popupwindow_showlocations, null);
		infoPopupWindow = new PopupWindow(popupWindow, 600, 800); 
		infoPopupWindow.setFocusable(true);
		infoPopupWindow.setBackgroundDrawable(new BitmapDrawable());
		locationName = (TextView)popupWindow.findViewById(R.id.tv_locationname);
		locationTime = (TextView)popupWindow.findViewById(R.id.tv_locationtime);
	
		final LocationOfPhoto locations[] = new LocationOfPhoto[4];
		locations[0] = new LocationOfPhoto("齐鲁软件学院", "2013.06.06", 36.673141, 117.114275);
		locations[1] = new LocationOfPhoto("天安门", "2014.06.06", 39.912089, 116.403928);
		locations[2] = new LocationOfPhoto("五大道", "2013.04.02", 39.116073, 117.203932);
		locations[3] = new LocationOfPhoto("甘肃白银", "2013.04.02", 36.501821, 104.205648);

		
		mMapView = (MapView)findViewById(R.id.bmapView);
		mBaiduMap = mMapView.getMap();
		bitmapDescriptor  = BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding);
		bdGround  = BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding);
		initOverlay(locations);
		
		mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {

			@Override
			public boolean onMarkerClick(Marker m) {
				for(int index = 0; index < locations.length; index++){
					if(m == marker[index]){
						locationName.setText("地点: "+locations[index].getName());
						locationTime.setText("时间: " +locations[index].getTime());
						Toast.makeText(getApplicationContext(), locations[index].getName()+"\n", Toast.LENGTH_LONG).show();
						infoPopupWindow.showAtLocation(mMapView, Gravity.CENTER, 0, 0);
					}
				}
				return true;
			}
		});
	}
	
	

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
	
	public void initOverlay(LocationOfPhoto locations[]){
		int count = locations.length;
		LatLng latLngs;
		LatLngBounds bounds = null;
		double min_latitude = 0, min_longitude = 0,
				max_latitude = 0, max_longitude = 0;
		
		for(int i = 0; i < count-1; i++){
			if(locations[i].getLocation().latitude <= locations[i+1].getLocation().latitude){
				min_latitude = locations[i].getLocation().latitude;
				max_latitude = locations[i+1].getLocation().latitude;
			}
			else {
				min_latitude = locations[i+1].getLocation().latitude;
				max_latitude = locations[i].getLocation().latitude;
			}
			if(locations[i].getLocation().longitude <= locations[i+1].getLocation().longitude){
				min_longitude = locations[i].getLocation().longitude;
				max_longitude = locations[i+1].getLocation().longitude;
			}
			else {
				min_longitude = locations[i+1].getLocation().longitude;
				max_longitude = locations[i].getLocation().longitude;
			}
		}
		marker = new Marker[count];
		for(int i = 0; i < count; i++){
			latLngs = locations[i].getLocation();
			OverlayOptions overlayOptions_marker = new MarkerOptions().position(latLngs).icon(bitmapDescriptor);
			marker[i] = (Marker)(mBaiduMap.addOverlay(overlayOptions_marker));
		}
		LatLng southwest = new LatLng(min_latitude, min_longitude);
		LatLng northeast = new LatLng(max_latitude, max_longitude);
		LatLng northwest = new LatLng(max_latitude, min_longitude);
		LatLng southeast = new LatLng(min_latitude, max_longitude);

		bounds = new LatLngBounds.Builder().include(northeast).include(southwest).include(southeast).include(northwest).build();
		MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngBounds(bounds);
		mBaiduMap.animateMapStatus(mapStatusUpdate,1000);
		MapStatusUpdate mapStatusUpdate_zoom = MapStatusUpdateFactory.zoomTo(5);
		mBaiduMap.setMapStatus(mapStatusUpdate_zoom);
	}
}

LocationOfPhoto.java

import com.baidu.mapapi.model.LatLng;

public class LocationOfPhoto {
	private String name;
	private String time;
	private LatLng location;
	
	public LocationOfPhoto() {
		name = "";
		time = "";
		location = null;
	}
	public LocationOfPhoto(String name, String time, LatLng location){
		this.name = name;
		this.time = time;
		this.location = location;
	}
	public LocationOfPhoto(String name, String time, double latitude, double longitude){
		this.name = name;
		this.time = time;
		location = new LatLng(latitude, longitude);
	}
	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}
	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}
	/**
	 * @return the time
	 */
	public String getTime() {
		return time;
	}
	/**
	 * @param time the time to set
	 */
	public void setTime(String time) {
		this.time = time;
	}
	/**
	 * @return the location
	 */
	public LatLng getLocation() {
		return location;
	}
	/**
	 * @param location the location to set
	 */
	public void setLocation(LatLng location) {
		this.location = location;
	}
	
}


百度地图开发-将多个地点标记在地图上,点击节点弹出PopupWindow