আরে ছেদ অঞ্চলগুলি উত্তোলন


19

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

এখানে চিত্র বর্ণনা লিখুন

library(rgdal)
library(rgeos)
Field<-readOGR("./","Field")
Soil<-readOGR("./","Soil")
Results<-gIntersects(Soil,Field,byid=TRUE)
rownames(Results)<-Field@data$FieldName
colnames(Results)<-Soil@data$SoilType

> Results
      A     B     C     D
Z  TRUE FALSE FALSE FALSE
Y FALSE  TRUE  TRUE FALSE
X  TRUE  TRUE  TRUE  TRUE

এবং এর সাথে ভাল ফলাফল অর্জন করেছে যা আমাকে জানিয়েছে যে কোন জমিতে কোন মাটির প্রকার রয়েছে। তবে এর পরিবর্তে আমি কীভাবে অঞ্চল পাব?


1
একটি নোট হিসাবে, আপনার পয়েন্টগুলি অক্ষাংশ এবং দ্রাঘিমাংশ হলে st_intersection কাজ করবে না। আপনি নির্দিষ্ট করতে পারেন নি যে আপনার ভৌগলিক স্থানাঙ্ক রয়েছে, যদিও এটি ইঙ্গিত করা হয়েছে যেহেতু আপনি মাটির প্রকারের বিষয়ে কথা বলছেন।
ফুরিয়ার

উত্তর:


24

এই পদ্ধতিটি প্যাকেজ intersect()থেকে ফাংশনটি ব্যবহার করে raster। আমি যে উদাহরণস্বরূপ ডেটা ব্যবহার করেছি তা আদর্শ নয় (একটি জিনিসের জন্য তারা অপরিকল্পিত স্থানাঙ্কে রয়েছেন) তবে আমি মনে করি এটির ধারণাটি পাওয়া যায়।

library(sp)
library(raster)
library(rgdal)
library(rgeos)
library(maptools)

# Example data from raster package
p1 <- shapefile(system.file("external/lux.shp", package="raster"))
# Remove attribute data
p1 <- as(p1, 'SpatialPolygons')
# Add in some fake soil type data
soil <- SpatialPolygonsDataFrame(p1, data.frame(soil=LETTERS[1:12]), match.ID=F)

# Field polygons
p2 <- union(as(extent(6, 6.4, 49.75, 50), 'SpatialPolygons'),
             as(extent(5.8, 6.2, 49.5, 49.7), 'SpatialPolygons'))
field <- SpatialPolygonsDataFrame(p2, data.frame(field=c('x','y')), match.ID=F)
projection(field) <- projection(soil)

# intersect from raster package
pi <- intersect(soil, field)
plot(soil, axes=T); plot(field, add=T); plot(pi, add=T, col='red')

# Extract areas from polygon objects then attach as attribute
pi$area <- area(pi) / 1000000

# For each field, get area per soil type
aggregate(area~field + soil, data=pi, FUN=sum)

Imgur

ফলাফল:

    field soil         area
1      x    A 2.457226e+01
2      x    B 2.095659e+02
3      x    C 5.714943e+00
4      y    C 5.311882e-03
5      x    D 7.620041e+01
6      x    E 3.101547e+01
7      x    F 1.019455e+02
8      x    H 7.106824e-03
9      y    H 2.973232e+00
10     y    I 1.752702e+02
11     y    J 1.886562e+02
12     y    K 1.538229e+02
13     x    L 1.321748e+02
14     y    L 1.182670e+01

2
নির্মল: আমি পছন্দ raster::intersectউপর rgeos::gIntersectionসাবেক দুই থেকে অ্যাট্রিবিউট তথ্য যোগদান করে কারণ SpatialPolgonsDataFrame, বস্তু আধুনিক অ্যাট্রিবিউট তথ্য ড্রপ বলে মনে হয় না।
ম্যাট এসএম

অনেক বিশদ এবং সঠিক উত্তরের জন্য ধন্যবাদ। আপনি আমাকে অনেক সাহায্য করেছেন !!!
ব্যবহারকারী 2386786

