SpatialpolygonsDataFrame के लिए एक स्थानिक स्थान को कैसे बदलें और विशेषता तालिका में एक स्तंभ जोड़ें


19
coast<-readShapeSpatial("coastline.shp")
landc<-readShapeSpatial("landcover.shp")
ro<-readShapeSpatial("roads.shp")
bc<-gBuffer(ro,width=100)
landc$ratings=1
landc$ratings[landc$LANDUSE_ID==4]=0 

ऊपर, मैं किसी भी श्रेणी को लेता हूं जिसमें 4 है और नए कॉलम में इसे 0 के रूप में रखा गया है।

इस बिंदु पर, मैं चाहता हूं कि कॉलम नाम ratingsके लिए भी है bc, जहां यह 0 होगा अगर यह बफर के अंदर है और 1 अगर यह बाहर है। समस्या यह है कि यह bcहै SpatialPolygonsऔर इसमें विशेषता तालिका नहीं है।

स्पष्ट रूप से किसी SpatialPolygonऑब्जेक्ट में एक कॉलम जोड़ने के लिए आपको इसे एक में बदलना होगा SpatialPolygonsDataFrame, लेकिन मुझे नहीं पता कि कैसे।

मैंने यह कोशिश की:

buf_df<-as.data.frame(bc)
s_po<-SpatialPolygonsDataFrame(bc,buf_df)
s_po$ratings=0

लेकिन यह त्रुटि पॉप अप:

row.names of data and Polygons IDs do not match 

1
यदि आप gBuffer के लिए सहायता पढ़ते हैं, तो आपको पता होगा कि अगर by = = परिणाम एक SpatialPolygonsDataFrame है।
जेफरी इवांस

जवाबों:


11

"कोस्ट", "आरओ" और "बीसी" ऑब्जेक्ट्स को आपकी समस्या के साथ क्या करना है? समस्या यह हो सकती है कि आप "readShapeSpatial" का उपयोग कर रहे हैं। क्या आपने rgdal में readOGR की कोशिश की है? यदि आप एक बहुभुज आकार की आकृति पढ़ रहे हैं, तो readOGR एक SpatialPolygonsDataFrame ऑब्जेक्ट में परिणाम देगा।

यदि आप वास्तव में, एक SpatialPolygons ऑब्जेक्ट है और SpatialPolygonsDataFrame में निर्दिष्ट करना चाहते हैं, तो निर्दिष्ट डेटाफ़्रेम को बहुभुज आईडी के पॉलीगॉन स्लॉट में मेल करने के लिए इसकी रोने की आवश्यकता होगी। यहाँ एक त्वरित उदाहरण है।

library(sp)

# create some SpatialPolygons with ID's "2" and "3"
( p <- SpatialPolygons(list(Polygons(list(Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))), "2"),
     Polygons(list(Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))), "3"))) )
class(p)    

# Create a dataframe and display default rownames
( p.df <- data.frame( ID=1:length(p)) ) 
rownames(p.df)

# Try to coerce to SpatialPolygonsDataFrame (will throw error)
p <- SpatialPolygonsDataFrame(p, p.df) 

# Extract polygon ID's
( pid <- sapply(slot(p, "polygons"), function(x) slot(x, "ID")) )

# Create dataframe with correct rownames
( p.df <- data.frame( ID=1:length(p), row.names = pid) )    

# Try coersion again and check class
 p <- SpatialPolygonsDataFrame(p, p.df)
 class(p) 

# Now we can add a column
p@data$ratings <- 1:2 

# Or modify an existing one
p[p$ID < 2 ,] <- 5

मैंने "कोस्ट", "आरओ" और "बीसी" जैसे बाकी कोड दिखाए जो आपको यह जानने में मदद करने के लिए कि मैं सामान्य रूप से क्या करने की कोशिश कर रहा हूं। मुझे इस बात का और अधिक उत्तर प्राप्त करने की आवश्यकता है कि मैं क्या पूछ रहा हूं और अधिक समझने योग्य होने के लिए अपने स्वयं के चर का उपयोग करना बुद्धिमान होगा। पठन, रीडॉग और रीडस्पेशियल के साथ क्या सौदा है? "Bc" में सड़क बफर शामिल है जो कि स्पैटियलपॉलिगोन्स ऑब्जेक्ट है जिसे मुझे नए कॉलम को जोड़ने की आवश्यकता है, इस प्रकार मुझे इसे एक स्पैटियलपॉलीगॉन्सडॉटफ्रेम में बदलना होगा।
gsa

10

प्रयत्न:

