百度地图自定义Marker

最近写了百度地图的Demo,所以总结下遇到的问题;

1.首先在百度地图中创建应用时用到 发布版SHA1是在Preferences下的Android下的Build中;
2.在使用百度地图时,先要创建一个Application的类,中间引用 SDKInitializer.initialize(this)// 在使用 SDK 各组间之前初始化 context 信息,传入 ApplicationContext;

3.在清单文件中配置应用的权限及配置com.baidu.lbsapi.API_KEY

4.使用时候将你用到的jar包添加上,离线包需要的添加上;

如下是我写的例子的2个效果图:

一共是3个小例子:定位自己,添加marker,和轨迹;

在写的时候一共遇到2个问题:

1.在使用定位的时候,忘了加定位的离线包,所以一直定位到大西洋,定位错误;

2.在添加轨迹的时候,我使用模拟器的时候,一直蹦溃没有处理好,但是用真机时候又可以了。

如下是代码下载链接:http://download.csdn.net/detail/qq_29774291/9718205

如下是主要代码:

package com.item.baidu;

import java.util.ArrayList;
import java.util.List;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
import com.baidu.mapapi.map.InfoWindow.OnInfoWindowClickListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.GroundOverlayOptions;
import com.baidu.mapapi.map.InfoWindow;
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.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

/**
 * 添加自定义的mark
 * 
 * @author Administrator
 * 
 */
public class MyMarkActivity extends Activity {
    private MapView mMapView;
    private BaiduMap mBaiduMap;
    private List<Bean> mapBeans;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mark);
        mMapView = (MapView)findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();
        MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(13.0f);
        mBaiduMap.setMapStatus(msu);
        mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {
            
            @Override
            public boolean onMarkerClick(Marker marker) {
                // TODO Auto-generated method stub
                final Bean beans = (Bean)marker.getExtraInfo().get("BEAN");
                View markView = View.inflate(getApplicationContext(), R.layout.item_maker, null);
                TextView tv_id = (TextView)markView.findViewById(R.id.mark_id);
                TextView tv_number = (TextView)markView.findViewById(R.id.mark_carnumber);
                TextView tv_speed = (TextView)markView.findViewById(R.id.mark_speed);
                tv_id.setText(beans.getId()  + "");
                tv_number.setText("车  牌 号:" + beans.getNumber());
                tv_speed.setText("当前车速:" + beans.getSpeed() + " km/h");
                OnInfoWindowClickListener listener = null;
                listener = new OnInfoWindowClickListener() {
                    
                    @Override
                    public void onInfoWindowClick() {
                        // TODO Auto-generated method stub
                        Intent intent = new Intent(MyMarkActivity.this,TrackActivity.class);
                        intent.putExtra("bean", beans);
                        startActivity(intent);
                        mBaiduMap.hideInfoWindow();
                    }
                };
                LatLng ll = marker.getPosition();
                InfoWindow mInfoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(markView), ll, -47, listener);
                mBaiduMap.showInfoWindow(mInfoWindow);
                return true;
            }
        });
       
        initData();
    }
    /**
     * 添加几个数据
     */
    BitmapDescriptor bdGround = BitmapDescriptorFactory.fromResource(R.drawable.ground_overlay);
    private void initData() {
        // TODO Auto-generated method stub
        //设置中心点
        LatLng southwest = new LatLng(39.92235, 116.380338);
        LatLng northeast = new LatLng(39.947246, 116.414977);
        LatLngBounds bounds = new LatLngBounds.Builder().include(northeast).include(southwest).build();
        OverlayOptions ooGround = new GroundOverlayOptions().positionFromBounds(bounds).image(bdGround).transparency(0.7f);
        mBaiduMap.addOverlay(ooGround);
        //添加marker
        mapBeans = new ArrayList<Bean>();
        mapBeans.add(new Bean(1, "皖111111", "111", 30.82943, 116.89586));
        mapBeans.add(new Bean(2, "皖222222", "222", 39.942821, 116.369199));
        mapBeans.add(new Bean(3, "皖333333", "333", 39.939723, 116.425541));
        mapBeans.add(new Bean(4, "皖444444", "444", 39.906965, 116.401394));
        mapBeans.add(new Bean(5, "皖555555", "555", 39.82943, 116.42586));
        mapBeans.add(new Bean(6, "皖666666", "666", 38.92943,116.89586));
        mapBeans.add(new Bean(7, "皖777777", "777", 39.92235, 116.414977));
        mapBeans.add(new Bean(8, "皖888888", "888", 39.947246, 116.89586));
        for(Bean bean : mapBeans){
            LatLng latLng = new LatLng(bean.getLatitude(), bean.getLongitude());
            Bundle bundle = new Bundle();
            bundle.putSerializable("BEAN", bean);
            View view = View.inflate(getApplicationContext(), R.layout.item_bean, null);
            TextView tView = (TextView)view.findViewById(R.id.item_bean);
            tView.setText(bean.getId() + "");
            //将View转化为Bitmap
            BitmapDescriptor descriptor = BitmapDescriptorFactory.fromView(view);
            OverlayOptions options = new MarkerOptions().position(latLng).icon(descriptor).extraInfo(bundle).zIndex(9).draggable(true);
            mBaiduMap.addOverlay(options);
        }
    }
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        mMapView.onResume();
    }
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        mMapView.onPause();
    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        mMapView.onDestroy();
        mBaiduMap = null;
        bdGround.recycle();
    }
}

