আর-তে বহুগুণ বহুগুণ%% বহুভুজের সাথে কীভাবে কাজ করে?


12

আমি একটি পরিবেশগত মহামারী প্রকল্পে কাজ করছি যেখানে আমার পয়েন্ট এক্সপোজার রয়েছে (~ 2,000 শিল্প হগ অপারেশনস - আইএইচওস)। এই আইএইচওগুলি নিকটস্থ জমিতে স্প্রে করে, তবে মলদ্বারের জলের ফোটা এবং গন্ধ মাইলগুলি ভ্রমণ করতে পারে। সুতরাং এই পয়েন্ট এক্সপোজারগুলি 3 ম বাফার পেয়েছে এবং আমি এনসি আদমশুমারি ব্লকে প্রতি আইএইচও এক্সপোজারের সংখ্যা জানতে চাই (বিভিন্ন ধরণের - সারের পরিমাণ, হোগের সংখ্যা, যাই হোক না কেন; সর্বাধিক সহজ, কেবল ওভারল্যাপিং এক্সপোজার বাফার সংখ্যা) (~ 200,000)। বহিরাগত আদমশুমারির ব্লক (নীল) হ'ল শীর্ষস্থানীয় ৫ টি জনবহুল শহরগুলির মধ্যে কিছু এবং (২) যে কাউন্টিগুলিতে কোনও আইএইচও এর সীমানা নেই তারা (দ্রষ্টব্য: এটি জিআরলেট ফাংশন এবং ডিই -9 আইএম কোড দিয়ে করা হয়েছিল - খুব চতুর!)। একটি চাক্ষুষ জন্য নীচের চিত্র দেখুন

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

শেষ পদক্ষেপটি প্রতিটি শুমারি ব্লকে বাফার এক্সপোজার প্রতিনিধিত্বকে একত্রিত করা। আমি যেখানে স্টম্পড আছি তা এখানে।

আমি এখনও পর্যন্ত এসপি প্যাকেজে% ওভার% ফাংশনের সাথে ভাল সময় কাটিয়েছি, তবে ওভার ভিগনেট থেকে বুঝতে পারি যে পলি-পলি এবং পলি-লাইন ওভারটি rgeos এ প্রয়োগ করা হয়েছে। উইগনেটটি কেবল লাইন-পলি এবং স্ব-রেফারেন্সিং পলি জুড়ে থাকে এবং একীকরণের সাথে নয়, তাই ফাংশন একীকরণের সাথে পলি-পলির জন্য আমার বিকল্পগুলি কিসের যোগফল বা গড়ের মতো তা নিয়ে আমি কিছুটা বিভ্রান্ত।

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

প্রথমে, আমরা 100 পয়েন্ট তৈরি করি, তারপরে ডাটা ফ্রেমে উপাদান যুক্ত করতে fn যুক্তি দিয়ে ওভার ফাংশনটি ব্যবহার করি। এখানে অনেকগুলি পয়েন্ট রয়েছে তবে অস্ট্রেলিয়াকে একবার দেখুন: 3 পয়েন্ট, 3 নম্বর লেবেল হিসাবে। এ পর্যন্ত সব ঠিকই.

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

এখন আমরা জ্যামিতিগুলিকে রূপান্তর করি যাতে আমরা বাফারগুলি তৈরি করতে পারি, ফিরে রূপান্তর করতে পারি এবং সেই বাফারগুলি ম্যাপ করতে পারি। (পূর্ববর্তী মানচিত্রে অন্তর্ভুক্ত, যেহেতু আমি দুটি লিঙ্কের মধ্যে সীমাবদ্ধ)) আমরা জানতে চাই যে প্রতিটি দেশ কয়টি বাফারকে ওভারল্যাপ করে Australia অস্ট্রেলিয়ার ক্ষেত্রে, চোখের সামনে 4. ওভার ফাংশন সঙ্গে পেতে যদিও। কোডের চূড়ান্ত লাইনগুলিতে আমার একটি প্রচেষ্টা সম্পর্কে জগাখিচুড়ি দেখুন।

সম্পাদনা: দ্রষ্টব্য যে আর-সিএস-জিওর একজন মন্তব্যকারী মোট ফাংশনটির উল্লেখ করেছেন - এটি স্ট্যাক এক্সচেঞ্জ প্রশ্ন 63577-এও উল্লেখ করা হয়েছে - সুতরাং প্রায় / প্রবাহের কাজ সেই ফাংশনটির মধ্য দিয়ে থাকতে পারে তবে আমি কেন বুঝতে পারছি না যে আমাকে কেন যেতে হবে? পলিপলির জন্য সামগ্রিকভাবে যখন অন্যান্য স্থানিক সামগ্রীর জন্য সেই কার্যকারিতাটি মনে হয়।

require(maptools)
require(sp)
require(rgdal)
require(rgeos)

