在R中打开shapefile?[关闭]


64

我需要从R中的ArcMap中打开一个shapefile,以将其用于进一步的地统计分析。我已经将其转换为ASCII文本文件,但是在R中,它被识别为data.frame。x和y被识别为非数字后,坐标功能将不起作用。

您能帮忙解决吗?


1
什么样的shapefile?我假设点,因为它具有X和Y列?
Simbamangu 2012年

Answers:


54

直接使用shapefile。您可以使用rgdalsf包轻松完成此操作,然后读取对象中的形状。对于这两个软件包,您都需要提供dsn-数据源,在shapefile的情况下是目录,以及layer-在shapefile的名称后减去扩展名:

# Read SHAPEFILE.shp from the current working directory (".")

require(rgdal)
shape <- readOGR(dsn = ".", layer = "SHAPEFILE")

require(sf)
shape <- read_sf(dsn = ".", layer = "SHAPEFILE")

(对于rgdal,在OSX或Linux中,您不能将主目录的'〜'速记用作数据源(dsn)目录-否则,您将收到无用的“无法打开数据源”消息。该sf软件包不会有此限制,还有其他一些优点。)

这将为您提供一个Spatial * DataFrame(点,线或面)的对象-然后可以使用与普通数据框相同的方式(即shape$IDID列)来访问属性表的字段。

如果要使用导入的ASCII文件,则只需将文本(字符)x和y字段转换为数字,例如:

shape$x <- as.numeric(as.character(shape$x))
shape$y <- as.numeric(as.character(shape$y))
coordinates(shape) <- ~x + y

编辑2015-01-18:请注意,rgdal比maptools(我最初在这里建议)要好一些,主要是因为它自动读写投影信息。

笔记:

  • 嵌套as.numeric(as.character())函数-如果将您的ASCII文本(可能)读取为一个因子,则可确保您获得数值而不是因子级别。
  • rgdal并且sf具有访问不同文件和数据库类型的令人困惑的方式(例如,对于GPX文件,dsn是文件名,并且对各个组件(如航点,航迹点等)进行分层),并且需要仔细阅读在线示例。

R应该解析数字字段,因此,我可以想象x和y中存在特殊的字符类型。另外,在导入时,除非另外指定,否则字符字段将被强制转换为一个因素。因此,简单的“数字”减速将不起作用。我还将在“ rgdal”中使用“ readORG”而不是maptools。
杰弗里·埃文斯

@ Jeffrey,readOGR绝对是更好的方法-在gis.SE上查看有关稍后R问题的一些讨论。关于要素强制的要点;将使用嵌套更新as.character来解决问题。
Simbamangu

您可以使用〜,但必须在目录上调用path.expand,例如readOGR(dsn = path.expand(“〜/ Downloads / cb_2016_us_zcta510_500k /”),layer =“ cb_2016_us_zcta510_500k”)
hd1

3
我仍然需要以某种方式澄清这个实际上正确的答案: dsn="directory where the shapefile, projection file, etc are located" layer="name of the file without .shp extention"
Ufos

我想指出,该dsn参数不应包含斜杠-例如dsn = "C:/Users/Downloads/"应为dsn = "C:/Users/Downloads"。希望这能解决某人的挫败感
Kim

21

我同意Simbamangu的观点,并在保留shapefile方面感到困惑,但希望将您的注意力特别导向rgdal库。遵循gissolved为NCEAS建议的链接,并按照rgdal的说明进行操作。将其安装在某些机器上可能具有挑战性,但在投影方面可以大大改善结果。

maptools库非常出色,可让您为正在读取的shapefile定义投影,但是要做到这一点,您需要知道如何以proj4格式指定该投影。一个例子可能看起来像:

project2<-"+proj=eqdc +lat_0=0 +lon_0=0 +lat_1=33 +lat_2=45 +x_0=0 +y_0=0 +ellps=GRS80    
   +datum=NAD83 +units=m +no_defs" #USA Contiguous Equidistant Conic Projection
data.shape<-readShapePoly("./MyMap.shp",IDvar="FIPS",proj4string=CRS(project2))
plot(data.shape)

如果您想走这条路,那么我建议使用http://spatialreference.org作为找出proj4格式的投影效果的地方。如果您觉得麻烦,rgdal可以通过读取ESRI shapefile的.prj文件(该文件包含shapefile的ESRI投影定义的文件)来简化操作。要在同一文件上使用rgdal,您只需编写以下代码:

library(rgdal)
data.shape<-readOGR(dsn="C:/Directory_Containing_Shapefile",layer="MyMap")
plot(data.shape)

如果您只使用单个shapefile,则可能无需执行此操作即可滑行,但是一旦开始查看多个数据源或将其与Google Maps叠加,则保持投影形状良好就变得至关重要。

有关R中空间数据的一些有用的演练,包括有关导入和使用点模式的大量内容,请访问https://csde.washington.edu/workshop/point-patterns-and-raster在线获取一些旧课程资料-surfaces /(可以在此处找到更多的讲习班),可以帮助您了解这些方法在实际中的比较方式。


+1表示空间参考信息...尤其是强调突出显示的排序!
Simbamangu 2012年

@csfowler,我尝试使用readOGR,但未导入.prj文件。知道为什么吗?我也在生物系的UW任教。
6:49的Herman Toothrot

@ user4050,很难看到您的代码。我假设在同一目录中有一个.prj文件?并且您使用encoding =“ ESRI Shapefile”值来确保rgdal知道它是一个shapefile?
csfowler 2013年


17

您可以使用sf库直接在中打开ShapefileR。它比rgdal库更快,请在此处查看:R基准的简单功能。有关sf软件包的更多信息,请检查项目主页r-spatial

# Load library
library('sf')

# Load shapefile
shapename <- read_sf('~/path/to/file.shp')

11

库中的shapefile()函数是2017年的一个简单解决方案raster

#Load library
library(raster)

#Load shapefile
shp <- shapefile("myshapefile")

更新:这在2019年仍然是一个不错的选择。


可以用于从在线来源导入吗?我
我德尔托罗

@IDelToro不直接。您需要先将其下载到硬盘驱动器,然后再从那里加载。
Christopher

6

另一种选择是使用fastshp库,该库提供:

处理大型ESRI shapefile(.shp)的例程。这包括读取,细化点以及将点与包含的形状进行匹配。此程序包的主要目的是提供支持大型shapefile(数百万个点)的速度。它比其他一些shapefile包快几个数量级的maginute。

这是我在SE上关于如何与ggplot2结合使用的问题:

如何在ggplot2中绘制通过fastshp加载的shapefile?


1
我发现read.shp函数不会导致sp对象有点令人讨厌。鉴于空间R社区正在逐渐将其作为处理空间对象的事实上的标准,因此我发现这有点草率。如果有足够的RAM和64位操作系统,那么读取大数据就不是什么大问题。有了8GB RAM,我已经使用rgdal读取了3000万个点和2.5M个多边形,没有任何问题。这是在ggplot2中使用sp对象的一些指导:github.com/hadley/ggplot2/wiki/plotting-polygon-shapefiles
Jeffrey Evans
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.