rgeojsongdalrgdalropensci

Convert features of a 'multifeature' GeoJSON into R spatial objects


Normally you can read geojson files into R with trusty readOGR, as illustrated here.

However, this fails for multifeature geojsons.

Reproducible example:

downloader::download("https://github.com/Robinlovelace/Creating-maps-in-R/raw/master/data/test-multifeature.geojson", "test.geojson")
test <- rgdal::readOGR("test.geojson", "OGRGeoJSON") # fails with:

Error in ogrInfo(dsn = dsn, layer = layer, encoding = encoding, use_iconv = use_iconv,  : 
  Multiple incompatible geometries: wkbPoint: 98; wkbLineString: 660; wkbPolygon: 23

The error message is clear-enough and indicates a solution: split the features. Aside from doing this with regex, I don't know how, however.

Any ideas very much welcome.

The amazing thing: GitHub displays the data natively on the browser, whereas R cannot even (seemingly) read it in!

Alternative way to a solution:

test <- geojsonio::geojson_read("test.geojson")

Solution

  • You can use the require_geomType parameter for various GDAL functions to extract the features that you need:

    library(rgdal)
    
    ogrListLayers("test.geojson")
    ## [1] "OGRGeoJSON"
    ## attr(,"driver")
    ## [1] "GeoJSON"
    ## attr(,"nlayers")
    ## [1] 1
    
    # This fails but you can at least see the geoms it whines about
    ogrInfo("test.geojson", "OGRGeoJSON")
    ## Error in ogrInfo("test.geojson", "OGRGeoJSON") : 
    ##   Multiple incompatible geometries: wkbPoint: 98; wkbLineString: 660; wkbPolygon: 23
    
    
    ogrInfo("test.geojson", "OGRGeoJSON", require_geomType="wkbPoint")
    ## NOTE: keeping only 98 wkbPoint of 781 features
    ##     note that extent applies to all features
    ## Source: "test.geojson", layer: "OGRGeoJSON"
    ## Driver: GeoJSON number of rows 781 
    ##   selected geometry type: wkbPoint with 98 rows
    ## Feature type: wkbPoint with 2 dimensions
    ## Extent: (12.48326 41.88355) - (12.5033 41.89629)
    ## CRS: +proj=longlat +datum=WGS84 +no_defs  
    ## Number of fields: 78 
    ##                        name type length typeName
    ## 1                      area    4      0   String
    ## 2                   bicycle    4      0   String
    ## ...
    ## LONG LIST - 78 total
    
    
    ogrInfo("test.geojson", "OGRGeoJSON", require_geomType="wkbLineString")
    ## NOTE: keeping only 660 wkbLineString of 781 features
    ##     note that extent applies to all features
    ## Source: "test.geojson", layer: "OGRGeoJSON"
    ## Driver: GeoJSON number of rows 781 
    ##   selected geometry type: wkbLineString with 660 rows
    ## Feature type: wkbLineString with 2 dimensions
    ## Extent: (12.48326 41.88355) - (12.5033 41.89629)
    ## CRS: +proj=longlat +datum=WGS84 +no_defs  
    ## Number of fields: 78 
    ##                        name type length typeName
    ## 1                      area    4      0   String
    ## 2                   bicycle    4      0   String
    ## ...
    ## LONG LIST - 78 total (same as above)
    
    
    ogrInfo("test.geojson", "OGRGeoJSON", require_geomType="wkbPolygon")
    ## NOTE: keeping only 23 wkbPolygon of 781 features
    ##     note that extent applies to all features
    ## Source: "test.geojson", layer: "OGRGeoJSON"
    ## Driver: GeoJSON number of rows 781 
    ##   selected geometry type: wkbPolygon with 23 rows
    ## Feature type: wkbPolygon with 2 dimensions
    ## Extent: (12.48326 41.88355) - (12.5033 41.89629)
    ## CRS: +proj=longlat +datum=WGS84 +no_defs  
    ## Number of fields: 78 
    ##                        name type length typeName
    ## 1                      area    4      0   String
    ## 2                   bicycle    4      0   String
    ## ...
    ## LONG LIST - 78 total (same as above)
    
    
    points <- readOGR("test.geojson", "OGRGeoJSON", require_geomType="wkbPoint")
    ## OGR data source with driver: GeoJSON 
    ## Source: "test.geojson", layer: "OGRGeoJSON"
    ## with 781 features;
    ## Selected wkbPoint feature type, with 98 rows
    ## It has 78 fields
    ## NOTE: keeping only 98 wkbPoint of 781 features
    
    lines <- readOGR("test.geojson", "OGRGeoJSON", require_geomType="wkbLineString")
    ## OGR data source with driver: GeoJSON 
    ## Source: "test.geojson", layer: "OGRGeoJSON"
    ## with 781 features;
    ## Selected wkbLineString feature type, with 660 rows
    ## It has 78 fields
    ## NOTE: keeping only 660 wkbLineString of 781 features
    
    polygons <- readOGR("test.geojson", "OGRGeoJSON", require_geomType="wkbPolygon")
    ## OGR data source with driver: GeoJSON 
    ## Source: "test.geojson", layer: "OGRGeoJSON"
    ## with 781 features;
    ## Selected wkbPolygon feature type, with 23 rows
    ## It has 78 fields
    ## NOTE: keeping only 23 wkbPolygon of 781 features
    
    # prove they red in things
    plot(lines, col="#7f7f7f")
    plot(polygons, add=TRUE)
    plot(points, add=TRUE, col="red")
    

    enter image description here