从shapefile(R)中读取只读数据插槽

9
我有一些非常大的shapefile文件。我可以使用rgdal函数readOGR将它们读入SpatialPolygonsDataFrame,但每个文件都需要很长时间。实际上,我只对出现在@data槽中的data.frame感兴趣。有没有办法只读取数据,跳过资源密集型的多边形?
示例代码:
## 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)

1
你有没有仔细阅读 readOGR 的源代码?它可能会明确指出针对不同数据块从原始文件中进行单独读取,或者根本没有这样的操作。 - Carl Witthoft
浏览维基百科页面——如果您能确定哪些实际文件(.shp,.atx,.sbn等)包含您想要的“@data”,那么编写自己的函数直接从该文件中读取可能更容易。 - Carl Witthoft
在询问之前,我会忘记做显而易见的事情。是的,有一个单独的调用来为@data插槽创建data.frame - attitude_stool
就我的经验而言,我相当确定你可以使用OGR本身来完成这个任务,但readOGR要求您同时获取几何图形。 - mdsumner
2个回答

8

Shapefiles是复合文件,它们将属性数据存储在一个扩展名为*.dbf的文件中。(有关参考,请参阅维基百科shapefile文章。)dbf后缀指的是dBase文件格式,可以通过foreign包中的read.dbf()函数进行读取。

因此,请尝试以下内容:

library(foreign)
df <- read.dbf("tl_2011_01_tabblock.dbf")
## And, more generally, read.dbf("path/to/shapefile/shapefile-name.dbf")

0
    FileInputStream fis = new FileInputStream( "/folder/file.dbf" ); 
DbaseFileReader dbfReader =  new DbaseFileReader(fis.getChannel(),false, Charset.forName("ISO-8859-1"));

        while ( dbfReader.hasNext() )   {
          final Object[] fields = dbfReader.readEntry();

          Long field1 = (Long) fields[0];
          Long field2 = (Long) fields[1];
          System.out.println("DBF field "+i+" value is: " + fields[0]);
          System.out.println("DBF field 2 value is: " + field2);
        }
 dbfReader.close();
 fis.close();

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