2016-07-28 6 views
0

Я уверен, что это будет очень прямой ответ. Я новичок в R и до сих пор считаю, что это мои типы данных. В настоящее время импортируя данные из MySQL, я не могу понять, как разделить столбцы в квадратных скобках внутри типа точки WKT.Извлечь и разделить длинные координаты с данными точки WKT в R

Я запускаю следующую инструкцию, которая включает в себя запрос к шейп-файлу, содержащемуся в базе данных.

mydb = dbConnect(MySQL(), user='root', password='mrwolf',dbname='jtw_schema', host='localhost') 
strSQL = "select sa2_main11, astext(shape) as geom from centroids 
    where (gcc_name11 = 'Greater Sydney') 
     and (sa4_name11 != 'Central Coast') 
      and (sa4_name11 not like '%Outer West%') 
       and (sa4_name11 not like '%Baulkham Hills%') 
        and (sa4_name11 not like '%Outer South West%')" 


dfCord = dbGetQuery(mydb, strSQL) 

Какие результаты в:

 sa2_main11      geom 
1 116011303 POINT(150.911550090995 -33.7568493603359) 
2 116011304 POINT(150.889312296536 -33.7485997378428) 
3 116011305 POINT(150.898781823296 -33.7817496751367) 
4 116011306 POINT(150.872046414103 -33.7649465663774) 
.... 

То, что я хочу достичь, это

sa2_main11  Lat    Long     
1 116011303 150.911550090995 -33.7568493603359 
2 116011304 150.889312296536 -33.7485997378428 
3 116011305 150.898781823296 -33.7817496751367 
4 116011306 150.872046414103 -33.7649465663774 
.... 

Извинения, если это очень простой вопрос, но искал для разделения данных WKT и не мог найти примеры. Мог бы попробовать выполнить строковый поиск или подобное, но я полагаю, что, вероятно, существует «R-ish» способ сделать это.

ответ

1

Не прямой ответ, но обходной путь. (Предполагается, что столбец GeoM вектор символ? Не уверен, если это то, что вы ищете.)

df <- data.frame(sa2_main11 = c("a","b","c", "d"), 
       geom = c("POINT(150.911550090995 -33.7568493603359)", 
          "POINT(150.889312296536 -33.7485997378428)", 
          "POINT(150.898781823296 -33.7817496751367)", 
          "POINT(150.872046414103 -33.7649465663774)"), stringsAsFactors = F) 


df$Lat <- as.numeric(gsub(".*?([0-9]+[.][0-9]+).*", "\\1", df$geom)) 
df$Lon <- as.numeric(gsub(".* ([-]*[0-9]+[.][0-9]+).*", "\\1", df$geom)) 
df$geom <- NULL 
1

Это работает для набора данных, если вы получаете df как data.frame из вашей базы данных.

df <- data.frame(sa2_main11 = c(116011303, 116011304, 116011305, 116011306), 
      geom = c("POINT(150.911550090995 -33.7568493603359)", 
        "POINT(150.889312296536 -33.7485997378428)", 
        "POINT(150.898781823296 -33.7817496751367)", 
        "POINT(150.872046414103 -33.7649465663774)")) 

geom <- sub(df$geom, pattern = "POINT", replacement = "") 
geom <- sub(geom, pattern = "[(]", replacement = "") 
geom <- sub(geom, pattern = "[)]", replacement = "") 
lonlat <- unlist(strsplit(geom, split = " ")) 
df$lat <- lonlat[seq(1, length(lonlat), 2)] 
df$long <- lonlat[seq(2, length(lonlat), 2)] 
df 

# sa2_main11          geom    lat    long 
# 1 116011303 POINT(150.911550090995 -33.7568493603359) 150.911550090995 -33.7568493603359 
# 2 116011304 POINT(150.889312296536 -33.7485997378428) 150.889312296536 -33.7485997378428 
# 3 116011305 POINT(150.898781823296 -33.7817496751367) 150.898781823296 -33.7817496751367 
# 4 116011306 POINT(150.872046414103 -33.7649465663774) 150.872046414103 -33.7649465663774 
0

В конце концов мне удалось выделить lat и long, заменив запрос SQL следующим образом. В частности, команда SUBSTR. Показалось, чтобы иметь больше смысла, чем его очистки внутри R.

select sa2_main11, substr(ASTEXT(shape), 7, 12) as lon, 
     case 
     when ltrim(substr(ASTEXT(shape), 23, 12)) > 0 
      then ltrim(substr(ASTEXT(shape), 23, 10)) * -1 
       else ltrim(substr(ASTEXT(shape), 23, 12)) 
        end 
         as lat from centroids 

Это дало следующий результат:

sa2_main11, lon, lat 
'116011303', '150.91155009', '-33.7568493' 
'116011304', '150.88931229', '-33.7485997' 
'116011305', '150.89878182', '-33.7817496' 
'116011306', '150.87204641', '-33.7649465' 
'116011307', '150.93909408', '-33.7617792' 

Большое спасибо за ваши предложения, было полезно в понимании R