I have an array of location objects with GPS locations tied to the objects. I am wanting to filter through the array based on the users current location and compare the distance between the user location and location objects.
I have a current function that accomplishes this, but I know this is not efficient. I would prefer to filter the array than to create a temp variable and assign the temp variable to the array every time.
//sample data
public getLocation = [
{
"ID": "1",
"Name": "Test Location 1",
"Lat": "32.16347467",
"Lon": "-103.67178545"
}, {
"ID": "2",
"Name": "Test Location 2",
"Lat": "32.16347451",
"Lon": "-103.67178544"
}, {
"ID": "3",
"Name": "Test Location 3",
"Lat": "32.13559815",
"Lon": "-103.67544362"
}, {
"ID": "4",
"Name": "Test Location 4",
"Lat": "32.40144407",
"Lon": "-103.13168477"
}, {
"ID": "5",
"Name": "Test Location ",
"Lat": "32.14557039",
"Lon": "-103.67011361",
}
]
grabLocation(){
this.platform.ready().then(() => {
this.geolocation.getCurrentPosition().then((resp) => {
this.userLocation = [parseFloat(resp.coords.latitude.toFixed(4)),parseFloat(resp.coords.longitude.toFixed(4))];
this.userLocation = [resp.coords.latitude,resp.coords.longitude];
var getLocation
getLocation = this.asyncLocations.grabUserLoc(this.userLocation[0],this.userLocation[1]);
console.log(getLocation);
}).catch((error) => {
this.presentToast(error);
});
});
}
//asyncLocations.ts
grabUserLoc(lat,lon){
var tempLocation= [];
for(let i=0;i<this.getLocation.length;i++){
if((this.getLocation[i]['Lat']!="") && this.getLocation[i]['Lon']!=""){
let R = 6371;// km
let RinM = (R*0.621371);
let Lat1 = (parseFloat(lat.toFixed(5)));
let Lon1 = (parseFloat(lon.toFixed(5)));
let Lat2 = (parseFloat(this.getLocation[i]['Lat']));
let Lon2 = (parseFloat(this.getLocation[i]['Lon']));
let dLat = this.toRad(Lat2-Lat1);
let dLon = this.toRad(Lon2-Lon1);
let RLat1 = this.toRad(Lat1);
let RLat2 = this.toRad(Lat2);
let a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(RLat1) * Math.cos(RLat2);
let c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
//let d = R * c;
let e = RinM * c;
if(e < 5){
tempLocation.push(this.getLocation[i]);
}
}
}
this.getLocation = tempLocation;
return this.getLocation;
}
// Converts numeric degrees to radians
toRad(Value)
{
return Value * Math.PI / 180;
}
I currently have the locations checking for a distance of 5 miles.
Any help would be appreciated.