百度地图开发-将多个地点标记在地图上,点击节点弹出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;
	}

}
时间: 2024-10-31 07:08:04

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

Android应用之——百度地图最新SDK3.0应用,实现最常用的标注覆盖物以及弹出窗覆盖物

一.概述 最新版的百度地图SDK3.0,修改了很多方法,之前的很多方法被简化了,正好在做地图这一块,顺便就使用了最新版的sdk. 下载官方给的demo,发现变化还是挺大的,之前的一些方法都换了,地图的初始化也进行了调整.多了好几个类,具体用法参考下面的例子,详细的说明可参照官方的说明文档. 二.效果图 标注覆盖物效果图: 弹出窗覆盖物: 三.实现过程 大部分是根据官方给的demo来的. A.配置文件: 第一步:在工程里新建libs文件夹,将开发包里的baidumapapi_vX_X_X.jar拷

[Phonegap+Sencha Touch] 移动开发24 打包wp8.1的App,运行时输入框聚焦弹出软键盘之后,界面上移而不恢复原位的解决办法

这个现象只出现在phonegap打包sencha touch的wp8.1程序会出现(仅wp8.1,wp8正常),其它js框架我测试了几个(app framework, jquery mobile),好像没有这个问题. 我来描述一下这个现象: 1.运行phonegap打包的wp8程序,打开一个有输入框的界面,如下图: 2.点击输入框,使其弹出软键盘,界面会上移,如下图: 3.点返回键隐藏软键盘(或者点击界面上其它地方隐藏软键盘),此时界面不恢复原位,如下图: 我的一些研究结果: 1.这种现象只出现

使用jsonp跨域调用百度js实现搜索框智能提示,并实现鼠标和键盘对弹出框里候选词的操作【附源码和在线测试地址】

项目中常常用到搜索,特别是导航类的网站.自己做关键字搜索不太现实,直接调用百度的是最好的选择.使用jQuery.ajax的jsonp方法可以异域调用到百度的js并拿到返回值,当然$.getScript也可以实现跨域调用js. jsonp快速入门: [原创]说说JSON和JSONP,也许你会豁然开朗,含jQuery用例 关于jquery.ajax的jsonp方法是用以及其error回调函数不能正确执行,请参考园长dudu的文章: jquery ajax中使用jsonp的限制 jQuery插件jQu

百度地图开发之获取定位地点

在前面几次我们分别完成了数据检索和线路规划的功能,但是如果我们不知道自己位置,检索起来说是不是会很麻烦呢? 知道自己位置就可以根据自己的位置进行检索和路线规划. 定位服务 在读地图的定位服务是与基本地图服务分开的所以需要引入另外的so文件盒jar包,如果你选择的是复合包的话,只用一如so文件就OK了. 首先在清单文件中加上如下的服务 <span class="sy0" style="color: rgb(51, 153, 51);"><</s

【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行

前言: 近期在写一个小程序,需求是手机摇一摇就弹窗出来.第一次使用了Service,学习了两天,实现了Service弹窗,开机启动,Service启动和销毁,Service保持一直执行. 满足了自己的需求.现记录学习心得. 希望能给你带来一些帮助. 1.Service创建:重写4个方法 onBind():返回一个IBinder对象,这个对象能够使应用程序与Service通信.假设用startService.stopService启动和关闭Service的话.Service和訪问者是无法通信交换数

细说针对企业内部应用地图开发

从事开发行业以来,本人一直喜欢GIS开发这块.尤其是中国进入电子商务互联网时代以后,电商的发展带动了地图行业的发展,越来越多社会活动和经济活动基于地图开发的产品.各种地图的衍生行业也越来越多,发展最块的就是公共地图行业,百度,谷歌,高德,腾讯等地图龙头企业用户都超大大占有了市场.同时地图衍生社区活动,购物银行等附带产品也日益丰富.在公共地图的打压下,有些地图厂商便将自己的产品转向了企业地图和商用地图的领域. 在地图行业我也算个老人了,所以行业的发展趋势我比较的关注.从朋友的公司最近我也是了解到不

[转]Net Framework引路蜂地图开发示例

From:http://www.2cto.com/kf/201207/140421.html 引路蜂地图也提供对.Net Framework平台的支持,可以开发桌面地图应用,由于Mono C#的跨平台特性,使用Visual Studio 和Mono引路蜂地图开发包开发的地图应用可以运行于Windows ,Lunix,Unix,Mac OS等平台.开发桌面应用比开发移动应用要容易的多,屏幕,内存等方面都比移动平台要宽裕的多.下面使用一个简单的应用来介绍一下.Net Framework引路蜂地图开发

Android studio 百度地图开发(8)地图已标记POI点和搜索POI点的获取和利用

一简要描述 二地图中已标记POI点 1接口 2MapPoi 类 3获取POI 三搜索关键词获取POI点 描述 1combaidumapapisearchpoi 接口OnGetPoiSearchResultListener PoiResult类 PoiInfo类 搜索POI 2combaidumapapisearchsug 接口 SuggestionResultseggestionInfo 联想搜索 四搜索效果 1联想搜索效果 2直接搜索效果 3选择一条联想搜索结果 五总结 一.简要描述 百度地图

Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图

标签: Android百度地图API Key  分类: Android 百度地图开发(2)  最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地图入手,其实他们的用法都差不多,本篇文章就带领大家在自己的Android项目中加入百度地图的功能,接下来我会写一系列关于百度地图的文章,欢迎大家到时候关注!   一 申请API key 在使用百度地图之前,我们必须去申请一个百度地图的API key,申请地址http://lbsyun.baidu.com/a