资源简介
三角形加权质心定位算法常用于目前流行的室内定位,经过测试可以使用,并已应用到我的实际项目中
代码片段和文件信息
package com.indoor.navigation.api.core.algorithm;
import com.indoor.navigation.api.core.Dealer;
import com.indoor.navigation.api.entity.Coordinate;
import com.indoor.navigation.api.entity.IndoorDevice;
import com.indoor.navigation.api.entity.IndoorLocation;
import com.indoor.navigation.api.entity.Round;
import com.logg.Logg;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 三角形加权质心定位算法
*/
public class LocationAlgorithm implements Dealer {
// 所有组合的总权值
private double totalWeight;
// 定位结果
private IndoorLocation location;
// 用来求组合数的数组
private Integer[] a;
@Override
public IndoorLocation getLocation(Map indoorDeviceMap) {
location = new IndoorLocation();
// 对扫描到的最新设备进行分组
// Map indoorDeviceMap = deviceGroup(indoorDevices);
//
// // 如果接收的定位设备小于3个则不能定位
// if (indoorDeviceMap.size() < 3) {
// return null;
// }
// 处理根据设备地址分组后的数据
List devices = processRSSISignals(indoorDeviceMap);
// 如果定位设备大于3个,对其进行排序后取 RSSI 最大的前3个用来定位
int deviceCount = devices.size();
if (deviceCount > 3) {
Collections.sort(devices);// 排序
devices = new ArrayList<>(devices.subList(deviceCount - 3 deviceCount));
for (IndoorDevice item : devices) {
Logg.e(item.getBeaconDevice().getDeviceName() + “ “ + item.getRssi());
}
}
// CombineAlgorithm ca = null;
// try {
// ca = new CombineAlgorithm(a 3);
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// object[][] c = ca.getResult();
//
// double[] tempLocation = new double[2];
//
// for (int i = 0; i < c.length; i++) {
//
// // 创建一个列表,用来对每个组合进行计算
// List tribases = new ArrayList<>();
//
// for (int j = 0; j < 3; j++) {
// IndoorDevice bb = devices.get((int) c[i][j]);
// tribases.add(bb);
// }
// 三个基站为一组通过距离加权后求出的坐标
double[] weightLocation = calculateCoordinate(devices);
Logg.e(weightLocation);
if (weightLocation == null) {
return null;
}
// tempLocation[0] += weightLocation[0];
// tempLocation[1] += weightLocation[1];
// }
location.setX(weightLocation[0]);
location.setY(weightLocation[1]);
// location.setX(weightLocation[0] / totalWeight);
// location.setY(weightLocation[1] / totalWeight);
// 设置定位结果的时间戳
location.setTimeStamp(System.currentTimeMillis());
return location;
}
/**
* 求出通过该组基站距离加权后的坐标
*
* @param bases 接收到的一组基站对象列表(此处列表中的基站应当是id各异的)
* @return 返回通过该组基站距离加权后的坐标
*/
public double[] calculateCoordinate(List bases) {
- 上一篇:ba
se64所需jar包 - 下一篇:FTPSUploadUtils 上传工具
评论
共有 条评论