আর-তে কোনও শেফফিল ব্যবহার না করে স্থানিক বহুভুজ ইনস্ট্যান্ট করছে


22

সুতরাং, আর-তে একটি শেফফাইল পড়ার স্বাভাবিক উপায়টি ম্যাপটুলস প্যাকেজের মাধ্যমে হয়:

sfdata <- readShapeSpatial("/path/to/my/shapefile.shp", proj4string=CRS("+proj=longlat"))

যাইহোক, আমার একটি ব্যবহারের মামলা রয়েছে যার দ্বারা আমার কাছে শেপফিল.শ্প নেই তবে পরিবর্তে আমার কাছে বহুভিত্তিক স্থানাঙ্কের একটি সিরিজ রয়েছে

16.484375 59.736328125,17.4951171875 55.1220703125,24.74609375 55.0341796875,22.5927734375 61.142578125,16.484375 59.736328125

এবং এটি সম্পর্কিত প্রক্ষেপণ

coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 

আমি কীভাবে এই ডেটা থেকে সরাসরি "এসটিডিটি" করব (যা একটি "বহুভুজ অবজেক্ট" হবে)? (এই ডেটা দিয়ে একটি শেফফাইল তৈরির চারদিকে ঘুরে না গিয়ে নতুন তৈরি শেফফাইল থেকে পড়া)

উত্তর:


35

প্রথমে 2 কলামের ম্যাট্রিক্সে স্থানাঙ্কগুলি পান:

> xym
         [,1]     [,2]
[1,] 16.48438 59.73633
[2,] 17.49512 55.12207
[3,] 24.74609 55.03418
[4,] 22.59277 61.14258
[5,] 16.48438 59.73633

তারপরে একটি বহুভুজ তৈরি করুন, এটি একটি বহুভুজ অবজেক্টে মুড়িয়ে রাখুন, তারপরে এটিকে একটি স্পেশিয়ালপলিগনস বস্তুতে মুড়িয়ে দিন:

> library(sp)
> p = Polygon(xym)
> ps = Polygons(list(p),1)
> sps = SpatialPolygons(list(ps))

এই স্তরের জটিলতার কারণটি হ'ল একটি বহুভুজ একটি সাধারণ রিং, একটি বহুভুজ অবজেক্ট আইডির সাথে বিভিন্ন রিং হতে পারে (এখানে 1 সেট করা হয়েছে) (তবে এটি একটি জিআইএসের একক বৈশিষ্ট্যের মতো) এবং স্পেশালপলিজাগুলিতে সিআরএস থাকতে পারে । ওহ, আমার সম্ভবত এটি সেট করা উচিত:

> proj4string(sps) = CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")

যদি আপনি এটিকে একটি স্পেশিয়ালপলিগনস ডেটা ফ্রেমে রূপান্তর করতে চান (শেপফাইলটি যখন বহুভুজ হয় তখন আমাদের রিডশেপস্পটিয়ালটি আসে) তবে তা করুন:

> data = data.frame(f=99.9)
> spdf = SpatialPolygonsDataFrame(sps,data)
> spdf

এটি প্রদান:

> summary(spdf)
Object of class SpatialPolygonsDataFrame
Coordinates:
       min      max
x 16.48438 24.74609
y 55.03418 61.14258
Is projected: FALSE 
proj4string :
[+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0]
Data attributes:
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   99.9    99.9    99.9    99.9    99.9    99.9 

+1 খুব সুন্দর, স্পষ্ট প্রকাশ। একচেটিয়া ব্লক হিসাবে প্রস্তাবিত হওয়ার চেয়ে ব্যাখ্যার দ্বারা কোডটি ভেঙে দেওয়া দেখতে দুর্দান্ত!
হোবার

দুর্দান্ত ... এই জিনিসগুলি কীভাবে একসাথে রাখা হয় তা দেখে দুর্দান্ত! এর মতো আরও স্পষ্টভাবে লিখিত আর সহায়ক পৃষ্ঠাগুলি আরও দেখতে হবে।
সিম্বামাঙ্গু

এটি প্রতিবার যখন আমি এটি করতে চাই তখন নিজেকে পুনরায় শেখাতে হবে, তাই আমি অন্য লোকদের শেখানোর কোনও সুযোগ নিই!
স্পেসডম্যান

1
দুর্দান্ত ... আমি কীভাবে ডেটা ফ্রেমে একাধিক অনন্য আইডি (চ) বহুভুজ যুক্ত করতে যাব?
mga

2
এই উত্তরটির আরও সাধারণ বৈধতা থাকার জন্য, আপনি একাধিক বহুভুজ ক্ষেত্রে এটি কীভাবে করবেন তা দেখাতে পারেন? এটি কিছুটা জটিল।
টমাস

2

আপনার ডেটাতে একাধিক বহুভুজ থাকবে এমন ক্ষেত্রে স্পেসডম্যানের দুর্দান্ত উত্তরটি সম্পূর্ণ করতে এখানে কিছু কোড ব্যবহার করে এখানে দেওয়া হয়েছে dplyr:

library(dplyr)
library(ggplot2)
library(sp)
## use data from ggplot2:::geom_polygon example:
positions <- data.frame(id = rep(factor(c("1.1", "2.1", "1.2", "2.2", "1.3", "2.3")), each = 4),
                    x = c(2, 1, 1.1, 2.2, 1, 0, 0.3, 1.1, 2.2, 1.1, 1.2, 2.5, 1.1, 0.3,
                          0.5, 1.2, 2.5, 1.2, 1.3, 2.7, 1.2, 0.5, 0.6, 1.3),
                    y = c(-0.5, 0, 1, 0.5, 0, 0.5, 1.5, 1, 0.5, 1, 2.1, 1.7, 1, 1.5,
                          2.2, 2.1, 1.7, 2.1, 3.2, 2.8, 2.1, 2.2, 3.3, 3.2)) %>% as.tbl


df_to_spp <- positions %>%
  group_by(id) %>%
  do(poly=select(., x, y) %>%Polygon()) %>%
  rowwise() %>%
  do(polys=Polygons(list(.$poly),.$id)) %>%
  {SpatialPolygons(.$polys)}

## plot it
plot(df_to_spp)

কেবল মজাদার জন্য, আপনি ggplot2প্রাথমিক ডেটা ফ্রেম ব্যবহার করে প্রাপ্ত প্লটের সাথে তুলনা করতে পারেন :

ggplot(positions) + 
  geom_polygon(aes(x=x, y=y, group=id), colour="black", fill=NA)

নোট করুন যে উপরের কোডটি ধরে নিয়েছে যে আপনার প্রতি আইডি প্রতি একটি মাত্র পলিয়োগান রয়েছে। যদি কিছু আইডির বহুভুজ থাকে, তবে আমি অনুমান করি যে ডেটাসেটে অন্য একটি কলাম যুক্ত করা উচিত, প্রথমে group_byসাব-আইডি, তার group_by(upper-id)পরিবর্তে ব্যবহার করুনrowwise

purrr::mapফাংশনটি ব্যবহার করে একই কোড :

df_to_spp <- positions %>%
  nest(-id) %>%
  mutate(Poly=purrr::map(data, ~select(., x, y)  %>% Polygon()),
         polys=map2(Poly, id, ~Polygons(list(.x),.y))) %>%
  {SpatialPolygons(.$polys)}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.