download.file("http://thematicmapping.org/downloads/TM_WORLD_BORDERS_SIMPL-0.3.zip", destfile="world.zip")
unzip("world.zip")
world.map = readOGR(dsn=".", "TM_WORLD_BORDERS_SIMPL-0.3", stringsAsFactors = F)
orig.world.map = world.map #hold the object, since I'm going to mess with it.

#Let's create 500 random lat/long points with a single value in the data frame: the number 1
set.seed(1)
n=100
lat.v = runif(n, -90, 90)
lon.v = runif(n, -180, 180)
coords.df = data.frame(lon.v, lat.v)
val.v = data.frame(rep(1,n))
names(val.v) = c("val")
names(coords.df) = c("lon", "lat")
points.spdf = SpatialPointsDataFrame(coords=coords.df, proj4string=CRS("+proj=longlat +datum=WGS84"), data=val.v)
points.spdf = spTransform(points.spdf, CRS(proj4string(world.map)))
plot(world.map, main="World map and points") #replot the map
plot(points.spdf, col="red", pch=20, cex=1, add=T) #...and add points.

#Let's use over with the point data
join.df = over(geometry(world.map), points.spdf,  fn=sum)
plot(world.map, main="World with sum of points, 750mi buffers") #Note - happens to be the count of points, but only b/c val=1.
plot(points.spdf, col="red", pch=20, cex=1, add=T) #...and add points.
world.map@data = data.frame(c(world.map@data, join.df))
#world.map@data = data.frame(c(world.map@data, over(world.map, points.spdf, fun="sum")))
invisible(text(getSpPPolygonsLabptSlots(world.map), labels=as.character(world.map$val), cex=1))
#Note I don't love making labels like above, and am open to better ways... plus I think it's deprecated/ing

#Now buffer...
pointbuff.spdf = gBuffer(spTransform(points.spdf, CRS("+init=EPSG:3358")), width=c(750*1609.344), byid=T)
pointbuff.spdf = spTransform(pointbuff.spdf, world.map@proj4string)
plot(pointbuff.spdf, col=NA, border="pink", add=T)



#Now over with the buffer (poly %over% poly).  How do I do this?
world.map = orig.world.map
join.df = data.frame(unname(over(geometry(world.map), pointbuff.spdf, fn=sum, returnList = F)) ) #Seems I need to unname this...?
names(join.df) = c("val")
world.map@data = data.frame(c(world.map@data, join.df)) #If I don't mess with the join.df, world.map's df is a mess..
plot(world.map, main="World map, points, buffers...and a mess of wrong counts") #replot the map
plot(points.spdf, col="red", pch=20, cex=1, add=T) #...and add points.
plot(pointbuff.spdf, col=NA, border="pink", add=T)
invisible(text(getSpPPolygonsLabptSlots(world.map), labels=as.character(world.map$val), cex=1)) 
#^ But if I do strip it of labels, it seems to be misassigning the results?
# Australia should now show 4 instead of 3.  I'm obviously super confused, probably about the structure of over poly-poly returns.  Help?

পুনঃনির্দেশের প্রশংসা করুন - আমি কি এখান থেকে মুছে ফেলা এবং সেখানে আবার পোস্ট করতে পারি? সেরা চাল কি? ধন্যবাদ।
মাইক ডোলান ফ্লিস

উত্তর:


5

সুস্পষ্ট প্রশ্ন এবং পুনরুত্পাদনযোগ্য উদাহরণের জন্য ধন্যবাদ।

আপনার বোঝাপড়াটি সঠিক, এবং এটি rgeos :: ওভারের বাগে ফোটে, যা এক মাস আগে ঠিক করা হয়েছিল তবে এখনও এটি CRAN রিলিজ হিসাবে রূপান্তরিত করে নি। আপনি যদি কেবল চৌরাস্তার সংখ্যায় আগ্রহী হন:

world.map$val = sapply(over(geometry(world.map), pointbuff.spdf, returnList = TRUE), NROW)

আমি NROWপরিবর্তে এখানে ব্যবহার করছি lengthযাতে এটি ভুল rgeos (0.3-8, CRAN থেকে) পাশাপাশি সংশোধিত (0.3-10, r-forge থেকে) এর সাথে কাজ করে। ব্যবহার করার আগের পরামর্শ

a = aggregate(pointbuff.spdf, world.map, sum)

ছেদগুলির সংখ্যাও গণনা করে তবে কেবল স্থির rgeos সংস্করণ ইনস্টল করা থাকে। আরও স্বজ্ঞাত নামের পাশাপাশি এর সুবিধাটি হ'ল এটি Spatialজ্যামিতির সাথে সরাসরি কোনও বস্তু ফেরত দেয় world.map

Rgeos 0.3-8 কাজ করতে, যোগ করুন

