2015-01-09 2 views
1

У меня есть несколько строк Degrees Minutes Секунды, которые мне нужно преобразовать с запросом.MySQL convert Degree, Minutes, Seconds to Degree decimal

36 ° 19'11.46" N = 36,31985

95 ° 36'02.22" W = 95,600617

Каждая строка будет по-другому. Я застрял на этом два дня. Возможно ли это?

ответ

0

должен работать:

SELECT D + M/60 + S/3600; 

Например, в MySQL:

SELECT 36 + 19/60 + 11.46/3600; 

возвращается: 36,319850

+0

Как бы это сделать, чтобы вытащить конкретный D M S, поскольку каждая строка изменяется? – Joker327

+0

Не видя вашей структуры таблицы, ее трудно ответить. Но, вероятно, это будет примерно так: SELECT degrees + minutes/60 + seconds/3600 FROM tablename; – mti2935

+0

Что вам нужно, чтобы сделать это проще? Каждый DMS находится в строке в столбце таблицы. Есть около 1000 рядов. Каждая строка имеет свой собственный, как 36 ° 19'24.52 "N, тогда следующая строка будет выглядеть как 36 ° 24'12.06" N – Joker327

1

Nice lifehack: обратное решение задачи (степень к DMS), используя SEC_TO_TIME построенного -на функции MySQL:

CREATE FUNCTION `geocoords`(lon double, lat double) RETURNS varchar(24) CHARSET cp1251 
    NO SQL 
    DETERMINISTIC 
begin  
    declare alon double; 
    declare alat double; 
    declare slon varchar(12); 
    declare slat varchar(12); 
    set alon = abs(lon); 
    set alat = abs(lat); 
    set slon = TIME_FORMAT(SEC_TO_TIME(alon*3600), '%H°%i''%s"'); 
    set slat = TIME_FORMAT(SEC_TO_TIME(alat*3600), '%H°%i''%s"'); 
    if lon>0 then 
    set slon = concat(slon, 'E'); 
    elseif lon<0 then 
    set slon = concat(slon, 'W'); 
    end if; 
    if lat>0 then 
    set slat = concat(slat, 'N'); 
    elseif lat<0 then 
    set slat = concat(slat, 'S'); 
    end if; 
    return concat(slat, ' ', slon); 
end 

ВЫБОР geocoords (30.550157546997, 50.344024658203)

50 ° 20'38 "N 30 ° 33'01" E

0

я в конечном итоге это строит, и она работала безупречно, что мне нужно. Вы заметите, что я добавил C к номерам, это значит их флаг, поэтому, если он уже был преобразован, он не будет продолжать конвертировать.

UPDATE 
    MasterTable 
SET 
    MasterTable.Latitude_A = MasterTable.Latitude, 
    MasterTable.Longitude_A = MasterTable.Longitude 
WHERE 
    ProjectID = 'ProjectAlpha' 
    and Sequence = '0' 
    and MasterTable.Latitude NOT LIKE '%C%' 
    and MasterTable.Longitude NOT LIKE '%C%'; 

TRUNCATE TABLE gpsconvert; 
    INSERT into gpsconvert(gpsconvert.`Account Number`,gpsconvert.Latitude,gpsconvert.Longitude) 
SELECT 
     MasterTable.AccountNumber, 
     MasterTable.Latitude, 
     MasterTable.Longitude 
FROM 
    MasterTable 
WHERE 
    MasterTable.ProjectID = 'ProjectAlpha' 
    and MasterTable.Sequence = '0' 
    and MasterTable.Latitude NOT LIKE '%c%' 
    and MasterTable.Longitude NOT LIKE '%c%' 
    and MasterTable.Latitude <> '' 
    and MasterTable.Longitude <> ''; 

UPDATE 
    gpsconvert 
SET 
    gpsconvert.LatDegree = LEFT(gpsconvert.Latitude,2), 
    gpsconvert.LatMinutes = SUBSTRING(gpsconvert.Latitude,-7,2), 
    gpsconvert.LatSeconds = SUBSTRING(gpsconvert.latitude,-5,5), 
    gpsconvert.LatDecimal = gpsconvert.LatDegree + (gpsconvert.LatMinutes/60) + (gpsconvert.LatSeconds/3600), 
    gpsconvert.LongDegree = LEFT(gpsconvert.Longitude,2), 
    gpsconvert.LongMinutes = SUBSTRING(gpsconvert.Longitude,-7,2), 
    gpsconvert.LongSeconds = SUBSTRING(gpsconvert.Longitude,-5,5), 
    gpsconvert.LongDecimal = gpsconvert.LongDegree +  (gpsconvert.LongMinutes/60) + (gpsconvert.LongSeconds/3600); 

UPDATE 
    MasterTable 
INNER JOIN 
    gpsconvert on gpsconvert.`Account Number` = MasterTable.AccountNumber 
SET 
    MasterTable.Latitude = CONCAT(gpsconvert.LatDecimal,'c'), 
    MasterTable.Longitude = CONCAT(gpsconvert.LongDecimal,'c') 
WHERE 
    MasterTable.ProjectID = 'ProjectAlpha' 
    and MasterTable.Sequence = '0' 
    and MasterTable.AccountNumber = gpsconvert.`Account Number`