যে বহুভুজের মধ্যে পয়েন্টের সেট পড়েছে তা সনাক্ত করতে আমি একটি স্থানিক ওভারলে সম্পাদন করতে চাই। তবে আমি প্রথমে বহুভুজকে বাফার এবং দ্রবীভূত করতে চাই, যেমন মার্জ করা বহুভুজের মধ্যে যে কোনও জায়গায় পড়ার পয়েন্টগুলি (তবে কোনও গর্তের মধ্যে নয়) ওভারলে পদ্ধতি দ্বারা একইভাবে লেবেল করা হবে।
দুর্ভাগ্যক্রমে, আমি যে বাফারিং এবং / বা দ্রবীভূতকরণ প্রক্রিয়াটি ব্যবহার করছি তা 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
:(
। তারা যে পোলের সাথে যুক্ত সেগুলি দিয়ে গর্তগুলি একত্রে রাখার জন্য আমরা কী এটিকে মানিয়ে নিতে পারি? (আমি আপনার পরামর্শের হিসাবে অনুরূপ লাইন বরাবর, সঙ্গে শিরোনাম ছিলn <- length(buff@polygons[[1]]@Polygons); SpatialPolygons(mapply(function(x, y) Polygons(list(x), y), buff@polygons[[1]]@Polygons, seq_len(n)))
, দুঃখিত ... আমি পোস্টে গর্ত সমস্যা উল্লেখ করা উচিত।