r多边形点

时间:2010-09-27 19:30:38

标签: r gis

我有一百万个点和一个大型文件--8GB - 这个太大了,无法加载到我系统上的R内存中。形状文件是单层的,因此给定的xy最多只能击中一个多边形 - 只要它不完全在边界上!每个多边形都标有severity - 例如123。我在64位ubuntu机器上使用R和12GB内存。

能够将数据框“标记”到多边形severity的最简单方法是什么,以便我得到一个带有额外列的data.frame,即x,{{1 },y

6 个答案:

答案 0 :(得分:8)

仅仅因为你所拥有的只是一把锤子,并不意味着每一个问题都是钉子。

将数据加载到PostGIS中,为多边形构建空间索引,并执行单个SQL空间叠加。将结果导出回R。

顺便说一句,说shapefile是8Gb并不是一个非常有用的信息。 Shapefile由至少三个文件组成,.shp是几何体,.dbf是数据库,.shx是连接两者的.shx。如果您的.dbf是8Gb,那么您可以通过将其替换为不同的.dbf来轻松读取形状。即使.shp是8Gb,也可能只有三个多边形,在这种情况下,可能很容易简化它们。你有多少个多边形,shapefile的.shp部分有多大?

答案 1 :(得分:5)

我认为您应该预处理数据并创建一个结构,列出网格中矩形区域的可能多边形。通过这种方式,您可以减少必须根据点检查的多边形,并且附加结构将适合内存,因为它只有指向多边形的指针。

这是一张图片来说明:

http://img191.imageshack.us/img191/5189/stackoverflowpolygonmes.png

您想要检查黄色点所在的多边形。您通常会检查所有多边形,但是使用网格优化(橙色线,没有绘制整个网格,只是其中一个字段)必须检查填充的多边形,因为它们都在网格区域内或部分位于网格区域内。

类似的方法是不将所有多边形数据存储在内存中,而只是多边形边界框,每个多边形只需要2个而不是3个X / Y对(以及指向实际多边形数据的附加指针) ,但这并没有像第一个建议那样节省空间。

答案 2 :(得分:4)

我有兴趣看到这一点,并想知道你是否在这方面取得了任何进展。既然你问的问题我想你的计算机硬件和你可以用来做这个相对简单的操作的软件已经有所改进到解决方案(如果仍然需要!)可能非常简单,尽管它可能需要很长时间才能完成处理一百万点。你可能想尝试类似的东西:

#   Load relevant libraries
library(sp)
library(maptools)
library(spatstat)

#   Read shapefile. Hopefully you have a .prj file with your .shp file
#   otherwise you need to set the proj4string argument. Don't inlcude 
#   the .shp extension in the filename. I also assume that this will
#   create a SpatialPolygonsDataFrame with the "Severity" attribute
#   attached (from your .dbf file).
myshapefile <- readShapePoly("myshapefile_without_extension",     proj4string=CRS("+proj=latlong +datum=WGS84"))


#   Read your location data in. Here I assume your data has two columns X and Y giving     locations
#   Remeber that your points need to be in the same projection as your shapefile. If they aren't
#   you should look into using spTransform() on your shapefile first.
mylocs.df <- read.table(mypoints.csv, sep=",", h=TRUE)

#   Coerce X and Y coordinates to a spatial object and set projection to be the same as
#   your shapefile (WARNING: only do this if you know your points and shapefile are in
#   the same format).
mylocs.sp <- SpatialPoints(cbind(mylocs.df$X,mylocs.df$Y),     proj4string=CRS(proj4string(myshapefile))

#   Use over() to return a dataframe equal to nrows of your mylocs.df
#   with each row corresponding to a point with the attributes from the
#   poylgon in which it fell.
severity.df <- over(mylocs.sp, myshapefile)

希望该框架可以为您提供所需的内容。是否可以使用现有的计算机/ RAM进行操作是另一回事!

答案 3 :(得分:3)

我没有一个非常好的答案,但让我抛出一个想法。你能解决问题,而不是问每个点适合哪个多边形,而不是“每个多边形中的哪个点?”也许你可以将你的shapefile破坏成例如2000个县,然后逐步取出每个县并检查每个点以查看它是否在该县。如果某个点位于给定的县中,则您对其进行标记,然后在下次将其从搜索中删除。

同样,您可以将shapefile分成4个区域。然后你可以将一个区域加上你所有的点放入内存中。然后只需迭代4次数据。

另一个想法是使用GIS工具来降低shapefile的分辨率(节点数和向量数)。当然,这取决于准确性对您的用例的重要程度。

答案 4 :(得分:2)

我试试 fastshp 。在我粗略的测试中,other methods形状文件明显优于reading。它具有专门的inside功能,非常适合您的需求。

代码应该以某种方式类似于:

shp <- read.shp(YOUR_SHP_FILE, format="polygon")) 
inside(shp, x, y)

其中x和y是坐标。

如果这不起作用,我会选择@Spacedman提到的PostGIS解决方案。

答案 5 :(得分:2)

回答我自己的问题...并感谢大家的帮助 - 采用的最终解决方案是使用python中的gdal,它相对容易适应栅格和形状文件。一些栅格跑到大约40gb,一些形状文件超过了8gb - 所以它们在我们当时的任何一台机器上都没有办法存放(现在我可以使用128gb ram的机器了) - 但我搬到了新的牧场!)。 python / gdal代码能够在1分钟到40分钟内标记2700万个点,具体取决于shapefile中多边形的大小 - 如果有很多小的多边形,它会非常快 - 如果有一些巨大的(250k点) )shapefile中的多边形非常慢!然而,为了比较,我们以前在oracle空间数据库上运行它,并且需要大约24小时+来标记2700万个点,或者光栅化和标记大约需要一个小时。正如Spacedman建议我尝试在我的机器上使用带有ssd的postgis,但周转时间比使用python / gdal要慢得多,因为最终解决方案不需要将shapefile加载到postgis中。总而言之,最快的方法是使用Python / gdal:

  • 将形状文件和x,y csv复制到ssd
  • 修改python脚本的配置文件,以说明文件的位置以及要标记的层
  • 并行运行几个层 - 因为它是cpu限制而不是i / o限制