【问题标题】:Converting Geometry to Longitude/Latitude coordinates in R在R中将几何转换为经度/纬度坐标
【发布时间】:2017-12-06 05:06:18
【问题描述】:

https://data.sfgov.org/Transportation/Bike-Share-Stations/gtyg-jpkj

我正在使用这个数据集,我想知道是否可以将几何(表中的 Geom)转换为两列:R 中的经度和纬度。

谢谢!

【问题讨论】:

  • 请在您的问题中包含所有相关信息。考虑粘贴几行源代码并展示您迄今为止尝试过的内容。另外,你的问题的答案是肯定的。删除度数,转换为数字,等等。

标签: r geometry


【解决方案1】:

RSocrata::read.socratatidyr::extract 简洁明了:

library(tidyverse)

df <- RSocrata::read.socrata('https://data.sfgov.org/Transportation/Bike-Share-Stations/gtyg-jpkj')

df <- df %>% extract(Geom, c('lat', 'lon'), '\\((.*), (.*)\\)', convert = TRUE) 

# print nicely
df %>% select(UID, Site.ID, lat, lon) %>% as_data_frame()
#> # A tibble: 107 x 4
#>      UID    Site.ID      lat       lon
#>  * <int>      <chr>    <dbl>     <dbl>
#>  1     1  SF-T24 S1 37.75182 -122.4266
#>  2     2  SF-G33 S1 37.79350 -122.3928
#>  3     3   SOMA-06A 37.78974 -122.3947
#>  4     4  SF-T22 S5 37.75128 -122.4318
#>  5     5  SF-R25 S4 37.75671 -122.4210
#>  6     6    NOMA-2E 37.79861 -122.4008
#>  7     7  SF-L33 S4 37.77590 -122.3932
#>  8     8  SF-O24 S4 37.76623 -122.4269
#>  9     9 Market-03B 37.78099 -122.4117
#> 10    10  SF-O28 S2 37.76723 -122.4108
#> # ... with 97 more rows

【讨论】:

    【解决方案2】:

    是的。最简单的方法可能是使用tidyr 包。这是单线:

    library(tidyr)
    df <- fread("~/Downloads/Bike_Share_Stations.csv") # Read data
    
    extract(df, Geom, into = c('Lat', 'Lon'), '\\((.*),(.*)\\)', conv = T)
    

    最后一个参数是使用组匹配的正则表达式。这是一个简单的模式:它以文字 ( 开头。最里面的两个括号(.*) 是逗号分隔的两个坐标。仅提取这些。该模式以相应的文字 ) 结尾。

    这是结果数据的子集:

         UID    Site ID             Last Edited Date           Lat             Lon
      1:   1  SF-T24 S1 05/23/2016 12:00:00 AM +0000 37.7518243814  -122.426627114
      2:   2  SF-G33 S1 05/23/2016 12:00:00 AM +0000 37.7935049482  -122.392846514
      3:   3   SOMA-06A 05/23/2016 12:00:00 AM +0000 37.7897420277  -122.394678441
      4:   4  SF-T22 S5 05/23/2016 12:00:00 AM +0000 37.7512809413  -122.431836215
      5:   5  SF-R25 S4 05/23/2016 12:00:00 AM +0000 37.7567132725  -122.421038213
     ---                                                                          
    103: 103     Embr-E 05/23/2016 12:00:00 AM +0000 37.8047749378  -122.403247294
    104: 104  SF-N26 S1 05/23/2016 12:00:00 AM +0000 37.7682271629  -122.420291015
    105: 105 Market-11B 05/23/2016 12:00:00 AM +0000 37.7922638478  -122.397066071
    106: 106  SF-O27 S2 05/23/2016 12:00:00 AM +0000 37.7671609432  -122.415485214
    107: 107  SF-T23 S5 05/23/2016 12:00:00 AM +0000 37.7514609421  -122.429135213
    

    【讨论】:

      【解决方案3】:

      我认为Geom 列已经包含纬度/经度。

      library(tidyverse)
      
      df <- df %>% 
        mutate(Geom = gsub('[()°]', '', Geom)) %>% 
        separate(col = Geom, into = c('Latitude', 'Longitude '), sep = '\\,')
      

      首先,我们用gsub('[()°]', '', geom) 删除括号和度数符号,并替换Geom 列。然后我们将separateGeom 列转换为新的LatitudeLongitude 列,并使用逗号分隔符sep = '\\,'

      【讨论】:

        猜你喜欢
        • 2021-07-18
        • 2015-07-13
        • 2020-02-23
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 2017-07-02
        • 2013-09-21
        • 1970-01-01
        相关资源
        最近更新 更多