android 百度地图描绘POI
首先还是一贯作风,请大家先看一些图例:
在上一篇介绍了地图显示自己的位置,在这一篇呢,我简单介绍下在地图如何show出来一系列POI(兴趣点)
首先我们从服务器拉取要标记POI的信息如(lat,lon,Tag等信息)然后就是根据经纬度创建ItemizedOverlay.这个是用于显示一系列的POI.
代码片段:
在onLocationChanged调用:
[java]
/***
* Location 监听
*
* @param arg0
*/
@Override
public void onLocationChanged(Location location) {
if (location != null) {
// 获取自己的经纬度点
GeoPoint geoPoint = new GeoPoint(
(int) (location.getLatitude() * 1e6),
(int) (location.getLongitude() * 1e6));
mMapController.setCenter(geoPoint);
addItemizedOverlay(geoPoint.getLatitudeE6() / 1e6,
geoPoint.getLongitudeE6() / 1e6);// 定位一系列点
// addOverLay(geoPoint);
}
}
[java]
/***
* 添加一系列的overlay 范围在5000米内
*
* @param lat
* 纬度
* @param lon
* 经度
*/
void addItemizedOverlay(double lat, double lon) {
arrayList = new ArrayList<MarkInfo>();
// 获取服务器返回的一系列点
ArrayList<MarkInfo> markInfos = Constent.getArrayListPoint();
for (int i = 0; i < markInfos.size(); i++) {
MarkInfo markInfo = markInfos.get(i);
Double dis = MyUtil.getGeoPointDistance(lat, lon, markInfo.lat,
markInfo.lon);
if (dis <= distance)
arrayList.add(markInfo);
}
Drawable marker = getResources().getDrawable(R.drawable.item);
marker.setBounds(0, 0, marker.getIntrinsicWidth(),
marker.getIntrinsicHeight()); // 为maker定义位置和边界
overlays = mMapView.getOverlays();
myItemizedOverlay = new MyItemizedOverlay(marker, this, arrayList);
myItemizedOverlay.setMapView(mMapView);
overlays.add(myItemizedOverlay);
mPopView = createMarkView();// 获取冒泡view
myItemizedOverlay.setmPopView(mPopView);
// 将泡泡添加到mMapView上
mMapView.addView(mPopView, new MapView.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, null,
MapView.LayoutParams.WRAP_CONTENT));
mPopView.setVisibility(View.GONE);
}
[java]
/***
* 创建点击mark时的弹出泡泡
*/
public View createMarkView() {
layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mPopView = layoutInflater.inflate(R.layout.popview, null);
TextView textView = (TextView) mPopView.findViewById(R.id.snippet);
mPopView.setTag(textView);
return mPopView;
}
这里我简单模拟获取服务器的一系列的poi. 并计算自身与这些poi的位置距离,如果小于5000.则显示出来.
在这里说明一下:首先服务器边的处理,不能把所有的poi数据都返回给我们,如果是这样,那么手机就会很耗时会吃不消,不符合移动项目的需求,服务器端:应该对这一系列的poi进行处理,比如根据地区划分开来,如:我传给服务器参数上海浦东,那么只返回给我浦东一系列的poi,这样就解决了这个问题,另外,最好的办法是这段逻辑最好在服务器端,我们请求服务器的参数把距离5000也带过去,返回给我们直接就是要show的poi,这样设计最好了.扯了有点偏了,不过我是初学者,就简单记录下来,如有不妥或着更简单的方法,还请您指示一二,谢谢在先了.
MyItemizedOverlay.java
[java]
package com.jj.baidu;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.mapapi.GeoPoint;
import com.baidu.mapapi.ItemizedOverlay;
import com.baidu.mapapi.MapView;
import com.baidu.mapapi.OverlayItem;
import com.baidu.mapapi.Projection;
import com.jj.modle.MarkInfo;
/***
* 系列覆盖物
*
* @author zhangjia
*
*/
public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {
private List<OverlayItem> overlayItems;
private OverlayItem overlayItem, overlayItem2, overlayItem3, overlayItem4,
overlayItem5, overlayItem6;
private Context mContext;
private Drawable marker;// 覆盖物图标
private View mPopView = null; // 点击mark时弹出的气泡View
private MapView mapView;
&
补充:移动开发 , Android ,