terça-feira, 9 de junho de 2009

Função SQL Server para Converter Coordenadas Latitude/Longitude DMS para DD

Eu estou fazendo um sistema de monitoramento de manejo florestal, traduzindo em miúdos (Chips em árvore) para a IWF Planet.

Eu tenho várias funções, que utilizo no Geo-Obras, para converter coordenadas Latitude/Longitude (DMS para DD, DDM para DMS e etc), mas todas elas ou estão no JavaScript, ActionScript ou no C#. Eu precisava de uma que estivesse no banco de dados SQL Server em Transact-SQL. Pensei:

- Essa vai ser fácil de encontrar no Google.

Depois de 1 hora procurando resolvi deixar a preguiça de lado e escrever um pouco de código. 

Eis aí o resultado:

 

CREATE FUNCTION dbo.ConvertDMStoDM(@DMS VARCHAR(50))

RETURNS VARCHAR(50)

AS

BEGIN

DECLARE

  @GRAU   DECIMAL(10),

  @MINUTO DECIMAL(10,3),

  @SEGUNDOS DECIMAL(20, 8)

  SET @DMS = REPLACE(REPLACE(REPLACE(REPLACE(@DMS, '''', '$'), '°', '$'), '"', '$'), ',', '.')

  DECLARE @TextoTemp VARCHAR(255)

  DECLARE @i INT

  SET @TextoTemp = LOWER(@DMS)

  IF (PATINDEX('%$%', @TextoTemp) > 0)

    BEGIN

      SET @GRAU = CONVERT(DECIMAL(10), SUBSTRING(@TextoTemp, 1, PATINDEX('%$%', @TextoTemp)-1))

      SET @TextoTemp = SUBSTRING(@TextoTemp, PATINDEX('%$%', @TextoTemp)+1, LEN(@TextoTemp))

    END

  IF (PATINDEX('%$%', @TextoTemp) > 0)

    BEGIN

      SET @MINUTO = CONVERT(DECIMAL(10,3), SUBSTRING(@TextoTemp, 1, PATINDEX('%$%', @TextoTemp)-1))

      SET @TextoTemp = SUBSTRING(@TextoTemp, PATINDEX('%$%', @TextoTemp)+1, LEN(@TextoTemp))

    END

  IF (PATINDEX('%$%', @TextoTemp) > 0)

    BEGIN

      SET @SEGUNDOS = CONVERT(DECIMAL(20, 8), SUBSTRING(@TextoTemp, 1, PATINDEX('%$%', @TextoTemp)-1))

      SET @TextoTemp = SUBSTRING(@TextoTemp, PATINDEX('%$%', @TextoTemp)+1, LEN(@TextoTemp))

    END

  RETURN(CONVERT(VARCHAR(50), ((@GRAU * 3600 + @MINUTO * 60 + @SEGUNDOS)/3600)*-1))

END

GO

/* Testando a funcão */

SELECT dbo.ConvertDMStoDM('15°34''50.5297"S')

Um comentário:

Richote disse...

Muito bom, obrigado por compartilhar!