两个用户之间,可以实时地查看两个人的相对位置,这就是实时点对点地图。
要实现这种地图,查了一下,没有发现有现成的工具可用,不过百度地图倒是有路线规划功能,可以考虑。这样的话,我们想,通过每隔几秒请求一次两个人的相对位置,然后使用百度地图的路线规划API,就可以做出两个人之间的实时点对点地图了。
每隔几秒请求一次,这样对于服务器的压力是很大的,因此我们想到了使用第三方即时通讯的方式。两个人通过即时通讯平台发送位置信息,从而缓解了我们的服务器压力,而且也有着非常高的稳定性,一举多得。
实现过程简介:
1.定义前缀常量
2.双方确认
实时地图是需要双方同时确认的,因为他是敏感位置信息的传输。
3.同步显示
要实现这种地图,查了一下,没有发现有现成的工具可用,不过百度地图倒是有路线规划功能,可以考虑。这样的话,我们想,通过每隔几秒请求一次两个人的相对位置,然后使用百度地图的路线规划API,就可以做出两个人之间的实时点对点地图了。
每隔几秒请求一次,这样对于服务器的压力是很大的,因此我们想到了使用第三方即时通讯的方式。两个人通过即时通讯平台发送位置信息,从而缓解了我们的服务器压力,而且也有着非常高的稳定性,一举多得。
实现过程简介:
1.定义前缀常量
public static final String MSG_HIDE_HEAD = "×_";// 所有隐藏头相关的起始标志(乘号,下划线)
public static final String MSG_SHOW_HEAD = "_×";// 所有隐藏头相关的起始标志(乘号,下划线)
public static final String MSG_HIDE_NULL = MSG_HIDE_HEAD + " ";//NULL:+两个全角空格
public static final String MSG_MAP_SHOW = MSG_SHOW_HEAD+"show";// 消息中的地图显示
public static final String MSG_MAP_SPLIT = "-";// 地图的分隔符
public static final String MSG_MAP_REQUEST = MSG_HIDE_HEAD + "map_request_start";
public static final String MSG_MAP_REQUEST_STOP = MSG_HIDE_HEAD
+ "map_request_stop";
public static final String MSG_MAP_REJECT = MSG_HIDE_HEAD + "map_reject";
public static final String MSG_MAP_ONETIME = MSG_HIDE_HEAD + "map_onetime";// +x-y
public static final String MSG_MAP_START = MSG_HIDE_HEAD + "map_start";
public static final String MSG_MAP_RECEIVE = MSG_HIDE_HEAD + "map_receive";
public static final String MSG_MAP_REALTIME = MSG_HIDE_HEAD + "map_realtime";// +x-y
2.双方确认
实时地图是需要双方同时确认的,因为他是敏感位置信息的传输。
public MapReceiveDialog(Context context) {
super(context, "点对点地图");
setText("\n对方发起点对点地图。\n是否同意对方获取您的位置?\n");
setPositiveButton("允许", null);// 此处null即可
setNegativeButton("拒绝", new DialogButtonListener() {
public void onButtonClick() {
cancelDialog();
}
});
setCancelable(false);// 就放在这里
}
3.同步显示
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 无标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 布局
setContentView(R.layout.dialog_map_show);
TextView tv_title = ((TextView) findViewById(R.id.top_text));
tv_title.setText("点对点地图");
showBackButton();
// handler
initHandler();
// 获取地图控件引用(此处添加到xml中会报错)
mMapView = new MapView(activity);
mMapView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
((LinearLayout) findViewById(R.id.dia_map_show_layout))
.addView(mMapView);
mBaidumap = mMapView.getMap();
// 显示指南针控件(此处必须先false再true)
UiSettings mUiSettings = mBaidumap.getUiSettings();
mUiSettings.setCompassEnabled(false);
mUiSettings.setCompassEnabled(true);
// 实时刷新显示用户位置
update_running = true;
startUpdateThread();
}
private void showMyLocation(double my_x, double my_y, float limit) {
// 显示定位
mBaidumap.setMyLocationEnabled(true);
MyLocationData locData = new MyLocationData.Builder().accuracy(limit)
.direction(100).latitude(my_y).longitude(my_x).build();
mBaidumap.setMyLocationData(locData);
// 设置为中心点
mBaidumap.setMapStatus(MapStatusUpdateFactory
.newMapStatus(new MapStatus.Builder().zoom(17.0f).build()));
LatLng latlng = new LatLng(my_y, my_x);
mBaidumap.animateMapStatus(MapStatusUpdateFactory.newLatLng(latlng));
}
以上即为实现的基本过程。