百度地圖自定義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));
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM