2015-06-01 10 views
3

Обычно вы можете читать файлы geojson в R с надежным readOGR, как показано на рисунке here.Преобразование функций «многофайлов» GeoJSON в пространственные объекты R

Однако это не подходит для многоземных геойозонов.

Возпроизводимо пример:

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 

ошибка сообщение ясно, достаточно, и указывает на решение: разделить функции. Помимо этого с регулярным выражением, я не знаю, как, однако.

Любые идеи очень приветствуются.

Удивительная вещь: GitHub displays the data natively on the browser, тогда как R не может даже (казалось бы) прочитать ее!

Альтернативный способ решения:

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

ответ

6

Вы можете использовать параметр require_geomType для различных GDAL функций для извлечения функции, которые вам нужны:

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

+0

Это недавний выпуск rgdal? Я не вижу, что в 0.9-1 - просто обновлен до 0.9-3, и у меня есть это сейчас! – Spacedman

+1

Я думаю, что это было как «0.9-2». Это очень полезно, особенно для всех этих сумасшедших шейдеров GeoJSON, которые крутые дети используют в эти дни ;-) – hrbrmstr

+2

Прохладный. Резюме моих исследований по многофайловым/геологическим исследованиям с R/gdal можно найти здесь: http://rpubs.com/RobinLovelace/84577. В случае, если вы используете Ubuntu, это может обновить gdal: $ sudo add-apt-repository ppa: ubuntugis/ubuntugis-unstable && sudo apt-get update $ sudo apt-get install gdal-bin – RobinLovelace

2

Вы можете использовать ogr2ogr в командной строке, чтобы разделить эту чудовищную химеру в чувственных вещей:

ogr2ogr -where "OGR_GEOMETRY='LINESTRING'" \ 
    -f "GeoJSON" lines.geojson test.geojson 

и аналогично для точек и полигонов.

Существовал некоторую болтовня несколько лет назад о реализации OGR_SQL в readOGR, в какой момент вы могли бы сделать это с R, но Роджер не хотел сделать это, и никто не хотел помочь :(

После того как вы создали разрезные GeoJSON файлы, которые вы можете прочитать их в один rgeos::SpatialCollections объект:

points=readOGR("points.geojson","OGRGeoJSON") 
polys=readOGR("polygons.geojson","OGRGeoJSON") 
lines=readOGR("lines.geojson","OGRGeoJSON") 
require(rgeos) 
g = SpatialCollections(points=points, lines=lines, polygons=polys) 
plot(g) 

Если вы хотите попробовать что-то с geojsonio, то вы можете использовать Filter для выбора списка элементов заданной геометрии из Коллекция геометрии

polygon_features = Filter(
    function(f){f$geometry$type=="Polygon"}, 
    test$features) 

но вам все равно придется строить что-то вы можете попасть в отдельные объекты R ....