मैं rgdal और RPostgreSQL के संयोजन पर भी जाऊंगा। तो, @Guillaume के समान कोड, एक ट्राइकैच को छोड़कर जो अधिक लाइनों को हैंडल करता है, एक छद्म यादृच्छिक तालिका नाम और बेहतर प्रदर्शन के लिए एक अनलॉगेड टेबल का उपयोग। (खुद पर ध्यान दें: हम 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 क्षेत्र):
पोस्टगिस हिस्सा:
user system elapsed
0.001 0.000 0.008
readOGR हिस्सा:
user system elapsed
0.313 0.021 1.436
rgadl
? मैं उबंटू 13.04 में हूं ...