提示: 由于project略微有点大对我个人来说。所以可能在某些方面讲的不清楚或逻辑性不够强,假设有问题请@我。

原project:https://github.com/LineChen/

六、用户位置管理

client的操作是摇一摇发送自己的位置吧并在地图上显示周围一公里用户的名称(client定位服务用的是百度地图),为了保持位置的时效性,

控制每五分钟发送一次用户的位置。server端要保存每一个开启位置服务的用户的位置,考虑到用户量可能会非常大,

不可能把全部的用户保存在一个哈希表中,所以分省份来分组保存,实际处理中可能须要分市来保存。

/**

* 用户位置类

*

* @author Administrator

*

*/

public class myLocationBean {

// 省份、经纬度

public String province;

public double longitude;

public double latitude;

@Override

public String toString() {

return "myLocationBean [province=" + province + ", longitude="

+ longitude + ", latitude=" + latitude + "]";

}

}

package com.managers;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import com.imomo_msg.myLocationBean;

/**

* 按省来管理用户位置

*

* @author Administrator

*

*/

public class ManageLocMap {

public static Map<String, ManageAProvinceLoc> map = new HashMap<String, ManageAProvinceLoc>();

/**

* 得到一个省的位置管理类

*

* @param province

* @return

*/

public static ManageAProvinceLoc getAProvinceLoc(String province) {

if (isContainsProvince(province)) {

// System.out.println("get省:" + province);

return (ManageAProvinceLoc) map.get(province);

}

return null;

}

/**

* 加入一个省位置管理类

*

* @param province

* @param AProvinceLoc

*/

public static void addAProvinceLoc(String province,

ManageAProvinceLoc AProvinceLoc) {

// System.out.println("加入省:--" + province);

map.put(province, AProvinceLoc);

}

/**

* 删除一个省的位置管理类

*

* @param province

*/

public static void deleteAProvinceLoc(String province) {

// System.out.println("删除省:--" + province);

map.remove(province);

}

/**

* 推断是否存在一个省位置管理类

*

* @param province

* @return

*/

public static boolean isContainsProvince(String province) {

return map.containsKey(province);

}

/**

* 用户下线,即时删掉位置信息

* @param userId

*/

public static void deleteOneUser(String userId){

Iterator<ManageAProvinceLoc> iterator = (Iterator<ManageAProvinceLoc>) map.values().iterator();

while(iterator.hasNext()){

ManageAProvinceLoc aProvinceLoc = iterator.next();

if(aProvinceLoc.isContainsId(userId)){

aProvinceLoc.deleteLocation(userId);

if(aProvinceLoc.getCount() == 0){

deleteAProvinceLoc(aProvinceLoc.province);

}

}

}

}

}

七、得到附近的人

当用户请求得到附近的人时。会发送自己的地理位置。然后server会依据省份得到该省开启服务的全部用户。进行距离计算,返回须要的用户信息。

依据经纬度计算距离:

package com.server_utils;

/**

* 依据一对经纬度得到两点距离

* @author Administrator

*

*/

public class DistanceUtil {

public static void main(String[] args) {

double dis = getDistance(120.133356, 36.013802, 120.133525, 36.013665);

System.out.println("两点距离 = " + dis);

}

/**

*

* @param long1

*            经度1

* @param lat1

*            纬度1

* @param long2

*            经度2

* @param lat2

*            纬度2

* @return 单位公里

*/

public static double getDistance(double long1, double lat1, double long2,

double lat2) {

double a, b, R;

R = 6378137; // 地球半径(米)

lat1 = lat1 * Math.PI / 180.0;

lat2 = lat2 * Math.PI / 180.0;

a = lat1 - lat2;

b = (long1 - long2) * Math.PI / 180.0;

double d;

double sa2, sb2;

sa2 = Math.sin(a / 2.0);

sb2 = Math.sin(b / 2.0);

d = 2

* R

* Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(lat1)

* Math.cos(lat2) * sb2 * sb2));

return d/1000;

}

}

得到附近的人列表:

/**

* 得到指定距离内的陌生人相关信息

* @param isOnekm 是否是周围一公里

* @param userId

* @param range

* @return

*/

public List<StrangerBean> getDisStrangers(boolean isOnekm, String userId, int range) {

int NUM = 0;

int MAX = 100;

List<StrangerBean> list = new ArrayList<StrangerBean>();

////測试用....

//StrangerBean bean1 = new StrangerBean();

//bean1.strangerId = "9090";

//bean1.strangerName = "妖姬";

//bean1.Longitude = 120.143350;

//bean1.Latitude = 36.015562;

//bean1.strangerLoc = 1 + "公里以内";

//list.add(bean1);

//bean1 = new StrangerBean();

//bean1.strangerId = "9091";

//bean1.strangerName = "女神";

//bean1.Longitude = 120.133340;

//bean1.Latitude = 36.013557;

//bean1.strangerLoc = 1 + "公里以内";

//list.add(bean1);

myLocationBean loc1 = this.getLocation(userId);

Iterator<String> iter = locationMap.keySet().iterator();

while (iter.hasNext()) {

String strangerId = iter.next();

if (!strangerId.equals(userId)) {

myLocationBean loc2 = this.getLocation(strangerId);

double dist = DistanceUtil

.getDistance(loc1.longitude, loc1.latitude, loc2.longitude, loc2.latitude);

SqlModel model = new SqlModel();

if(isOnekm){

if(dist > 0 && dist <= 1){

StrangerBean bean = new StrangerBean();

bean.strangerId = strangerId;

bean.strangerName = model.getUserName(strangerId, false);

bean.Longitude = loc2.longitude;

bean.Latitude = loc2.latitude;

bean.strangerLoc = 1 + "公里以内";

list.add(bean);

NUM ++;

if(NUM == MAX){

break;

}

}

} else {

if(dist > range - 1 && dist <= range){

StrangerBean bean = new StrangerBean();

bean.strangerId = strangerId;

bean.strangerName = model.getUserName(strangerId, false);

bean.Longitude = loc2.longitude;

bean.Latitude = loc2.latitude;

bean.strangerLoc = range + "公里以内";

list.add(bean);

if(NUM == MAX){

break;

}

}

}

}

}

return list;

}

