我需要从R中的ArcMap中打开一个shapefile,以将其用于进一步的地统计分析。我已经将其转换为ASCII文本文件,但是在R中,它被识别为data.frame。 x和y被识别为非数字后,坐标功能将不起作用。
您能帮忙解决吗?
#1 楼
直接使用shapefile。您可以使用rgdal
或sf
封装轻松地做到这一点,并读取对象中的形状。对于这两个软件包,您都需要提供dsn
-数据源(对于shapefile是目录),以及layer
-shapefile名称(减去扩展名):br />(对于rgdal,在OSX或Linux中,您不能将主目录的'〜'速记用作数据源(
dsn
)目录-否则,您将收到无用的“无法打开数据源”消息。 sf
软件包没有此限制,还有其他一些优点。)这将为您提供一个Spatial * DataFrame(点,线或面)的对象-属性表的字段为然后以与普通数据帧相同的方式为您提供访问权限,即ID列为
shape$ID
。 如果要使用导入的ASCII文件,则只需将文本(字符)x和y字段转换为数字,例如:
# Read SHAPEFILE.shp from the current working directory (".")
require(rgdal)
shape <- readOGR(dsn = ".", layer = "SHAPEFILE")
require(sf)
shape <- read_sf(dsn = ".", layer = "SHAPEFILE")
编辑2015-01-18:请注意,rgdal比maptools(我最初在这里建议)要好一些,主要是因为它自动读取和写入投影信息。
注意:
嵌套的
as.numeric(as.character())
函数-如果您的ASCII文本被当作一个因子读取(很可能),这可确保您得到的是数字值而不是因素级别。 ),并且需要仔细阅读在线示例。 评论
R应该解析数字字段,因此,我可以想象x和y中存在特殊的字符类型。另外,在导入时,除非另外指定,否则字符字段将被强制转换为一个因素。因此,简单的“数字”减速将不起作用。我还将在“ rgdal”中使用“ readORG”而不是maptools。
–杰弗里·埃文斯(Jeffrey Evans)
15年1月16日在18:37
@ Jeffrey,readOGR绝对是更好的方法-请在gis.SE上查看有关稍后R问题的一些讨论。关于要素强制的要点;将使用嵌套的as.character更新以解决该问题。
–Simbamangu
15年1月18日在9:04
您可以使用〜,但必须在目录上调用path.expand,例如readOGR(dsn = path.expand(“〜/ Downloads / cb_2016_us_zcta510_500k /”),layer =“ cb_2016_us_zcta510_500k”)
–hd1
17年11月20日在0:51
不知何故我仍然需要澄清这个实际上正确的答案:dsn =“ shapefile,投影文件等所在的目录” layer =“没有.shp扩展的文件名”
– Ufos
18年4月19日在8:44
我想指出dsn参数不应包含斜杠-例如dsn =“ C:/用户/下载/”应为dsn =“ C:/用户/下载”。希望这能解决某人的沮丧...
–金
19年4月24日在22:26
#2 楼
我同意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年1月23日14:34
@csfowler,我尝试使用readOGR,但未导入.prj文件。知道为什么吗?我也在UW的生物学系工作。
–Herman牙刷
13-10-13在6:49
@ user4050,很难看到您的代码。我假设在同一目录中有一个.prj文件?并且您使用encoding =“ ESRI Shapefile”值来确保rgdal知道它是一个shapefile?
–csfowler
13-10-31在15:48
#3 楼
您可以使用sf
库直接在R
中打开Shapefile。它比rgdal
库快,请在此处查看:R的简单功能-基准。有关sf
软件包的更多信息,请检查项目主页r-spatial。 # Load library
library('sf')
# Load shapefile
shapename <- read_sf('~/path/to/file.shp')
#4 楼
我认为您不应该将shapefile转换为ASCII,而是直接将shapefile与空间扩展之一一起使用。在这里,您可以找到三种读取(和写入)shapefile的方法:http://www.nceas.ucsb.edu/scicomp/usecases/ReadWriteESRIShapeFiles。 R空间项目可能也会使您感兴趣http://cran.r-project.org/web/packages/sp/index.html。#5 楼
2017年一个简单的解决方案是shapefile()
库中的raster
函数。实际上,正如帮助文件所说,它是“围绕readOGR和writeOGR(rgdal程序包)的简单包装函数”。 。评论
可以用于从在线来源导入吗?一世
–我是德尔·托罗
19年2月26日在16:27
@IDelToro不直接。您需要先将其下载到硬盘驱动器,然后再从那里加载。
–克里斯托弗(Christopher)
19-2-27在17:08
#6 楼
另一种替代方法是使用fastshp库,该库提供:用于处理大型ESRI shapefile(.shp)的例程。这包括读取,点变细以及点与包含形状的匹配。此程序包的主要目的是提供支持大型shapefile(数百万个点)的速度。它是maginute的几个订单,比其他一些shapefile包要快几个订单。
这是我关于SE与ggplot2一起使用的问题: >如何在ggplot2中绘制通过fastshp加载的shapefile?
评论
我发现read.shp函数不会导致sp对象有点令人讨厌。鉴于空间R社区正在逐渐将其作为处理空间对象的事实上的标准,因此我发现这有点草率。如果有足够的RAM和64位操作系统,那么读取大数据就不是什么大问题。有了8GB RAM,使用rgdal可以毫无问题地读取3000万个点和2.5M个多边形。这是在ggplot2中使用sp对象的一些指导:github.com/hadley/ggplot2/wiki/plotting-polygon-shapefiles
–杰弗里·埃文斯(Jeffrey Evans)
2012年11月2日19:47
评论
什么样的shapefile?我假设点是因为它具有X和Y列?