R 将不同类型的纬度转换为十进制形式

R 将不同类型的纬度转换为十进制形式,r,range,decimal,coordinates,R,Range,Decimal,Coordinates,我在数据库中有很多不同类型的坐标: x$lat = c("41°39'","41°; 42°; 43°", "41°39'-43°39'", '42°', "36.458", "42°-44°","36.452 - 37.254", "42°39', 43°39'") 我需要将它们全部转换为十进制度数(其中一些已经转换为十进制度数) 但是,我也有一个坐标范围(例如41°39'-43°39'),在这种情况下,我需要首先找到一个平均值,然后将该平均值转换为十进制形式。类似地,我有一个坐标列表(“4

我在数据库中有很多不同类型的坐标:

x$lat = c("41°39'","41°; 42°; 43°", "41°39'-43°39'", '42°', "36.458", "42°-44°","36.452 - 37.254", "42°39', 43°39'")
我需要将它们全部转换为十进制度数(其中一些已经转换为十进制度数) 但是,我也有一个坐标范围(例如41°39'-43°39'),在这种情况下,我需要首先找到一个平均值,然后将该平均值转换为十进制形式。类似地,我有一个坐标列表(“41°;42°;43°”或42°39',43°39')-我还需要首先找到一个平均值,然后将其放入十进制形式

我知道两种选择:对于41°39':

x$latdec = gsub('°', ' ', x$lat)
对于42°类型:

x$latdec = gsub('°', x$lat)
对于36.458,就让它保持原样吧

问题在于范围(“41°39'-43°39'),我知道我可以通过以下方式将范围分为两部分:

out <- strsplit(as.character(x$lat),'-') 
do.call(rbind, out)
out
对不起,我的代码看起来很难看,但这是我想到的

#将LAT或LON转换为十进制
等级=c(1:7)
西=摄氏度(“41°39'”、“41°;42°”、“41°39'-43°39'、“42°”、“36.458”、“42°-44°”、“36.452-37.254”)
id=规格
dff=数据帧(cbind(id,west))
df
对不起,我的代码看起来很难看,但这是我想到的

#将LAT或LON转换为十进制
等级=c(1:7)
西=摄氏度(“41°39'”、“41°;42°”、“41°39'-43°39'、“42°”、“36.458”、“42°-44°”、“36.452-37.254”)
id=规格
dff=数据帧(cbind(id,west))

df可能是一个可能的副本,为什么在转换为十进制之前需要找到平均值?我需要在地图上绘制点(然后也将点分解为光栅单元,并用颜色填充)。我不知道如何在光栅地图上绘制一系列坐标(特别是如果我的纬度是41°39'-43°39',经度是43°39',如果你的纬度和经度都是lat和lon,你可以画一条线或一个方框…但这比转换为十进制要复杂一些,因为你必须手动处理每种情况,可能是重复的,可能是重复的,为什么你需要在转换之前找到平均值我需要在地图上绘制点(也被分解成光栅单元,并用颜色填充)。我不知道如何在光栅地图上绘制坐标范围(特别是如果我的纬度是41°39'-43°39',经度是43°39',如果你的范围是lat和lon,你可以画一条线或一个方框……但这比转换为十进制要复杂一些,因为你必须手动处理每种情况
#CONVER LAT or LON TO DECIMAL

    spec= c(1:7)
    west = c("41°39'","41°; 42°, 43°", "41°39'-43°39'", '42°', "36.458", "42°-44°","36.452 - 37.254")
    id= spec
    dff= data.frame(cbind(id, west))
    df <- dff[!(is.na(dff$west))  ,]

#subset everything that has degree sign in it

    p1 <- '°'
    p2 <- '-'
    p3 <- "'"
    p4 <- '"'
    p5 = ","


# work with coordinates that have ranges
# all that have ranges in it 

    df11 <- subset(df, grepl(p2, df$west) )

 # omit everything with comma (list of ranges)

    df11a = subset(df11, grepl(p5, df11$west)) 

#everything with comma

    df1= df11[!(df11$id %in% df11a$id),] 
    out <- strsplit(as.character(df1$west),'-')

 
# break range into two columns

    out2= data.frame(do.call(rbind, out)) 
    df1$west_lower_limit=out2$X1
    df1$west_upper_limit=out2$X2

#UPPER LIMIT
#if we have seconds

    df0_1 = subset (df1, grepl(p4, df1$west_upper_limit)) 

# were we have range- degrees and -deg+min

    df1_1 <- subset(df1, grepl(p1, df1$west_upper_limit) ) 

# where only range - decimals

    df1_2 <- df1[!(df1$id %in% df1_1$id),] 

# subset df1_1 for only degrees and deg+min
# range- degrees+ min

    df1_1a <- subset(df1_1, grepl(p3, df1_1$west_upper_limit) ) 

# convert range- deg+min into dec

    df1_1a$west_upper_limit = gsub('°', ' ', as.factor(df1_1a$west_upper_limit))
    df1_1a$west_upper_limit = gsub("'", ' ', as.factor(df1_1a$west_upper_limit))
    df1_1a$long_upper_limit = conv_unit(df1_1a$west_upper_limit, from = 'deg_dec_min', to = 'dec_deg')

# range- degrees

    df1_1b <-df1_1[!(df1_1$id %in% df1_1a$id),] 

#convert range- deg

    df1_1b$west_upper_limit = gsub('°', ' ', df1_1b$west_upper_limit)
    df1_1b$long_upper_limit = df1_1b$west_upper_limit

#convert range- decimals

    df1_2$long_upper_limit =df1_2$west_upper_limit
     
# LOWER LIMIT
# were we have range- degrees and -deg+min

    df1_1l <- subset(df1, grepl(p1, df1$west_lower_limit) ) 

# where only range - decimals
# subset df1_1 for only degrees and deg+min

    df1_2l <- df1[!(df1$id %in% df1_1$id),]

 
# range- degrees+ min

    df1_1al <- subset(df1_1l, grepl(p3, df1_1l$west_lower_limit) )

 
# range- degrees
# convert range- deg+min into dec

    df1_1bl <-df1_1[!(df1_1l$id %in% df1_1a$id),] 
    df1_1al$west_lower_limit = gsub('°', ' ', df1_1al$west_lower_limit)
    df1_1al$west_lower_limit = gsub("'", ' ', df1_1al$west_lower_limit)
    df1_1al$long_lower_limit = conv_unit(df1_1al$west_lower_limit, from = 'deg_dec_min', to = 'dec_deg')

#convert range- deg

    df1_1bl$west_lower_limit = gsub('°', ' ', df1_1bl$west_lower_limit)
    df1_1bl$long_lower_limit = df1_1bl$west_lower_limit

#convert range- decimals

    df1_2l$long_lower_limit = df1_2l$west_lower_limit

# combine all with ranges

    df1_1_dec1= rbind(df1_1a,df1_1b,df1_2) 
    df1_1_dec2= rbind(df1_1al,df1_1bl,df1_2l) 
    df1dec1 <- merge(df1_1_dec1,df1_1_dec2,by=c("id"))
    df1dec= df1dec1[,c("id","long_lower_limit","long_upper_limit")]


----------
# NO RANGES IN COORDINATES

# all that dont have range in it
 

     df2=  df[!(df$id %in% df11$id),]  

# were we have no range-  degrees and -deg+min and deg-min-sec
 

     df2_1 <- subset(df2, grepl(p1, df2$west) )

 
# were we have   no range -deg+min
  

    df2_1a <- subset(df2_1, grepl(p3, df2_1$west) )

#were we have   no range -deg+min+sec
  

    df2_1aa<- subset(df2_1a, grepl(p4, df2_1a$west) )
      df2_1aa$west = gsub('°', ' ', df2_1aa$west)
      df2_1aa$west = gsub("'", ' ', df2_1aa$west)
      df2_1aa$west = gsub('"', ' ', df2_1aa$west)
      df2_1aa$lat = conv_unit(df2_1aa$west, from = 'deg_min_sec', to = 'dec_deg')

#where no sec
  

    df2_1ab = df2_1a[!(df2_1a$id %in% df2_1aa$id),]  
      df2_1ab$west = gsub('°', ' ', df2_1ab$west)
      df2_1ab$west = gsub("'", ' ', df2_1ab$west)
      df2_1ab$lat = conv_unit(df2_1ab$west, from = 'deg_dec_min', to = 'dec_deg')

  
 #no range- deg 
  

    df2_1b <- df2_1[!(df2_1$id %in% df2_1a$id),] 
      df2_1b$west = gsub('°', ' ', df2_1b$west)
      df2_1b$lat = conv_unit(df2_1b$west, from = 'dec_deg', to = 'dec_deg')

#where no degrees present  
  

    df2_2=  df2[!(df2$id %in% df2_1$id),] 
      df2_2$lat= df2_2$west

#bind non ranges data
  

    df2_dec1= rbind(df2_1aa,df2_1ab,df2_1b, df2_2) 
      df2_decN =data.frame( "id"= df2_dec1$id, "dec_lat"=df2_dec1$lat)