#Code taken from the question:
s_po <- SpatialPolygonsDataFrame(bc, buf_df, match.ID = F) 

match.ID मैच पॉलीगॉन आईडी के लिए उपद्रवियों की आवश्यकता से बचा जाता है


4
इसके विपरीत मत बनो, यह सराहना नहीं है! कारण "जटिल" उत्तर प्रदान किए गए थे क्योंकि 2015 में, जब प्रश्न को संबोधित किया गया था, तो मैच ।आईडी तर्क को सहयोग विधि में उपलब्ध नहीं था।
जेफरी इवांस

7

यह काफी सरल है:

library("rgdal")
polygons <- readOGR('path_to/file.shp',
                      layer = 'file')
class(polygons)
>[1] "SpatialPolygonsDataFrame"
>attr(,"package")
>[1] "sp"

poly_df <- as.data.frame(polygons)
# do some staff with "poly_df" that doesn't support SpatialPolygonsDataFrame
# then convert it to SPDF back again
s_poly <- SpatialPolygonsDataFrame(polygons, poly_df)
# add new column to SPDF:
s_poly$new_column <- "some data" 

जब त्रुटि: "डेटा और पॉलीगन्स आईडी का पंक्ति.नाम मेल नहीं खाता" तो यह समाधान मददगार लगता है: पॉलीगॉन की आईडी से मिलान करने के लिए डेटाफ्रेम की आईडी का नाम बदलें:

newdata <- data.frame(whatever you want in here)
row.names(newdata) <- (however the new polygons are labeled)
polygons <- SpatialPolygonsDataFrame(polygons, newdata)

2
यहाँ एक दो कदम पर यकीन नहीं है। यह जबरदस्ती संदिग्ध है: as.data.frame (बहुभुज)। आप उदाहरण के लिए एक ही वर्ग में वस्तु coercing है। इसके अतिरिक्त, एक वास्तविक उदाहरण में आप एक त्रुटि फेंक देंगे क्योंकि डेटाफ्रेम के उप नाम बहुभुज स्लॉट (ओं) में आईडी से मेल नहीं खाएंगे। आपको बहुभुज आईडी को खींचने और उन्हें रोशन करने से पहले रोशन करने की आवश्यकता है।
जेफरी इवांस

@ जेफ्री इवांस, यह वर्किंग कोड से कॉपी-पेस्ट है। कोई त्रुटि नहीं, सब कुछ काम कर रहा है। बस कैसे SpatialPolygonsDataFrameबनाया जाता है पर कुछ प्रलेखन पढ़ें ।
SS_Rebelious

4
लेकिन, जब से आप अपने उदाहरण में readOGR का उपयोग करते हैं, तो आप एक SpatialPolygonsDataFrame से शुरू कर रहे हैं और आपके द्वारा सब्मिट किए गए डेटाफ़्रेम में पहले से ही सही रोएंम हैं क्योंकि आपने इसे मूल sp ऑब्जेक्ट से खींचा था। यह एक स्ट्रोमैन का उदाहरण है।
जेफरी इवांस

@ जेफ्री इवांस, मैंने अर्थ स्पष्ट करने के लिए अपना उत्तर संपादित किया।
SS_Rebelious 12

मुख्य पोस्ट में मेरा अंतिम संपादन देखें और मुझे बताएं कि मैंने क्या गलत कारण किया है, मुझे लगता है कि मैंने इसे आपकी टिप्पणी के अनुसार बनाया है, लेकिन यह त्रुटि देता है। इसे और अधिक समझने के लिए मेरे स्वयं के चर का उपयोग करें। धन्यवाद
जीएसए

0

मुझे लगता है कि निम्नलिखित समाधान आम तौर पर काम करता है।

सबसे पहले, फ़ील्ड के रूप में आईडी के साथ एक खाली डेटाफ़्रेम बनाएं:

df <- data.frame(ID=character(), stringsAsFactors=FALSE )

फिर स्थानिक बहुभुज की आईडी प्राप्त करें bc:

for (i in bc@polygons ) { df <- rbind(df, data.frame(ID=i@ID, stringsAsFactors=FALSE))  }
# and set rowname=ID
row.names(df) <- df$ID

तब स्थानिक डेटाफ़्रेम रूपांतरण फ़ंक्शन के दूसरे तर्क के रूप में df का उपयोग करें:

spatial_df <- SpatialPolygonsDataFrame(bc, df)

के रूप में dfऔर spatial_dfdataframe वस्तुओं रहे हैं, कॉलम आसानी से जोड़ा जा सकता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.