将GeoJSON转换为R中的简单要素

8
我希望您能够将一个空间数据集从Socrata存储库读入R中,然后将其转换为简单要素对象
该数据集由表示多边形的资本改进项目组成: enter image description here 上述应用程序中使用的数据可通过Socrata Open Data API (SODA)访问:
library(tibble)
library(dplyr) 
library(purrr)
library(sf) 
library(RSocrata)

obj <- read.socrata("https://data.seattle.gov/resource/pdbw-sw7q.json") %>% as_tibble()

空间数据似乎在 the_geom.coordinates 列中:

# Inspect the object
glimpse(obj)
#> Observations: 113
#> Variables: 13
#> $ creationdate         <chr> "2017-06-02T13:51:50.854Z", "2017-06-02T1...
#> $ creator              <chr> "Transportation_SeattleCityGIS", "Transpo...
#> $ editdate             <chr> "2017-06-02T13:51:50.854Z", "2017-06-02T1...
#> $ editor               <chr> "Transportation_SeattleCityGIS", "Transpo...
#> $ globalid             <chr> "4a78a16a-9ea4-4a81-8011-ad974c80b357", "...
#> $ objectid             <chr> "967", "646", "968", "11862", "11521", "1...
#> $ project_id           <chr> "TC36717008", "TC367240", "TC36659003", "...
#> $ projectname          <chr> "Safe Routes to School - S Fisher Place S...
#> $ shape_area           <chr> "4.53868971176276E-8", "0.000002901627518...
#> $ shape_length         <chr> "0.000918371270091608", "0.02024322483978...
#> $ status               <chr> "ACTIVE", "ACTIVE", "ACTIVE", "ACTIVE", "...
#> $ the_geom.type        <chr> "Polygon", "Polygon", "Polygon", "Polygon...
#> $ the_geom.coordinates <list> [<-122.26983, -122.26984, -122.27015, -1... <-- here

仔细观察最后一列可以发现,每个多边形都被存储为一个数组(对于多重多边形,则是数组列表):
# Inspect the spatial data
obj %>% select(the_geom.type, the_geom.coordinates) %>% 
        mutate(class = map_chr(the_geom.coordinates, class))
#> # A tibble: 113 x 3
#>    the_geom.type the_geom.coordinates class
#>            <chr>               <list> <chr>
#>  1       Polygon    <dbl [1 x 5 x 2]> array
#>  2       Polygon   <dbl [1 x 16 x 2]> array
#>  3       Polygon    <dbl [1 x 5 x 2]> array
#>  4       Polygon   <dbl [1 x 35 x 2]> array
#>  5       Polygon   <dbl [1 x 24 x 2]> array
#>  6       Polygon   <dbl [1 x 15 x 2]> array
#>  7       Polygon           <list [2]>  list
#>  8          <NA>               <NULL>  NULL
#>  9       Polygon           <list [2]>  list
#> 10       Polygon   <dbl [1 x 10 x 2]> array
#> # ... with 103 more rows

obj %>% slice(1) %>% pull
#> [[1]]
#> , , 1
#> 
#>           [,1]      [,2]      [,3]      [,4]      [,5]
#> [1,] -122.2698 -122.2698 -122.2702 -122.2702 -122.2698
#> 
#> , , 2
#> 
#>          [,1]    [,2]     [,3]     [,4]     [,5]
#> [1,] 47.52145 47.5213 47.52131 47.52145 47.52145

我一直无法使用sf包提供的工具将这些数组转换为多边形:

# Try to convert one row from the `the_geom.coordinates` column 
# into a POYLGON or MULTIPOLYGON

obj[1, "the_geom.coordinates"] %>% st_polygon
#> Error in vapply(x, ncol, 0L): values must be length 1,
#>  but FUN(X[[1]]) result is length 0

obj[1, "the_geom.coordinates"] %>% st_multipolygon
#> Error in MtrxSetSet(x, dim, type = "MULTIPOLYGON", needClosed = TRUE):
#>  polygons not (all) closed

非常感谢您的询问,关于如何将obj转换为sf对象的任何建议都将不胜感激。

2
看起来这更像是一个R问题,而不是Socrata问题。我不是R专家,但如果问题变得更多关于SODA APIs,请告诉我! - chrismetcalf
1个回答

15

您没有获得geoJSON。那个URL似乎会下载一个带有以某种方式编码的几何形状的JSON。

使用最新的sf软件包,您可以执行以下操作:

> d = read_sf("https://data.seattle.gov/resource/pdbw-sw7q.geojson")
>

但是,如果您需要添加RSocrata API密钥等,或者您需要批处理大量数据(即一次获取1000个),那么您将不得不手动进行。 RSocrata将尝试使用多个请求获取批处理数据。

RSocrata的github网站上有一个关于geoJSON功能的开放请求:https://github.com/Chicago/RSocrata/issues/43,但似乎没有得到很好的反响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接