提示: 由于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. DevExpress学习01——下载与安装

    记得刚接触编程时,虽然实现了功能,但用户界面十分丑陋,老师叫我们美化一下界面,不要千篇一律,当时觉得能够写出来功能就洋洋得意了,不觉得界面丑陋.后来,在程序比赛中,我接触了一种第三方控件,它可以快速实 ...

  2. 关于SQL 行转列的办法

    公司实施小姑娘要我写一个SQL给她 需求如下: 现在有表A,字段 id code parentid backres,现数据如下 id code parentid backres 1 A 5 2 B 5 ...

  3. php之快速入门学习-6(字符串变量)

    PHP 字符串变量 字符串变量用于存储并处理文本. PHP 中的字符串变量 字符串变量用于包含有字符的值. 在创建字符串之后,我们就可以对它进行操作了.您可以直接在函数中使用字符串,或者把它存储在变量 ...

  4. 全局安装 vue

    通过npm命令安装vuejs在用 Vue.js 构建大型应用时推荐使用 NPM 安装,NPM 能很好地和诸如 Webpack 或Browserify 的 CommonJS 模块打包器配合使用.(以下操 ...

  5. eclipse A Java Runtime Environment(JRE)

      eclipse A Java Runtime Environment(JRE) CreateTime--2018年5月13日18点17分 Author:Marydon 1.问题描述 2.问题解析 ...

  6. 以__name__进行单元测试

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #以__name__进行单元测试 #何为单元测试? #单元测试(模块测试)是开发者编写的一小段代码,用于检测被 ...

  7. Python 实现的、带GUI界面的词云生成器

    代码地址如下:http://www.demodashi.com/demo/14233.html 详细说明: "词云"就是数据可视化的一种形式,给出一段文本,根据文本中词语的出现频率 ...

  8. npm换国内淘宝镜像

    来源于:http://yijiebuyi.com/blog/b12eac891cdc5f0dff127ae18dc386d4.html 为什么要换源? npm 官方站点 http://www.npmj ...

  9. Java中entity(实体类)的写法规范

    在日常的Java项目开发中,entity(实体类)是必不可少的,它们一般都有很多的属性,并有相应的setter和getter方法.entity(实体类)的作用一般是和数据表做映射.所以快速写出规范的e ...

  10. 深入PHP内核之参数

    1.看一下一个扩展中的简单代码 ZEND_BEGIN_ARG_INFO(params_add_arginfo, 0) ZEND_ARG_INFO(0, a) ZEND_ARG_INFO(0, b) Z ...