কীভাবে একটি স্প্যাটালালপলিগনকে একটি স্পেশালপলিগনস ডেটা ফ্রেমে রূপান্তর করতে হয় এবং বৈশিষ্ট্য সারণিতে একটি কলাম যুক্ত করতে হয়


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 হিসাবে রাখি take

এই মুহুর্তে, আমি কলামটি নামটির 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
ঠিক আছে, আপনি যদি জিফারটির জন্য সহায়তাটি পড়েন তবে আপনি জানতে পারবেন যে যদি বাইড = সত্য হয় তবে ফলাফলটি স্পেসিয়ালপলিজোনস ডেটা ফ্রেম।
জেফ্রি ইভান্স

উত্তর:


11

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

যদি বাস্তবে আপনার কাছে স্পেশিয়ালপলিগনস অবজেক্ট থাকে এবং স্পেসিয়াল পলিগনস ডেটা ফ্রেমে বাধ্য করতে চান তবে নির্দিষ্ট ডেটাফ্রেমের বহুভুজ আইনে এর রনামগুলির সাথে বহুভুজ আইডির সাথে মিল থাকতে হবে। এখানে একটি দ্রুত উদাহরণ।

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

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

10

চেষ্টা করুন:

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

match.ID বহুভুজ আইডির জন্য ম্যাচটির প্রয়োজনীয়তা এড়িয়ে চলে


4
বিপরীতে হবেন না, এটি প্রশংসা করা হয় না! "জটিল" উত্তরগুলি সরবরাহ করার কারণটি হ'ল ২০১৫ সালে, যখন প্রশ্নটি সম্বোধন করা হয়েছিল, ম্যাচ.আইডি যুক্তিটি জাল পদ্ধতিতে পাওয়া যায় নি।
জেফ্রি ইভান্স

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 (বহুভুজ)। আপনি উদাহরণটি একই শ্রেণিতে বস্তুকে জোর করে তুলছেন। অতিরিক্ত হিসাবে, একটি প্রকৃত উদাহরণে আপনি একটি ত্রুটি নিক্ষেপ করবেন কারণ ডেটাফ্রেমের রোমনামগুলি বহুভুজ স্লটে আইডিটির সাথে মেলে না। আপনাকে বহুভুজ আইডি টানতে হবে এবং জবরদস্তির আগে তাদেরকে রউননেমগুলিতে নিয়োগ করতে হবে।
জেফ্রি ইভান্স

@ জেফ্রেইভান্স, এটি কার্য কোডের একটি অনুলিপি paste কোনও ত্রুটি নেই, সবকিছু কাজ করছে। কীভাবে SpatialPolygonsDataFrameতৈরি হয় সে সম্পর্কে কিছু ডকুমেন্টেশন পড়ুন ।
এসএস_বিদ্রোহী

4
তবে, যেহেতু আপনি আপনার উদাহরণে রিডওজিআর ব্যবহার করেন, আপনি একটি স্প্যাটিয়ালপলিজোনস ডেটা ফ্রেম দিয়ে শুরু করছেন এবং আপনার সাবসেট করা ডেটা ফ্রেমটির ইতিমধ্যে সঠিক রোভনাম রয়েছে কারণ আপনি এটিকে আসল এসপি অবজেক্ট থেকে টানছেন। এটি একটি খড়ের উদাহরণ।
জেফ্রি ইভান্স

@ জেফ্রি ইভানস, আমি অর্থটি পরিষ্কার করার জন্য আমার উত্তর সম্পাদনা করেছি।
এসএস_বিদ্রোহী

মূল পোস্টে আমার শেষ সম্পাদনাটি দেখুন এবং আমি কী ভুল করেছি তা বলুন কারণ আমি মনে করি এটি আপনার মন্তব্য অনুযায়ী তৈরি করেছি তবে এটি ত্রুটি দেয়। এটি আরও বোধগম্য করতে আমার নিজস্ব ভেরিয়েবলগুলি ব্যবহার করুন। ধন্যবাদ
gsa

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

তারপরে স্থানিক ডেটাফ্রেম রূপান্তর ফাংশনের দ্বিতীয় যুক্তি হিসাবে ডিএফ ব্যবহার করুন:

spatial_df <- SpatialPolygonsDataFrame(bc, df)

ডেটাফ্রেম অবজেক্ট হিসাবে dfএবং spatial_dfকলামগুলি সহজেই যুক্ত করা যায়

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