4
আপনি যদি "জিন্টারসেকশন" -তে বাইড = সত্য ব্যবহার করেন তবে এটি বৈশিষ্ট্য আইডিএস ফিরিয়ে দেবে যা বৈশিষ্ট্যগুলিকে সংযুক্ত করতে মার্জ করে ব্যবহার করা যেতে পারে। ফাংশনগুলি আলাদা এবং এটি কীভাবে তা লক্ষ করা উচিত। "ছেদ" ফাংশনটি ওভারল্যাপিং এক্সটেন্টগুলি ব্যবহার করে যখন "gIntersication" ভেক্টর জ্যামিতির সুস্পষ্ট ছেদটি। ছেদ করার পদ্ধতিটি একটি বর্গক্ষেত্র / আয়তক্ষেত্রাকার ছেদ এবং প্রকৃত বহুভুজের ছেদ নয়। ব্যাপ্তি এবং বাক্স ব্যবহার করে ব্যাপ্তিটিকে নতুনভাবে সংজ্ঞায়িত করা যেতে পারে। উভয় পদ্ধতির সুবিধা রয়েছে।
জেফ্রি ইভান্স

1
@JeffreyEvans গুড বিন্দু পুনরায় gIntersection; তবে ইনপুট বৈশিষ্ট্য আইডিগুলি সরাসরি সরবরাহ করা হয় না, সেগুলি আউটপুটের বৈশিষ্ট্য আইডিতে জমাটবদ্ধ এবং সংরক্ষণ করা হয়। এর অর্থ আইডিগুলি বিশ্লেষণের অতিরিক্ত পদক্ষেপগুলি, তারপরে বৈশিষ্ট্যগুলিতে যোগ দেওয়া। আমি চাই না যে raster::intersectইনপুট আইডিগুলিকে আউটপুটে অতিরিক্ত বৈশিষ্ট্য হিসাবে অন্তর্ভুক্ত করা হবে ।
ম্যাট এসএম

1
এটি নির্দেশ করার জন্য ধন্যবাদ, আমি আন্তঃস্কেস্ট_স্পটি পুরোপুরি মিস করেছি। মজার বিষয় হল এটি জিন্টারসেক্ট ব্যবহার করে। আপনি যদি বৈশিষ্ট্যগুলি যোগ করতে চান তবে দুর্দান্ত শর্ট কাট
জেফ্রি ইভান্স

24

নতুন sfপ্যাকেজটি ব্যবহার করে এখানে বিকল্প পদ্ধতি রয়েছে যা প্রতিস্থাপনের উদ্দেশ্যে sp। সবকিছু অনেক ক্লিনার এবং পাইপ বান্ধব:

library(sf)
library(tidyverse)

# example data from raster package
soil <- st_read(system.file("external/lux.shp", package="raster")) %>% 
  # add in some fake soil type data
  mutate(soil = LETTERS[c(1:6,1:6)]) %>% 
  select(soil)

# field polygons
field <- c("POLYGON((6 49.75,6 50,6.4 50,6.4 49.75,6 49.75))",
        "POLYGON((5.8 49.5,5.8 49.7,6.2 49.7,6.2 49.5,5.8 49.5))") %>% 
  st_as_sfc(crs = st_crs(soil)) %>% 
  st_sf(field = c('x','y'), geoms = ., stringsAsFactors = FALSE)

# intersect - note that sf is intelligent with attribute data!
pi <- st_intersection(soil, field)
plot(soil$geometry, axes = TRUE)
plot(field$geoms, add = TRUE)
plot(pi$geometry, add = TRUE, col = 'red')

# add in areas in m2
attArea <- pi %>% 
  mutate(area = st_area(.) %>% as.numeric())

# for each field, get area per soil type
attArea %>% 
  as_tibble() %>% 
  group_by(field, soil) %>% 
  summarize(area = sum(area))

এখানে চিত্র বর্ণনা লিখুন

   field  soil      area
   <chr> <chr>     <dbl>
1      x     A  24572264
2      x     B 209573036
3      x     C   5714943
4      x     D  76200409
5      x     E  31015469
6      x     F 234120314
7      y     B   2973232
8      y     C 175275520
9      y     D 188656204
10     y     E 153822938
11     y     F  11826698
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.