Dart调用JS对10000条定位数据滤波

使用Dart调用JS,还是为了练习跨语言调用;

一、编写对应的JS代码

平时在开发时不推荐将算法放在JS里,我这里是简单的做一下数据过滤;
首先生成一些随机定位数据,在实际开发中可以使用真实数据;

// 随机定位点
function getRandomCoordinate() {
    return {
        latitude: getRandomFloat(110, 115),
        longitude: getRandomFloat(110, 115)
    };
}

// 随机数
function getRandomFloat(min, max) {
    return min+Math.random()*(max-min);
}

将数据添加到对应容器中;

// 滤波
function filterData() {
    console.log("开始滤波-----");
    var data = [];
    // 添加10000条随机定位点
    for (let index = 0; index < 10000; index++) {
        let coordinate = getRandomCoordinate();
        data.push(coordinate);
    }
    console.log(data);

    averageFilter(data);
}

滤波时需要计算弧面距离;

// 计算定位之间的距离
function distance(lat1, lon1, lat2, lon2) {
    const R = 6371; // 地球半径,我使用的是平均值,单位公里
    const dLat = deg2rad(lat2-lat1); // 角度转弧度
    const dLon = deg2rad(lon2-lon1); // 同上
    const dL1 = deg2rad(lat1);
    const dL2 = deg2rad(lat2);
    // 开始求弧面距离了
    const a = Math.sin(dLat/2)*Math.sin(dLon/2)+Math.cos(dL1)*Math.cos(dL2)*Math.sin(dLon/2)*Math.sin(dLon/2);
    if (a < 0) {
        return 0;
    }
    const c = 2*Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    const d = R*c; // 最终距离获得
    return d; // 公里值
}

// 弧度转换
function deg2rad(degrees) {
    return degrees*(Math.PI/180);
}

开始滤波;

// 平均值滤波
function averageFilter(data) {
    var totalDistance = 0; // 总距离
    for (let index = 0; index < data.length-1; index++) {
        const l1 = data[index];
        const l2 = data[index+1];
        
        totalDistance += distance(l1.latitude, l1.longitude, l2.latitude, l2.longitude);
    }
    const averageDistance = totalDistance/(data.length-1);

    // 开始过滤
    var filters = [];
    const value = averageDistance*1.5; // 使用1.5倍平均值作为阀值,可调整
    for (let index = 0; index < data.length-1; index++) {
        const l1 = data[index];
        const l2 = data[index+1];
        
        const d = distance(l1.latitude, l1.longitude, l2.latitude, l2.longitude);
        if (d <= value) {
            filters.push(l2);
        }
    }
    console.log("平均值滤波结果");
    console.log(filters);
    console.log("------------");
}
Dart中调用JS代码;
import 'dart:js' as js;

void main() {
  js.context.callMethod("filterData", []);
  exit(0); // 退出
}

运行结果过滤了一部分距离过远跳跃的定位数据;
Dart调用JS对10000条定位数据滤波_第1张图片
JS也可以调用Dart方法,可以将对应的Dart方法当作参数传给JS,然后JS使用闭包接收,然后可以在需要时调用闭包。

你可能感兴趣的:(javascript,开发语言,flutter,dart,前端)