আর পোস্টজিআইএস ডেটা নিয়ে কাজ করছেন?


27

আমি প্রায় সব সময় আর এর সাথে কাজ করি এবং এখন আমি এটি স্থানিক ডেটা মাইনিংয়ের জন্য ব্যবহার করছি।

আমার জিআইএস ডেটা সহ একটি পোস্টজিআইএস ডাটাবেস রয়েছে।

আমি যদি পরিসংখ্যানগত স্থানিক বিশ্লেষণ করতে চাই এবং প্লটের মানচিত্রগুলি এর পক্ষে ভাল উপায়:

  • টেবিলগুলি শেফফিল হিসাবে রফতানি করুন বা;
  • সরাসরি ডাটাবেসে কাজ করবেন?

উত্তর:


34

আপনার যদি rgdal প্যাকেজে PostGIS ড্রাইভারের ক্ষমতা থাকে তবে এটি একটি সংযোগ স্ট্রিং তৈরি এবং এটি ব্যবহারের কেবল প্রশ্ন। আমি এখানে gisডিফল্ট শংসাপত্রগুলি ব্যবহার করে আমার স্থানীয় ডাটাবেসের সাথে সংযোগ করছি , তাই আমার ডিএসএন বরং সহজ। আপনার একটি হোস্ট, ব্যবহারকারীর নাম, বা পাসওয়ার্ড যুক্ত করতে হতে পারে। তথ্যের জন্য gdal ডক্স দেখুন।

> require(rgdal)
> dsn="PG:dbname='gis'"

সেই ডাটাবেসে কী টেবিল রয়েছে?

> ogrListLayers(dsn)
 [1] "ccsm_polygons"         "nongp"                 "WrldTZA"              
 [4] "nongpritalin"          "ritalinmerge"          "metforminmergev"      

একটা নাও:

> polys = readOGR(dsn="PG:dbname='gis'","ccsm_polygons")
OGR data source with driver: PostgreSQL 
Source: "PG:dbname='gis'", layer: "ccsm_polygons"
with 32768 features and 4 fields
Feature type: wkbMultiPolygon with 2 dimensions

আমি কি পেয়েছি?

> summary(polys)
Object of class SpatialPolygonsDataFrame
Coordinates:
        min      max
x -179.2969 180.7031
y  -90.0000  90.0000
Is projected: NA 
proj4string : [NA]
Data attributes:
      area         perimeter       ccsm_polys      ccsm_pol_1   
 Min.   :1.000   Min.   :5.000   Min.   :    2   Min.   :    1  
 1st Qu.:1.000   1st Qu.:5.000   1st Qu.: 8194   1st Qu.: 8193  
 Median :1.000   Median :5.000   Median :16386   Median :16384  
 Mean   :1.016   Mean   :5.016   Mean   :16386   Mean   :16384  
 3rd Qu.:1.000   3rd Qu.:5.000   3rd Qu.:24577   3rd Qu.:24576  
 Max.   :2.000   Max.   :6.000   Max.   :32769   Max.   :32768  

অন্যথায় আপনি আর এর ডাটাবেস কার্যকারিতা ব্যবহার করতে পারেন এবং টেবিলগুলি সরাসরি জিজ্ঞাসা করতে পারেন।

> require(RPostgreSQL)
Loading required package: RPostgreSQL
Loading required package: DBI
> m <- dbDriver("PostgreSQL")
> con <- dbConnect(m, dbname="gis")
> q="SELECT ST_AsText(the_geom) AS geom from ccsm_polygons LIMIT 10;"
> rs = dbSendQuery(con,q)
> df = fetch(rs,n=-1)

এটি বৈশিষ্ট্যটির জ্যামিতিকে ফিরিয়ে দেয় df$geom, যা কিছু করার জন্য আপনাকে spশ্রেণি অবজেক্টগুলিতে (স্প্যাটিয়ালপলিগনস, স্প্যাটিয়ালপয়েন্টস, স্প্যাটিয়াললাইনস) রূপান্তর করতে হবে। Rgeos এ readWKT ফাংশন এতে সাহায্য করতে পারে।

সচেতন হওয়া জিনিসগুলি সাধারণত ডাটাবেস কলামগুলির মতো স্টাফ যা আর ডেটা ধরণে ম্যাপ করা যায় না। রূপান্তর, ফিল্টারিং বা সীমাবদ্ধকরণ করতে আপনি কোয়েরিতে এসকিউএল অন্তর্ভুক্ত করতে পারেন। এটি আপনাকে শুরু করা উচিত।


