আমি একটি পরিবেশগত মহামারী প্রকল্পে কাজ করছি যেখানে আমার পয়েন্ট এক্সপোজার রয়েছে (~ 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?