2016-07-28 90 views
0

我相信這將是一個非常直接的答案。我是R新手,仍然發現我的數據類型。目前從MySQL導入數據,但我不能完全弄清楚如何分隔WKT點類型內的列。從RK中的WKT點數據中提取和分割緯度長座標

我正在運行以下語句,其中涉及查詢包含在數據庫中的shapefile。

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

最後,我設法使用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有益

相關問題