发表于: 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();
}
}
}
二、明天计划的事情
完善细节问题
三、遇到的问题
四、收获
百度地图:标识点
评论