দুর্দান্ত উত্তর, তবে আমি কীভাবে সক্ষম (পোস্টগিস ড্রাইভার) এ সক্ষম হব rgadl? আমি উবুন্টুতে রয়েছি 13.04 ...
জানুয়ারী

তোমার কি আছে? OgrDrivers () ফাংশনটি আপনাকে কোথাও বলা উচিত। যদি না হয় তবে এটি সম্পূর্ণ অন্য একটি প্রশ্ন (সম্ভবত প্রথমে সবচেয়ে ভাল
গুগল করা

উবুন্টুতে, ড্রাইভারটি ডিফল্টরূপে ইনস্টল করা হয়। ম্যাকোস এক্স-এ এটি নয় Thanks ধন্যবাদ!
ন্যানানুয়ানু

উপরের আপনার কোডে, readOGRপদ্ধতিতে কি কোনও পূর্ণ টেবিলের পরিবর্তে স্কয়ার ব্যবহার করা সম্ভব ?
ন্যানানুয়ানু

বর্তমানে আমি মনে করি না। এই সম্পর্কে প্রায় 2.5 বছর পূর্বে আর-সিগ-জিওতে কিছু বকবক হয়েছিল, তবে কিছুই করা হয়নি বলে মনে হয়। এটি একটি whereধারা যোগ এবং এটি ওজিআর মাধ্যমে পাস করা সহজ বলে মনে হচ্ছে setAttributeFilterতবে সমস্ত কিছু সি এবং সি ++ কোডে করা উচিত ...
স্পেসডম্যান

8

পোস্টগিসে ডেটা থাকলে তা শেফফাইলে রফতানি করবেন না। আমার দৃষ্টিকোণ থেকে, এটি এক ধাপ পিছনে।

আপনি এসকিউএল স্টেটমেন্ট ব্যবহার করে আর থেকে আপনার পোস্টগিস ডাটাবেসটি জিজ্ঞাসা করতে পারেন, সেগুলি ডেটাফ্রেম হিসাবে আমদানি করে এবং যেহেতু আপনি আর এর সাথে পরিচিত, সেখান থেকে আপনার প্রয়োজনীয় সমস্ত ভূতাত্ত্বিক বিষয়গুলি করুন। আমি বিশ্বাস করি আপনি নিজের ভূ-তাত্ত্বিক ফলাফলটি পোস্টগিসে ফিরেও রফতানি করতে পারবেন।

পোস্টগিস ফাংশন সহ এসকিউএল ব্যবহার করে আপনি ওভারলে ক্রিয়াকলাপ, দূরত্ব ইত্যাদির মতো সমস্ত ধরণের স্থানিক বিশ্লেষণও করতে পারেন।

মানচিত্রের চক্রান্তের জন্য আমি কিউজিআইএস , একটি ওপেনসোর্স জিআইএস সফটওয়্যার ব্যবহার করব , যা পোস্টগ্রিস সরাসরি পড়তে পারে (যতদূর আমি জানি যে প্রকল্পের প্রাথমিক লক্ষ্য ছিল), এবং আসন্ন সংস্করণ ২.০ দুর্দান্ত বৈশিষ্ট্যযুক্ত মানচিত্র তৈরির জন্য প্রচুর বৈশিষ্ট্য নিয়ে আসে ।


ঠিক আছে দুর্দান্ত পরামর্শ, তবে যেহেতু আমি কিজিসে গিয়ে আর (প্লট সহ) সমস্ত কিছু স্বয়ংক্রিয় করতে চাইছি, প্রবাহ ভেঙে ফেলেছি, তাই না?
nanounanue

সেক্ষেত্রে আপনি যদি এতে স্বাচ্ছন্দ্য বোধ করেন তবে আপনার মানচিত্রের প্লট করতে কেবল আর ব্যবহার করুন। তবুও, কিউগিস প্রকল্পের লেআউট পোস্টগ্রিজ (আপডেট করা) ডেটার ভিত্তিতে প্রস্তুত করে রাখার পরেও তারা আপডেট করবে। আমার ধারণা, শেষ পর্যন্ত এটি আর বা কিউজিআইএস ব্যবহার করবেন কিনা তা ব্যক্তিগত পছন্দ হবে be
আলেকজান্দ্রি নেটো

আপনার তাত্ক্ষণিক প্রতিক্রিয়ার জন্য আপনাকে ধন্যবাদ, তবে পোস্টগিসের একটি টেবিল থেকে আমি কীভাবে আর ব্যবহার করে একটি প্লট তৈরি করতে পারি?
nanounanue

আমি আর এর সাথে খুব অভিজ্ঞ নই এবং আমি জানি না আপনি কীভাবে এটি ব্যবহার করে ভেক্টর ডেটা প্লট করবেন (যেমন আমি বলেছিলাম যে আমি এর জন্য কিউজিআইএস ব্যবহার করি), কীভাবে আপনি আর-তে শ্যাফিলগুলি প্লট করবেন? আরআই থেকে পোস্টগ্রাস এসকিউএলএ সংযোগের জন্য আরপিস্টগ্রিএসকিউএল আগে ব্যবহার করেছেন । আমার মনে হয় rgdal ]। শুভকামনা!
আলেকজান্দ্রি নেটো

