2016-02-27 105 views
0

我遇到了一个小问题,我的for循环运行了3.5小时+。我在SQL Server有一个地理数据集,名为Shape的字段,它存储数据类型为geometry的坐标。首先,我通过ODBC [R连接到我的数据库和检索我想要的信息(Shape列也转换为可读)SpatialPointsDataFrame太慢运行FOR循环

library(sp) 
library(rgeos) 
library(RODBC) 
ch<-odbcConnect("SpatialAnalysis", rows_at_time=1) 
df<-sqlQuery(ch, "select OBJECTID, LOT_NO, Shape.STAsText() as WKT FROM SRC_PLI_QLD") 
cnt<-sqlQuery(ch, "select count(OBJECTID) from SRC_PLI_QLD") 

这有250万点。我现在将它们读入SpatialPointsDataFrame,首先阅读第一个元素。

point.sp <- SpatialPointsDataFrame(readWKT(df$WKT[1]), 
            data=data.frame(OBJECTID=df$OBJECTID[1], LOT_NO=df$LOT_NO[1])) 

现在我读了其余的元素。 这就是问题出在的地方。它已经3.5小时,仍在运行。

for (n in 2:as.integer(cnt)) { 
    point.sp <- rbind(point.sp, 
        SpatialPointsDataFrame(readWKT(df$WKT[n]), 
              data.frame(OBJECTID=df$OBJECTID[n], LOT_NO=df$LOT_NO[n]))) 
} 

上述for循环中出现什么问题?有另一种方法可以做到这一点吗?

+1

您正在种植一个物体。 BIG no no。你不能一步到位吗? –

+0

为什么你一次读一个点,即使用for循环?这不工作吗?:'points.sp < - SpatialPointsDataFrame(readWKT(df $ WKT),data.frame(OBJECTID = df $ OBJECTID,LOT_NO = df $ LOT_NO))) – shekeine

+0

不,我不能这样做,因为SpatialPointsDataFrame一次只能读一个。 – MaxPD

回答

0

我以另一种方式解决了这个问题,花了不到10秒。该更改在查询中。相反,从Shape列检索Shape.STAsText()为WKT的对象,我从Shape

df<-sqlQuery(ch, "select OBJECTID, LOT_NO, Shape.STY as Lat, Shape.STX as Lon FROM SRC_PLI_QLD") 
cnt<-sqlQuery(ch, "select count(OBJECTID) from SRC_PLI_QLD") 

然后检索LatLong值我所做的:

coordinates(df) =~Lat+Lon 

,我的数据帧DF已转化为一个SpatialPointsDataFrame

> class(df) 
[1] "SpatialPointsDataFrame" 
attr(,"package") 
[1] "sp"