我遇到了一个小问题,我的for
循环已经运行了3.5小时+。我在SQL Server
中有一个Geodataset,其中有一个名为Shape
的字段,用于存储geometry
数据类型中的坐标。首先,我通过ODBC
将R连接到我的数据库并检索我想要的信息(同时将Shape
列转换为可读的内容)
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
循环有什么问题?还有其他方法可以做到这一点吗?
答案 0 :(得分:0)
我用另一种方式解决了这个问题,花了不到10秒钟。更改是在查询中。我没有从Shape.STAsText()
列中检索Shape
作为WKT对象,而是从Lat
Long
和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")
然后我做了:
coordinates(df) =~Lat+Lon
我的数据框df已转换为SpatialPointsDataFrame
> class(df)
[1] "SpatialPointsDataFrame"
attr(,"package")
[1] "sp"