5

সদ্য চালু হওয়া এসএফ-প্যাকেজ (এসপি এর সাকসেসর) st_read()এবং st_read_db()কার্যাদি সরবরাহ করে। এই টিউটোরিয়ালটির পরে এবং আমার অভিজ্ঞতা থেকে এটি ইতিমধ্যে উল্লিখিত উপায়গুলির চেয়ে দ্রুতযেহেতু এসএফ সম্ভবত একদিন এসপি প্রতিস্থাপন করবে এটি এখন দেখার জন্য এটিও একটি ভাল কল;)

require(sf)
dsn = "PG:dbname='dbname' host='host' port='port' user='user' password='pw'"
st_read(dsn, "schema.table")

আপনি RPostgreSQL ব্যবহার করে ডিবি অ্যাক্সেস করতে পারেন:

require(sf)
require(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, dbname = dbname, user = user, host = host, port = port, password = pw)

st_read_db(con, table = c("schema", "table"))
# or:
st_read_db(con, query = "SELECT * FROM schema.table")

dbDisconnect(con)
dbUnloadDriver(drv)

st_write()আপনি ডেটা আপলোড করতে পারেন সঙ্গে ।


1
এটি সবচেয়ে সহজ সমাধান, এখানে একটি ভিগনেট ক্র্যান.আর-প্রজেক্ট.আর / ওয়েবে / প্যাকেজ / এসএফ
সিড্রিক

2

আপনার সমাধানের জন্য প্রতিটি পদক্ষেপের ভিত্তিতে আপনি একই সাথে সমস্ত সরঞ্জাম ব্যবহার করতে পারেন।

  • আপনি যদি ভূ-তাত্ত্বিক বিশ্লেষণ করতে চান, তবে আর আর এর প্যাকেজগুলি আরও শক্তিশালী এবং আপনাকে আরও বিশ্লেষণাত্মক ফলাফলের অনুমতি দেয়। আপনি এসকিউএল কোয়েরির উপর ভিত্তি করে ডেটা আমদানি করতে পারেন।
  • যদি আপনি যৌক্তিক ভিত্তিতে আপনার ডেটা একত্রিত করতে চান তবে আপনি PostGIS ব্যবহার করতে পারেন। আমার জটিল নির্ধারিত সীমাতে অনেকগুলি পয়েন্টের মতো উত্তর দিতে পারেন? তবে গ্র্যান্ড স্কেলে।
  • ম্যাপিংয়ের জন্য, আপনি আর বা কিউজিআইএস ব্যবহার করতে পারেন। কিউজিআইএস আরও সোজা এগিয়ে, আর এর সাথে আপনি পছন্দসই ফলাফল অর্জনের জন্য ঝগড়া করতে পারেন।

আপনি যদি আমাদের সমস্যা থেকে আমাদের আরও বিশদ জানান তবে আমরা আপনাকে আরও সুনির্দিষ্ট উত্তরের জন্য সরবরাহ করতে পারি


আপনি শেষ পয়েন্টটির উদাহরণ সরবরাহ করতে পারেন, আমি বলতে চাই, যদি আমি পোস্টগিসের একটি টেবিল থেকে আর দিয়ে কোনও মানচিত্র প্লট করতে চাই তবে আমি কী করতে পারি?
ন্যানানুয়ানু

