使用Dart调用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("------------");
}
import 'dart:js' as js;
void main() {
js.context.callMethod("filterData", []);
exit(0); // 退出
}
运行结果过滤了一部分距离过远跳跃的定位数据;
JS也可以调用Dart方法,可以将对应的Dart方法当作参数传给JS,然后JS使用闭包接收,然后可以在需要时调用闭包。