1

これは非常に簡単な答えになると確信しています。私はRが初めてで、まだデータ型の周りを見つけています。現在、MySQL からデータをインポートしていますが、WKT ポイント タイプ内で括弧で囲まれた列を分離する方法がよくわかりません。

データベースに含まれるシェープファイルへのクエリを含む次のステートメントを実行しています。

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っぽい」方法があると思います。

4

3 に答える 3

2

直接的な答えではなく、回避策です。( 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$longitude <- as.numeric(gsub(".*?([-]*[0-9]+[.][0-9]+).*", "\\1", df$geom))
df$latitude <- as.numeric(gsub(".* ([-]*[0-9]+[.][0-9]+).*", "\\1", df$geom))
df$geom <- NULL
于 2016-07-28T13:11:17.153 に答える
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
于 2016-07-28T13:24:30.310 に答える
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を理解するのに役立ちました

于 2016-07-29T13:45:00.513 に答える