@ জ্ঞান নিশ্চিত করুন: লাইব্রেরি ("আরজিডাল") মাইডাটা = রিড ওজিআর (ডিএসএন = "পিজি: ডিবি নাম = <mydBS", স্তর = "স্কিমা.ট্যাবল") প্লট (মাইডাটা, অক্ষগুলি = সত্য) শিরোনাম ("আমার প্লট")
টিকিট

এই পৃষ্ঠাটিও একবার দেখুন: wiki.intamap.org/index.php/ পোষ্টজিআইএস
nickves

2

আমি rgdal এবং RPostgreSQL এর সংমিশ্রণেও যাব। সুতরাং, @ গুইলিউমের মতো একই কোড, আরও বেশি লাইন, একটি সিউডো-এলোমেলো টেবিলের নাম এবং আরও ভাল পারফরম্যান্সের জন্য একটি আনলগড টেবিলের ব্যবহার হ্যান্ডেল করে এমন ট্রাইচ্যাচ ছাড়া except (আমার কাছে নোট করুন: আমরা টিএমপি টেবিলটি ব্যবহার করতে পারি না, কারণ এটি রিড ওজিআর থেকে দৃশ্যমান নয়)

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

পড়ুন ওজিআর অংশ:

user  system elapsed
0.313   0.021   1.436


1

আপনি rgdal এবং RPostreSQL একত্রিত করতে পারেন। এই উদাহরণ ফাংশনটি RPostgreSQL দিয়ে একটি অস্থায়ী টেবিল তৈরি করে এবং এটি একটি স্থানিক অবজেক্টের আউটপুট জন্য রিডিং ওজিআর প্রেরণ করে। এটি সত্যিই অদক্ষ এবং কুরুচিপূর্ণ তবে এটি বেশ ভালভাবে কাজ করে। নোট করুন যে ক্যোয়ারীর একটি নির্বাচন বাছাই হওয়া উচিত এবং ব্যবহারকারীর ডাটাবেজে লেখার অ্যাক্সেস থাকা দরকার।

RPostGIS <- function(coninfo,query) {
  dsn=paste("PG:dbname='",coninfo$dbname,"' host='",coninfo$host,"' port='",coninfo$port,"' user='",coninfo$user,"' password='",coninfo$password,"'", sep='')
  drv <- dbDriver("PostgreSQL")
  con <- dbConnect(drv, user=coninfo$user, password=coninfo$password, dbname=coninfo$dbname)
  res <- dbSendQuery(con,paste('CREATE TABLE tmp1209341251dva1 AS ',query,sep=''))
  geo <- dbGetQuery(con,"SELECT f_geometry_column from geometry_columns WHERE f_table_name='tmp1209341251dva1'")
  if(length(geo)>1){
    tname=paste("tmp1209341251dva1(",geo$f_geometry_column[1],")")
  }else{
    tname="tmp1209341251dva1";
  }
  out <- tryCatch(readOGR(dsn,tname), finally=dbSendQuery(con,'DROP TABLE tmp1209341251dva1'))
  dbDisconnect(con)
  return(out)
}

আপনি এ জাতীয় কিছু দিয়ে কল করতে পারেন:

> require('rgdal')
> require('RPostgreSQL')
> coninfo=list(host='localhost',dbname='spatial_db',port='5432',user='myusername',password='mypassword')
> spatial_obj<-RPostGIS(coninfo,"SELECT * FROM spatial_table")

0

আপনি যদি 'এসT_AsText (geom) কে geomwkt হিসাবে একটি কোয়েরি ফিরিয়ে দেন এবং ফলাফলকে ডেটাতে আনেন, আপনি ব্যবহার করতে পারেন:

library(rgeos);library(sp)
wkt_to_sp <- function(data) {
  #data is data.frame from postgis with geomwkt as only geom
  SpP <- SpatialPolygons(lapply(1:length(data$geomwkt), 
           function(x) Polygons(list(Polygon(readWKT(data$geomwkt[x]))),x)))
  data <- data[,!(names(data) == "geomwkt")]
  return(SpatialPolygonsDataFrame(SpP, data))
}

তবুও বেদনাদায়ক ধীর গতি .... একটি পরীক্ষায় 100 জহমের জন্য 1 সেকেন্ড।


0

জিওটুপল - https://github.com/rhansson/geotuple একটি ওয়েব অ্যাপ্লিকেশন যা আর-সার্ভার এবং পোস্টজিআইএসকে সংযুক্ত করে (RPostgreSQL ব্যবহার করে)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.