একটি বহু-বহুভুজকে হ্রাস না করে R এ বাফার এবং ইউনিয়ন


9

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

দুর্ভাগ্যক্রমে, আমি যে বাফারিং এবং / বা দ্রবীভূতকরণ প্রক্রিয়াটি ব্যবহার করছি তা SpatialPolygonsবস্তুটিকে বহু-বহুভুজকে হ্রাস করছে । ব্যবহারের gBufferফলে বহু-বহুভুজ তৈরি হয় যখন byid=FALSE, তবে ওভারল্যাপিং বহুভুজগুলি যখন ইউনিয়ন করতে ব্যর্থ হয় byid=TRUE। পরবর্তী ক্ষেত্রে, পরবর্তীকালে gUnaryUnionআবার বহুভুজগুলি আবার দ্রবীভূত করা একটি বহু-বহুভুজ তৈরি করে। SpatialPointsএই বহু-বহুভুজটির সাথে ওভারলেলিংয়ের ফলে সমস্ত অন্তর্ভুক্ত পয়েন্টগুলি বহুভুজ 1 এর মধ্যে পড়ার খবর পাওয়া গেছে।

এখানে বাফার পয়েন্টগুলির সাথে সম্পর্কিত খেলনার উদাহরণ এখানে আমি বাফার্ড বহুভুজ দিয়ে পয়েন্টগুলির একটি ওভারলে করতে চাই:

library(sp)
library(rgeos)
pts <- SpatialPoints(cbind(c(1, 1, 2, 3), c(1, 2, 1.5, 2.5))) 
plot(gBuffer(pts, width=0.6), lwd=2)
points(pts, pch=20, cex=2)
text(coordinates(pts), labels=seq_len(length(pts)), pos=4, font=2)

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

এবং কিছু ওভারলে ফলাফল ...

  • সহ byid=FALSE:

    b <- gBuffer(pts, width=0.6) 
    over(pts, b)
    # [1] 1 1 1 1
  • সহ byid=TRUE:

    b2 <- gBuffer(pts, width=0.6, byid=TRUE) 
    over(pts, b2)
    # [1] 1 2 3 4
  • সাথে byid=TRUEএবং পরবর্তী gUnaryUnion:

    b3 <- gUnaryUnion(b2)
    over(pts, b3)
    # [1] 1 1 1 1

আমি ফলাফলটি অর্জনের জন্য সঠিক পদ্ধতির সন্ধান করছি 1 1 1 2, অর্থাৎ বহুভুজ 1 এর মধ্যে পয়েন্ট 1, 2 এবং 3 ফলন 1 (পূর্বে বহুভুজ 1, 2, এবং 3, যা সংহত হয়েছে), এবং পয়েন্ট 4 বহুভুজের মধ্যে পড়ে 2 (মূল বহুভুজ 4 )।


সম্পাদনা

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

এই পোলিতে @ জেফরিএভান্সের পদ্ধতির প্রয়োগ করা:

polys <- b@polygons[[1]]@Polygons
pl <- vector("list", length(polys))
for (i in 1:length(polys)) { pl[i] <- Polygons(list(polys[[i]]), i) }
b.spolys <- SpatialPolygons(pl)
row.ids <- sapply(slot(b.spolys, "polygons"), function(i) slot(i, "ID"))    
b.exploded <- SpatialPolygonsDataFrame(b.spolys, data.frame(FID=as.numeric(row.ids))) 

ফলাফল স্বরূপ:

over(pts, b.exploded)

#   FID
# 1   2
# 2   2
# 3   2
# 4   1

যা প্রত্যাশিত ফলাফল (পলি অর্ডার সম্পর্কে আমি খুব বেশি হতাশ হইনি - 2,2,2,1বনাম 1,1,1,2), তবে b.explodedগর্ত সম্পর্কে তথ্য হারিয়ে ফেলেছি, পরিবর্তে এটি একটি নন-হোল বহুভুজ হিসাবে প্রতিনিধিত্ব করে। এটি স্পষ্টতই খেলনা উদাহরণের ফলাফলটিকে প্রভাবিত করে না, তবে গর্তে অবস্থিত পয়েন্টগুলিতে জড়িত একটি ওভারলে বিভ্রান্তিকর হবে, উদাহরণস্বরূপ:

in_hole <- SpatialPoints(cbind(1.375, 1.5))
over(in_hole, b.exploded)
#   FID
# 1   2

উত্তর:


7

এটি দেখা যাচ্ছে যে sp::disaggregateএকক পার্ট বহুভুজ আলাদা করতে ব্যবহার করা যেতে পারে।

pts <- SpatialPoints(cbind(c(1, 1, 2, 3), c(1, 2, 1.5, 2.5))) 
b <- gBuffer(pts, width=0.6) 
over(pts, disaggregate(b))

# [1] 1 1 1 2

in_hole <- SpatialPoints(cbind(1.375, 1.5))
over(in_hole, disaggregate(b))

# [1] NA

( raster::aggregateএগুলি আবার একত্রিত করতে ব্যবহৃত হতে পারে))


3

আমি সহানুভূতিশীল, এটি একটি ব্যথা কিছুটা। আপনাকে জিবাফার বহুভুজ অবজেক্টের স্লটগুলি পৃথক বহুভুতে বিস্ফোরিত করতে হবে।

require(sp)
require(rgeos)
pts <- SpatialPoints(cbind(c(1, 1, 3), c(1, 2, 3))) 

b <- gBuffer(pts, width=0.6)

over(pts, b)

###########################################################
# explodes slots into individual polygons
polys <- b@polygons[[1]]@Polygons
  pl <- vector("list", length(polys))
    for (i in 1:length(polys)) { pl[i] <- Polygons(list(polys[[i]]), i) }
      b.spolys <- SpatialPolygons(pl)
        row.ids=sapply(slot(b.spolys, "polygons"), function(i) slot(i, "ID"))    
b <- SpatialPolygonsDataFrame(b.spolys, data.frame(FID=as.numeric(row.ids)) ) 
###########################################################

over(pts, b)

সবেমাত্র পরীক্ষা করেছেন এবং এটি আশাব্যঞ্জক বলে মনে হচ্ছে তবে আমার গর্তগুলি এখন আর গর্ত নয় :(। তারা যে পোলের সাথে যুক্ত সেগুলি দিয়ে গর্তগুলি একত্রে রাখার জন্য আমরা কী এটিকে মানিয়ে নিতে পারি? (আমি আপনার পরামর্শের হিসাবে অনুরূপ লাইন বরাবর, সঙ্গে শিরোনাম ছিল n <- length(buff@polygons[[1]]@Polygons); SpatialPolygons(mapply(function(x, y) Polygons(list(x), y), buff@polygons[[1]]@Polygons, seq_len(n))), দুঃখিত ... আমি পোস্টে গর্ত সমস্যা উল্লেখ করা উচিত।
jbaums
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.