聊天server-解密陌生人(10)位置管理和获取周围一公里陌生人
提示: 由于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)位置管理和获取周围一公里陌生人的更多相关文章
- 【iOS】7.4 定位服务->2.1.2 定位 - 官方框架CoreLocation: CLLocationManager(位置管理器)
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 第17周翻译:SQL Server中的事务日志管理的阶梯:第5级:在完全恢复模式下管理日志
来源:http://www.sqlservercentral.com/articles/Stairway+Series/73785/ 作者:Tony Davis, 2012/01/27 翻译:刘琼滨. ...
- 第16周翻译:SQL Server中的事务日志管理,级别3:事务日志、备份和恢复
源自: http://www.sqlservercentral.com/articles/Stairway+Series/73779/ 作者: Tony Davis, 2011/09/07 翻译:刘琼 ...
- SQL Server中的事务日志管理的阶梯,级别1:事务日志概述
SQL Server中的事务日志管理的阶梯,级别1:事务日志概述 翻译:刘琼滨 谢雪妮 许雅莉 赖慧芳 级别1:事务日志概述 事务日志是一个文件,其中SQL服务器存储了所有与日志文件关联的数据库执行的 ...
- 使用CLRMD时通过Symbol Server找Dac的位置来初始化ClrRuntime
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:使用CLRMD时通过Symbol Server找Dac的位置来初始化ClrRuntime.
- Chapter 1 Securing Your Server and Network(10):使用扩展保护避免授权中继攻击
原文:Chapter 1 Securing Your Server and Network(10):使用扩展保护避免授权中继攻击 原文出处:http://blog.csdn.net/dba_huang ...
- 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 ...
- [转]SQL Server 2008 如何配置报表管理器
本文转自:https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/cc281384%28v%3dsql.100%2 ...
- Alaya Webdav Server 0.0.10 发布
Alaya Webdav Server 0.0.10 修复了很多 bug,Webdav 'Copy' 可以使用了. Alaya 是一个提供 WebDAV 支持的 Web 服务器,支持 HTTPS 和 ...
随机推荐
- [AngularJS] Angular 1.3 ngMessages with ngAnimate
Note: Can use $dirty to check whether user has intracted with the form: https://docs.angularjs.org/a ...
- /etc/rc.d/init.d/functions文件详细分析
/etc/rc.d/init.d/functions文件详细分析 functions这个脚本是给/etc/init.d里边的文件使用的(可理解为全局文件). 提供了一些基础的功能,看看里边究竟有些什么 ...
- UE如何使用正则表达式
1 基本概念 元字符: 元字符 说明 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符() \d 匹配数字 \b 匹配单词的开始或结束 \W 匹配任意不是字母 ...
- curl库的使用,32-64
http 使用curl发起https请求 http://www.cnblogs.com/ainiaa/archive/2011/11/08/2241385.html Curl配置及编译: CFLAGS ...
- php之快速入门学习-15(php函数)
PHP 函数 PHP 的真正威力源自于它的函数. 在 PHP 中,提供了超过 1000 个内建的函数. PHP 内建函数 如需查看所有数组函数的完整参考手册和实例,请访问我们的 PHP 参考手册. P ...
- 局域网连接打印机(Win10)
局域网支持交换机和WIFI环境下进行连接(要求连上打印机的电脑已开启) 1.首先打开控制面板 2.硬件和声音 3.高级打印机设置 4.找到要连接的打印机,通过浏览(R) 添加局域网某台机器上的打印机, ...
- kafka delete topic
Don't think it is supported yet. Take a look at this JIRA tracking Delete Topic. For delete manually ...
- XML 文档结构必须从头至尾包含在同一个实体内
XML 文档结构必须从头至尾包含在同一个实体内 CreateTime--2018年4月2日16:40:58 Author:Marydon 问题还原: <![CDATA[ <?xml v ...
- servlet 服务器HTTP请求头说明
Accept:用于告诉服务器,客户机支持的数据类型. Accept-Charset:用于告诉服务器,客户机采用的编码. Accept-Language:客户机的语言环境. Host:客户机通过该头告诉 ...
- 转:基于 linux 平台的 libpcap 源代码分析
libpcap 是 unix/linux 平台下的网络数据包捕获函数包,大多数网络监控软件都以它为基础.Libpcap 可以在绝大多数类 unix 平台下工作,本文分析了 libpcap 在 linu ...