发表于: 2018-11-09 22:18:10

0 818


一、今天完成的事情

 在地图上显示护工的位置

用到了百度SDK提供的点标记功能,点标记用来在地图上标记任何位置,例如用户位置、车辆位置、店铺位置等一切带有位置属性的事物。地图 SDK 提供的点标记功能包含两大部分,一部分是点( Marker)、另一部分是浮于点上方的信息窗体( InfoWindow)。同时,SDK 对 Marker 和 InfoWindow 封装了大量的触发事件,例如点击事件、长按事件、拖拽事件。

首先要将护工的地址转换成坐标,为了方便以后在其他地方使用转换坐标功能,写了一个工具类

public class BaiduMapUtils {
  private static final String TAG = "BaiduMapUtils";

  private TransListener transListener;
  public void setTransListener(TransListener transListener) {
           this.transListener = transListener;
  }

      /**
    * 地理编码
    * @param city
    * @param address
    */
  public void addressToCoordinate(String city, String address, final String extraInfo) {

          final GeoCoder mSearch = GeoCoder.newInstance();
     //设置监听
     mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {

                @Override
        public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
                      if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR){
               Log.i(TAG, "onGetGeoCodeResult: 未能根据地址查询到坐标结果");
               //释放检索实例
               mSearch.destroy();
           } else {
               LatLng ll = geoCodeResult.getLocation();
               transListener.onSuccess(ll.latitude, ll.longitude, extraInfo);
               Log.i(TAG, "onGetGeoCodeResult: \n经度:" + ll.latitude + "\n纬度:" + ll.longitude);
               //释放检索实例
               mSearch.destroy();
           }
   }

                @Override
        public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
                       //释放检索实例
           mSearch.destroy();
        }
  });

     //开始查询
      mSearch.geocode(new GeoCodeOption()
         .city(city)
         .address(address));
 }

public interface TransListener {
            void onSuccess(Double latitude, Double longitude, String extraInfo);
      //void onFailed();
  }


}

将查询到的护工数据添加到List中,然后调用showMarker()将其显示在地图上,里面用到了上面的转换地理坐标的工具。Bundle是用来向Marker中传递数据的,用于点击Marker时做一些操作,这里传入了护工的唯一标识id,点击地图上的marker时会根据传入的id显示对应护工的信息。

//显示Marker
private void showMarker(List<WorkerPost> list) {
      //清空地图
   baiduMap.clear();
   for (WorkerPost workerPost : list) {
              //获取地址
       String city = workerPost.getCity();
       String address = workerPost.getArea() + workerPost.getSpecificAddress();
       String objectId = workerPost.getObjectId();
       Log.i(TAG, "showMarker: 城市:"+ city + "  详细:" + address);

       //将地址转换为地理坐标
       baiduMapUtils.addressToCoordinate(city, address, objectId);
       baiduMapUtils.setTransListener(new BaiduMapUtils.TransListener() {
                      @Override
           public void onSuccess(Double latitude, Double longitude, String extraInfo) {
                 OverlayOptions options = new MarkerOptions()
                       .position(new LatLng(latitude, longitude))  //设置坐标
                       .icon(bitmap)  //设置图标
                       .zIndex(9);  //设置层级
               baiduMap.addOverlay(options);
               Marker marker = (Marker) baiduMap.addOverlay(options);
               Bundle bundle = new Bundle();
               bundle.putString("objectId", extraInfo);
               marker.setExtraInfo(bundle);
           }
       });
   }
}

为Marker添加点击事件,这里从Bundle中取出了数据,也就是刚才传入的护工id,然后在界面中添加了一个

Fragment,护工的id也被传入了Fragment,在Fragment中通过护工id查询到护工的信息,然后显示到

Fragment中。

baiduMap = mapView.getMap();
baiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
      @Override
   public boolean onMarkerClick(Marker marker) {
       Bundle bundle = marker.getExtraInfo();
       //String objectId = bundle.getString("objectId", "");
       showFragmentFL.setVisibility(View.VISIBLE);
       if (workerInfoFragment == null) {
                     workerInfoFragment = new WorkerInMapFragment();
       }
              //将objectId传给workerInfoFragment
       workerInfoFragment.setArguments(bundle);
       addOrShowFragment(getSupportFragmentManager().beginTransaction(), workerInfoFragment);
       return true;
   }
});

在Fragment的onStart中接受传入的数据

@Override
public void onStart() {
     super.onStart();
      if (isAdded()) { //判断Fragment已经依附Activity
          try {
                objectId = getArguments().getString("objectId", "");
          } catch (NullPointerException e) {
                 e.printStackTrace();
          }
     if (!objectId.equals("")) {
            //开始查询
           new Thread() {
                 public void run() {
                 WorkerPost.queryWorkerPostInfo(objectId);
               }
           }.start();
    }
 }
}



二、明天计划的事情

      完善细节问题


三、遇到的问题

    


四、收获

   百度地图:标识点



返回列表 返回列表
评论

    分享到