2016-07-28 24 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有益

相关问题