聊天server-解密陌生人(10)位置管理和获取周围一公里陌生人的更多相关文章

  1. 【iOS】7.4 定位服务->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager(位置管理器)

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  2. 第17周翻译:SQL Server中的事务日志管理的阶梯:第5级:在完全恢复模式下管理日志

    来源:http://www.sqlservercentral.com/articles/Stairway+Series/73785/ 作者:Tony Davis, 2012/01/27 翻译:刘琼滨. ...

  3. 第16周翻译:SQL Server中的事务日志管理,级别3:事务日志、备份和恢复

    源自: http://www.sqlservercentral.com/articles/Stairway+Series/73779/ 作者: Tony Davis, 2011/09/07 翻译:刘琼 ...

  4. SQL Server中的事务日志管理的阶梯,级别1:事务日志概述

    SQL Server中的事务日志管理的阶梯,级别1:事务日志概述 翻译:刘琼滨 谢雪妮 许雅莉 赖慧芳 级别1:事务日志概述 事务日志是一个文件,其中SQL服务器存储了所有与日志文件关联的数据库执行的 ...

  5. 使用CLRMD时通过Symbol Server找Dac的位置来初始化ClrRuntime

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:使用CLRMD时通过Symbol Server找Dac的位置来初始化ClrRuntime.

  6. Chapter 1 Securing Your Server and Network(10):使用扩展保护避免授权中继攻击

    原文:Chapter 1 Securing Your Server and Network(10):使用扩展保护避免授权中继攻击 原文出处:http://blog.csdn.net/dba_huang ...

  7. Windows Server 2008 安装 10.2.0.5 单实例

    需求:Windows Server 2008 安装 10.2.0.5 单实例 原以为非常简单的一次任务,实际却遇到了问题,故记录一下. 1.安装10.2.0.1 2.安装10.2.0.4 3.安装10 ...

  8. [转]SQL Server 2008 如何配置报表管理器

    本文转自:https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/cc281384%28v%3dsql.100%2 ...

  9. Alaya Webdav Server 0.0.10 发布

    Alaya Webdav Server 0.0.10 修复了很多 bug,Webdav 'Copy' 可以使用了. Alaya 是一个提供 WebDAV 支持的 Web 服务器,支持 HTTPS 和 ...

随机推荐

  1. MySQL监控、性能分析——工具篇

    https://blog.csdn.net/leamonjxl/article/details/6431444 MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性 ...

  2. N年的经验在别人眼里是怎么看的?

    很多人简历上都喜欢总结这么一句话:N年XXX领域的经验.N值越大,似乎越NB. 可是,我怎么看到很多人做了几十年的饭,水平变化不大,和专业厨师还是差得远. 还有写一辈子字的,开一辈子车的,这些人也和专 ...

  3. 【Javascript Demo】无刷新预览所选择的图片

    1.效果如下,可测试 2.代码如下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  4. 【C#】C#委托学习

    虽然做.NET这行也快2年了,但基础不太好啊,今天看了下委托方面的知识,记录下. 1.委托 总的来说,委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋 ...

  5. UIKeyboardTypeNumberPad 数字键盘添加完成按钮

    一:添加通知 //数字键盘添加完成 [[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(keyboardWi ...

  6. WPF使用DEV之TreeListControl---加入复选框

    1.绑定的Class中加入一个Bool类型的属性 2.   该属性无需初始赋值,你执行就可以看到如图: Bool类型数据自己主动变成了复选框 watermark/2/text/aHR0cDovL2Js ...

  7. Memcachedclient-XMemcached使用

    一. XMemcached 简单介绍 XMemcached 是一个新 java memcached client . 或许你还不知道 memcached 是什么?能够先看看这里.简单来说, Memca ...

  8. Highcharts网页版

    //后台控制器中(SpringMVC) @RequestMapping(value="/getAll",method=RequestMethod.POST) @ResponseBo ...

  9. nginx 配置web 虚拟文件夹 而且codeIgniter,thinkphp 重定向url 地址

    nginx 配置虚拟文件夹而且url 重定向 server { #侦听80port listen 8090; #定义使用www.xx.com訪问 server_name 127.0.0.1; #设定本 ...

  10. 转:【微信小程序常见问题】下拉框选择器设置picker属性。(包括:城市、日期和时间选择器)

    1.picker写法(支持日期Date.时间Time和城市自定义) wxml文件 <picker bindchange="bindPickerChange" value=&q ...