Convertir Coordenadas DMS a Decimal

|

No se si a ustedes les ha pasado, pero he necesitado convertir coordenadas en grados, minutos y segundos a decimales, o lo que llaman UTM, especialmente esto suele estar almacenado en una base de datos, y claro convertirlo puede ser un problema y mas cuando son bases de datos de producción, la solución? Una función que haga esta conversion y esta incluirla en una vista, y bien aqui esta la función para SQL Server 2005 en adelante, si necesitan podría pasarla a Oracle tambien…

CREATE FUNCTION ConvertirDMS
(
    -- Add the parameters for the function here
    @strData varchar(500)
)
RETURNS decimal(10,8)
AS
BEGIN
    DECLARE @decResult decimal(10,8)
    declare @posD int
    declare @posDQ int
    declare @posM int
    declare @posS int
    declare @piece varchar(500)
    declare @decD decimal(10,8)
    declare @decM decimal(10,8)
    declare @decS decimal(10,8)
    declare @strSign varchar(2)
   
    --Ubica el signo de grados
    set @posD =  patindex('%°%' , @strData)
    --Ubica el signo de grados cuando esta mal puesto
    set @posDQ =  patindex('%?%' , @strData)   
    --Ubica el sigo de minutos
    set @posM =  patindex('%"%' , @strData)
    --Ubica el sigo de minutos
    set @posS =  patindex('%''%' , @strData)
   
    -- Saca los segundos y los convierte a decimal
    set @decS = CONVERT(decimal(10,8), substring(@strData, @posM + 1, @posS - @posM - 1))
    -- Saca los minutos y los convierte a decimal
    if(@posDQ = '0')   
        set @decM = CONVERT(decimal(10,8), substring(@strData, @posD + 1, @posM - @posD - 1))
    else
        set @decM = CONVERT(decimal(10,8), substring(@strData, @posDQ + 1, @posM - @posDQ - 1))
    -- Saca los minutos y los convierte a decimal
    if(@posDQ = '0')   
        set @decD = CONVERT(decimal(10,8), substring(@strData, 0, @posD))
    else
        set @decD = CONVERT(decimal(10,8), substring(@strData, 0, @posDQ))
    --Saca la orientacion para el signo
    set @strSign = SUBSTRING(@strData, @posS + 1, len(@strData) - @posS)   
    --Calcula los segundos a minutos
    set @decM = @decM + (@decS / 60.00)
    --Calcula los minutos a grados
    set @decResult = @decD + (@decM / 60.00)
    --Pone el signo
    if (upper(@strSign) <> 'N' and UPPER(@strSign) <> 'E')
        set @decResult = @decResult * -1
   

    RETURN @decResult;
END