Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/node_modules
4 changes: 4 additions & 0 deletions Coordinates.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export interface CoordinatesAttributes {
latitude: number;
longitude: number;
}
38 changes: 38 additions & 0 deletions Haversine-formula.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { CoordinatesAttributes } from "./Coordinates";

export class GeoLocationDistance {
private EARTH_RADIUS_KM = 6371;
getDistance(
coordinateA: CoordinatesAttributes,
coordinateB: CoordinatesAttributes
) {
//Fórmula de haversine
const { latitude: point1A, longitude: point2A } = coordinateA;
const { latitude: point1B, longitude: point2B } = coordinateB;

const lat1Rad = point1A * (Math.PI / 180);
const lon1Rad = point2A * (Math.PI / 180);
const lat2Rad = point1B * (Math.PI / 180);
const lon2Rad = point2B * (Math.PI / 180);

const dLat = lat2Rad - lat1Rad;
const dLon = lon2Rad - lon1Rad;

const a =
Math.sin(dLat / 2) ** 2 +
Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.sin(dLon / 2) ** 2;
const c = 2 * Math.asin(Math.sqrt(a));
const distance = this.EARTH_RADIUS_KM * c;

return distance;
}

formatDistance(distanceInKM: number) {
const distanceInMeters = distanceInKM * 1000;
if (distanceInKM < 1) {
return `${distanceInMeters.toFixed(0)} m`;
} else {
return `${distanceInKM.toFixed(2)} km`;
}
}
}
46 changes: 46 additions & 0 deletions Haversine.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { CoordinatesAttributes } from "./Coordinates";
import { GeoLocationDistance } from "./Haversine-formula";

describe("GET LOCATION DISTANCE", () => {
let geodistance: GeoLocationDistance;

// diferença de 950 m
// -22.40083454639946, -47.56297832084271
// -22.392504686710215, -47.565024241120355

// 21.64 Km
// -22.545298697864474, -47.42180754266027
// -22.400830790167916, -47.562983198639216

const coordinateA1: CoordinatesAttributes = {
latitude: -22.40083454639946,
longitude: -47.56297832084271,
};

const coordinateA2: CoordinatesAttributes = {
latitude: -22.392504686710215,
longitude: -47.565024241120355,
};

const coordinateB1: CoordinatesAttributes = {
latitude: -22.545298697864474,
longitude: -47.42180754266027,
};
const coordinateB2: CoordinatesAttributes = {
latitude: -22.400830790167916,
longitude: -47.5629831986392165,
};

beforeAll(() => {
geodistance = new GeoLocationDistance();
});
it("Should return a distace once given 2 coordenates", async () => {
const result = geodistance.getDistance(coordinateA1, coordinateA2);
expect(result).toBeCloseTo(0.95);
});

it("Should return a distace once given 2 coordenates", async () => {
const result = geodistance.getDistance(coordinateB1, coordinateB2);
expect(result).toBeCloseTo(21.64);
});
});
9 changes: 2 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,2 @@
# utils-ts
O intuito desse repositorio é ser um estoque de utilizadas para typescript.

Como funciona, varias funçoes e utilidades adicionados em typescript, aqui serao guardadas para usos posteriores.
Cada serviço ficara em uma branch separada para poder ser facilmente importadada para outros projetos.


# Haversine
A fórmula Haversine é uma equação matemática que nos ajuda a calcular a distância entre dois pontos na Terra, usando suas coordenadas de latitude e longitude. Como a Terra é redonda, essa fórmula leva em conta a curvatura do planeta para determinar a distância mais precisa possível.
4 changes: 4 additions & 0 deletions jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/** @type {import('ts-jest').JestConfigWithTsJest} */
module.exports = {
preset: 'ts-jest',
};
Loading