From f19d75e22c9bc4d4e0d6250591e277ec8d914d18 Mon Sep 17 00:00:00 2001 From: Feliperm17 Date: Sat, 26 Sep 2026 08:17:10 -0300 Subject: [PATCH] fix: corrige arredondamento de coordenadas (segundos >= 60) --- src/application/create-app.ts | 2 +- src/application/index.ts | 5 ++-- src/helpers/coordenadas.js | 45 +++++++++++++++++++++-------------- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/application/create-app.ts b/src/application/create-app.ts index a3b3901c..17badbcb 100644 --- a/src/application/create-app.ts +++ b/src/application/create-app.ts @@ -18,7 +18,7 @@ import { routes as createPaisRoutes } from './pais' import { routes as createVegetacaoRoutes } from './vegetacao' interface CorsParameters { - origins: string[] + origins: string | string[] methods: string[] allowedHeaders: string[] } diff --git a/src/application/index.ts b/src/application/index.ts index 9053c948..59c82f39 100644 --- a/src/application/index.ts +++ b/src/application/index.ts @@ -9,7 +9,8 @@ import { createApp } from './create-app' const environment = process.env.NODE_ENV ?? 'development' -const corsOrigins = process.env.CORS_ORIGINS ?? '*' +const corsOriginsRaw = process.env.CORS_ORIGINS ?? '*' +const corsOrigins = corsOriginsRaw === '*' ? '*' : corsOriginsRaw.split(',') const corsMethods = process.env.CORS_METHODS ?? 'HEAD,GET,POST,PUT,PATCH,DELETE' const corsAllowedHeaders = process.env.CORS_ALLOWED_HEADERS ?? 'Content-Type,Authorization' @@ -17,7 +18,7 @@ const logger = new ConsoleLogger() const application = createApp({ logger, cors: { - origins: corsOrigins.split(','), + origins: corsOrigins, methods: corsMethods.split(','), allowedHeaders: corsAllowedHeaders.split(',') }, diff --git a/src/helpers/coordenadas.js b/src/helpers/coordenadas.js index 971ee801..bb98c0c1 100644 --- a/src/helpers/coordenadas.js +++ b/src/helpers/coordenadas.js @@ -171,34 +171,43 @@ export const converteDecimalParaGMSSinal = (decimal, isLat) => { }; export const converteDecimalParaGrausMinutosSegundos = (gDec, ehLat, formatada) => { - let graus; - let minutos; - let aux; - let segundos; - let direcao; + const sinal = gDec < 0 ? -1 : 1; + const abs = Math.abs(gDec); - graus = parseInt(gDec); - aux = (graus - gDec) * 60; - minutos = parseInt(aux); - aux = (aux - minutos) * 60; - segundos = aux; + let graus = Math.floor(abs); + const minutosDecimal = (abs - graus) * 60; + let minutos = Math.floor(minutosDecimal); + const segundosRaw = (minutosDecimal - minutos) * 60; + // Arredonda para 2 casas decimais e propaga carry se segundos >= 60 + // (evita exibicao de "60.00" causada por erro de ponto flutuante) + let segundos = Math.round(segundosRaw * 100) / 100; + if (segundos >= 60) { + segundos = 0; + minutos += 1; + } + if (minutos >= 60) { + minutos = 0; + graus += 1; + } + + let direcao; if (ehLat) { - direcao = graus < 0 ? 'S' : 'N'; + direcao = sinal < 0 ? 'S' : 'N'; } else { - direcao = graus < 0 ? 'W' : 'E'; + direcao = sinal < 0 ? 'W' : 'E'; } + const segundosStr = segundos.toFixed(2).replace('.', ','); + if (formatada) { - return `${Math.abs(graus)}°${Math.abs(minutos)}'${Math.abs(segundos).toFixed(2) - .replace('.', ',')}" ${direcao}`; + return `${graus}\u00B0${minutos}'${segundosStr}" ${direcao}`; } return { - graus: Math.abs(graus), - minutos: Math.abs(minutos), - segundos: Math.abs(segundos).toFixed(2) - .replace('.', ','), + graus, + minutos, + segundos: segundosStr, direcao, }; };