Home Manual Reference Source

src/server/events.js

const data = require('./events.json');


class FindEvents {

    initialCoord = {
        lat: null,
        lon: null
    }

    constructor(lat, long) {
        this.initialCoord.lat = lat;
        this.initialCoord.lon = long;
    }

    findClosestEvents = () => {
        data.forEach(evento => {
            const latEvento = evento.Local.latitude;
            const lonEvento = evento.Local.longitude;
            const distancia = this.calcularDistancia(this.initialCoord.lat, this.initialCoord.lon, latEvento, lonEvento);
            
            evento['Distancia em km'] = distancia;
        });
        const closest = data.sort((a, b) => a['Distancia em km'] - b['Distancia em km']);

        return closest.slice(0,5);
    }

    calcularDistancia(lat1, lon1, lat2, lon2) {
        const raioTerra = 6371; 

        const lat1Rad = this.toRadians(lat1);
        const lon1Rad = this.toRadians(lon1);
        const lat2Rad = this.toRadians(lat2);
        const lon2Rad = this.toRadians(lon2);
    

        const dLon = lon2Rad - lon1Rad;
        const dLat = lat2Rad - lat1Rad;
    
        const a = Math.sin(dLat / 2) ** 2 + Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.sin(dLon / 2) ** 2;
        const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    
        const distancia = raioTerra * c; //km
    
        return distancia;
    }
    
    toRadians(degrees) {
        return degrees * (Math.PI / 180);
    }
}

const x = new FindEvents(-21.7642, -43.3496).findClosestEvents();
x.forEach(element => {
    console.log(element.Local);
});


module.exports = FindEvents;