ฉันจะไปรวมกันของ rgdal และ RPostgreSQL ดังนั้นรหัสเดียวกันกับ @Guillaume ยกเว้นด้วย tryCatch ที่จัดการกับสายได้มากขึ้นชื่อตารางแบบหลอกเทียมและการใช้ตารางที่ไม่ถูกบล็อกเพื่อประสิทธิภาพที่ดีขึ้น (หมายเหตุถึงตัวเอง: เราไม่สามารถใช้ตาราง TEMP ได้เนื่องจากไม่สามารถมองเห็นได้จาก readOGR)
dbGetSp <- function(dbInfo,query) {
if(!require('rgdal')|!require(RPostgreSQL))stop('missing rgdal or RPostgreSQL')
d <- dbInfo
tmpTbl <- sprintf('tmp_table_%s',round(runif(1)*1e5))
dsn <- sprintf("PG:dbname='%s' host='%s' port='%s' user='%s' password='%s'",
d$dbname,d$host,d$port,d$user,d$password
)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, dbname=d$dbname, host=d$host, port=d$port,user=d$user, password=d$password)
tryCatch({
sql <- sprintf("CREATE UNLOGGED TABLE %s AS %s",tmpTbl,query)
res <- dbSendQuery(con,sql)
nr <- dbGetInfo(res)$rowsAffected
if(nr<1){
warning('There is no feature returned.');
return()
}
sql <- sprintf("SELECT f_geometry_column from geometry_columns WHERE f_table_name='%s'",tmpTbl)
geo <- dbGetQuery(con,sql)
if(length(geo)>1){
tname <- sprintf("%s(%s)",tmpTbl,geo$f_geometry_column[1])
}else{
tname <- tmpTbl;
}
out <- readOGR(dsn,tname)
return(out)
},finally={
sql <- sprintf("DROP TABLE %s",tmpTbl)
dbSendQuery(con,sql)
dbClearResult(dbListResults(con)[[1]])
dbDisconnect(con)
})
}
การใช้งาน:
d=list(host='localhost', dbname='spatial_db', port='5432', user='myusername', password='mypassword')
spatialObj<-dbGetSp(dbInfo=d,"SELECT * FROM spatial_table")
แต่นี่ยังคงช้าอย่างเจ็บปวด:
สำหรับรูปหลายเหลี่ยมชุดเล็ก (6 คุณสมบัติ, 22 สาขา):
ส่วน postgis:
user system elapsed
0.001 0.000 0.008
ส่วน readOGR:
user system elapsed
0.313 0.021 1.436
rgadl
อย่างไร ฉันอยู่ใน Ubuntu 13.04 ...