setMethod("over",
    signature(x = "SpatialPolygons", y = "SpatialPolygonsDataFrame"),
        rgeos:::overGeomGeomDF)

আপনার স্ক্রিপ্টে, আপনি ব্যবহার করার আগে over


খুব সহায়ক, আপনাকে ধন্যবাদ। আমি বিশেষত আপনার প্রস্তাবটি প্রাক-এবং পোস্ট-ফিক্সের সাথে কাজ করে এমন একটি সমাধান উদযাপন করতে চাই। আপনি কি এটিকে বিশদভাবে জানাতে চাইবেন: (১) আমি যে বাগটি এখানে আঘাত করছি তা কি হল: ওভার একটি স্থানিক বহুভুগোলের ভূগোল ফিরিয়ে দিচ্ছে, একটি স্থানিক পলি ডেটা ফ্রেম নয়? কিছু ফাংশন কেবল ডেটা ফ্রেম ফেরায় না ...? (২) সাধারণত এটি কীভাবে সামগ্রিক ও ততোধিক কাজ করে? তাদের উদ্দেশ্যযুক্ত পার্থক্য এবং ব্যবহারের ক্ষেত্রে আমি কিছুটা বিভ্রান্ত। সত্যিই আপনার ভারী প্রশংসা, আপনাকে ধন্যবাদ। এবং সাইডেনোট: সিআরএএন রিলিজ চক্র বোঝার জন্য কোনও পরামর্শ?
মাইক ডোলান ফ্লিস

এছাড়াও, আসল প্রশ্ন হিসাবে: আমার এক্সপোজারগুলির সংখ্যা গণনা করা দরকার, তবে আমার সত্যিই সেগুলিও যোগ করতে হবে - প্রতিটি এক্সপোজারে হোগের সংখ্যার মতো জিনিস। ওভারল্যাপগুলি গণনা করা একটি শুরু ... তবে আমার কাছে যে সমাধানটি প্রয়োজন তা সর্বাধিক নতুন rgeos টানতে হবে বলে মনে হচ্ছে, হ্যাঁ? এটি ছাড়া কার্যকরী একীকরণের কোনও উপায় (কেবল গণনা নয়)?
মাইক ডোলান ফ্লাইস

(1) rgeos :: স্বাক্ষরের জন্য ওভারের SpatialPolygons,SpatialPolygonsDataFrameএকটি ফেরত দেওয়া উচিত data.frame, তবে কখন yযে সূত্রের মতো একটি সূচক ভেক্টরকে ফেরত দেওয়া উচিত SpatialPolygonssp::aggregateআপনি আরও বেশি ব্যবহারকারী-বান্ধব উপায়ে Spatialযা করেন তার পরিবর্তে অবজেক্টটি ফিরিয়ে দেন data.frame। CRAN প্যাকেজগুলি স্বেচ্ছাসেবীদের দ্বারা পরিচালিত হয়।
এডজার পেবেসমা

ঠিক আছে, ধন্যবাদ এডজার এটি সামগ্রিকভাবে Rgeos উপর নির্ভর করে বলে মনে হচ্ছে, তাই CRAN রিলিজ চক্রের আগে এই কার্যকারিতাটি পাওয়ার জন্য (যখনই হোক), আমাকে কীভাবে নতুনতম rgeos ডাউনলোড করবেন এবং সেগুলি থেকে কীভাবে কাজ করবেন তা খুঁজে বের করতে হবে। ধন্যবাদ. এবং প্যাকেজে আপনার সমস্ত কাজের জন্য ধন্যবাদ !!
মাইক ডোলান ফ্লিস

এছাড়াও, এডজার, আর-সিস-জিওতে নোটের জন্য অনেক ধন্যবাদ। পোস্ট করার চেয়ে ভাল জায়গাটি কোথায় ছিল তা নিশ্চিত ছিল না, তাই আমি খুশী যে থ্রেডটি এখানে এখানে নির্দেশ করেছে।
মাইক ডোলান ফ্লিস

1

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

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

সম্পাদনা স্বাগত:

overhelper <- function(pol, pol.df, fn=sum, verbose=F){
   if(verbose) {cat("Building over geometry...\n"); t=Sys.time(); t}
   geolist = over(geometry(pol), pol.df, returnList = T)
   if(verbose) {cat("Geometry done. Aggregating df. \n"); Sys.time()-t;t=Sys.time();t;}
   results = data.frame(matrix(0,nrow=length(pol), ncol=ncol(pol.df)))
   names(results) = names(pol.df)
   end = length(geolist)

   for (i in 1:end){
     if(verbose) cat(i, "...")
     results[i,] = sapply(pol.df@data[unlist(geolist[i]),], fn)
   }
   if(verbose) cat("Aggregation done! (", Sys.time()-t, ") \n Returning result vector.")
   return (results)
}

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