• 大小: 16KB
    文件类型: .java
    金币: 1
    下载: 0 次
    发布日期: 2021-06-10
  • 语言: Java
  • 标签: 定位算法  

资源简介

三角形加权质心定位算法常用于目前流行的室内定位,经过测试可以使用,并已应用到我的实际项目中

资源截图

代码片段和文件信息

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) {

评论

共有 条评论

相关资源