定位的代码

package com.item.baidu;


import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

/**
 * 定位自己
 * 
 * @author Administrator
 * 
 */
public class MyOptionActivity extends Activity {
    private TextView tv_option;
    private MapView mMapView;
    private BaiduMap mBaiduMap;
    //定位相关
    private LocationClient mLocClient;
    private boolean isFirstLoc = true;//是否首次定位
    private MyLocationListenner myListener = new MyLocationListenner();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_option);
        tv_option = (TextView) findViewById(R.id.tv_option);
        mMapView = (MapView) findViewById(R.id.map_option);
        mBaiduMap = mMapView.getMap();
        MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(13.0f);
        mBaiduMap.setMapStatus(msu);
        
        //开启定位图层
        mBaiduMap.setMyLocationEnabled(true);
        //定位初始化
        mLocClient = new LocationClient(getApplicationContext());
        mLocClient.registerLocationListener(myListener);
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);// 打开GPS
        option.setCoorType("bd09ll");//设置坐标类型
        option.setScanSpan(10000);//设置扫描间隔,单位是毫秒 当<1000(1s)时,定时定位无效    
        option.setIsNeedAddress(true);//设置地址信息,默认无地址信息
        mLocClient.setLocOption(option);
        mLocClient.start();
    }
    /**
     * 定位SDK监听函数
     */
    private class MyLocationListenner implements BDLocationListener{

        @Override
        public void onReceiveLocation(BDLocation location) {
            // TODO Auto-generated method stub
            // map view 销毁后不在处理新接收的位置
            if (location == null || mMapView == null) {
                return;
            }
            MyLocationData locData = new MyLocationData.Builder()
            .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
            .direction(100).latitude(location.getLatitude())
            .longitude(location.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);
            if (isFirstLoc) {
                isFirstLoc = false;
                LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
                tv_option.setText(ll +"详情地点:" + location.getAddrStr() + "   城市:" +location.getCity());
                MapStatus.Builder builder = new MapStatus.Builder();
                builder.target(ll).zoom(18.0f);
                mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
            }
        }
        
    }
    @Override
    protected void onPause() {
        // MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
        mMapView.onPause();
        super.onPause();
    }

    @Override
    protected void onResume() {
        // MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume()
        mMapView.onResume();
        super.onResume();
    }
    @Override
    protected void onDestroy() {
        // 退出时销毁定位
        mLocClient.stop();
        // 关闭定位图层
        mBaiduMap.setMyLocationEnabled(false);
        // MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()
        mMapView.onDestroy();
        mMapView = null;
        super.onDestroy();

    }
}

轨迹

    private void initData() {
        // TODO Auto-generated method stub
        Intent intent = getIntent();
        Bean bean = (Bean)intent.getSerializableExtra("bean");
        tv_bean.setText(bean.getNumber() + "");
        initTrack();
        //设置开始的坐标为地图中心点
        mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(pointLngs.get(0)));
        //添加开始的图标
        mBaiduMap.addOverlay(new MarkerOptions().position(pointLngs.get(0))
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_start)));
        //添加结束的图标
        mBaiduMap.addOverlay(new MarkerOptions().position(pointLngs.get(pointLngs.size()-1))
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_end)));
        //描线
        mBaiduMap.addOverlay(new PolylineOptions().width(8).color(Color.rgb(0,255,0))
                .points(pointLngs).dottedLine(true));
    }

 

posted @ 2016-07-04 16:25  王丰蛋哥  阅读(32834)  评论(0编辑  收藏  举报