Слот данных только для чтения из шейп-файла (R)?

У меня есть несколько очень больших шейп-файлов. Я могу прочитать их в SpatialPolygonsDataFrame с помощью функции rgdal readOGR, но это занимает очень много времени для каждого файла. На самом деле меня интересует только data.frame, который появляется в слоте @data. Есть ли способ прочитать только данные, минуя ресурсоемкие полигоны?

Пример кода:

## State of Alabama census blocks (152 MB compressed, 266 MB uncompressed)
shpurl <- "http://www2.census.gov/geo/tiger/TIGER2011/TABBLOCK/tl_2011_01_tabblock.zip"
tmp    <- tempfile(fileext=".zip")
download.file(shpurl, destfile=tmp)
unzip(tmp, exdir=getwd())

## Read shapefile
nm  <- strsplit(basename(shpurl), "\\.")[[1]][1]
lyr <- readOGR(dsn=getwd(), layer=nm)

## Data I want
head(lyr@data)

person attitude_stool    schedule 14.11.2012    source источник
comment
Вы читали исходный код readOGR? Это вполне может указывать либо на отдельные чтения из исходного файла для разных фрагментов данных, либо на то, что такого нет.   -  person Carl Witthoft    schedule 14.11.2012
comment
Взгляните на страницу Википедии — если вы можете определить, какие из реальных файлов (.shp, .atx, .sbn и т. д.) содержат нужный вам @data, может быть проще создать собственную функцию для чтения непосредственно из этот файл.   -  person Carl Witthoft    schedule 14.11.2012
comment
Я бы забыл сделать очевидную вещь, прежде чем спрашивать. Да, есть отдельный вызов для создания data.frame для слота @data.   -  person attitude_stool    schedule 14.11.2012
comment
Между прочим, я почти уверен, что вы могли бы сделать это с самим OGR, но readOGR требует, чтобы вы также получили геометрию.   -  person mdsumner    schedule 21.11.2012


Ответы (1)


Шейп-файлы — это составные файлы, данные атрибутов которых хранятся в файле с расширением *.dbf. (См. статью о шейп-файлах Википедии для справки.) Суффикс dbf указывает на формат файла dBase, который может быть прочитан функцией read.dbf() в пакете foreign.

Итак, попробуйте следующее:

library(foreign)
df <- read.dbf("tl_2011_01_tabblock.dbf")
## And, more generally, read.dbf("path/to/shapefile/shapefile-name.dbf")
person Josh O'Brien    schedule 14.11.2012
comment
Рад, что это сработало. Я знал, что так и должно быть, но не хотел загружать этот огромный файл, чтобы проверить это самому. - person Josh O'Brien; 14.11.2012