আরে বাউন্ডিং বাক্সে স্থানিক বস্তুটি ক্লিপ করুন


14

আর-তে একটি স্পেসিয়াল অবজেক্ট দেওয়া, আমি কীভাবে এর সমস্ত উপাদানগুলিকে একটি বাউন্ডিং বাক্সের মধ্যে শুয়ে ক্লিপ করব?

দুটি করণীয় আমি করতে চাই (আদর্শভাবে আমি উভয় কীভাবে করতে হবে তা জানতাম, তবে তা হয় আমার বর্তমান সমস্যার একটি গ্রহণযোগ্য সমাধান - মহাদেশীয় মার্কিন যুক্তরাষ্ট্রে বহুভুজ শেফফিলকে সীমাবদ্ধ করে রাখা)।

  1. বাউন্ডিং বাক্সের মধ্যে সম্পূর্ণরূপে নয় প্রতিটি উপাদান ফেলে দিন। এটি মনে হচ্ছে bbox()<-যৌক্তিক উপায়ে হবে তবে এ জাতীয় কোনও পদ্ধতি বিদ্যমান নেই।

  2. সত্যিকারের ক্লিপ অপারেশন করুন, যেমন সীমারেখা ছাড়াই অ-অসীম উপাদান (যেমন বহুভুজ, লাইন) কেটে দেওয়া হয়sp::bboxএকটি অ্যাসাইনমেন্ট পদ্ধতির অভাব রয়েছে, সুতরাং আমি যে একমাত্র উপায় নিয়ে এসেছি তা হ'ল নতুন বাউন্ডিং বাক্সের স্থানাঙ্কের সাথে একটি বাক্সযুক্ত একটি স্প্যাটিয়ালপলিকনস অবজেক্ট ব্যবহার করা overবা gContains/ gCrossesএর সাথে একত্রে। তারপরে বহুভুজ বস্তুটি ক্লিপ করার সময়, আপনাকে কোনটি বনাম ক্রস রয়েছে তা সনাক্ত করতে হবে এবং সেই বহুভুজগুলির স্থানাঙ্কগুলি পরিবর্তন করতে হবে যাতে তারা বাক্সটি অতিক্রম না করে। বা কিছু gIntersection। তবে নিশ্চয়ই একটি সহজ উপায় আছে?

যদিও আমি জানি যে বাউন্ডিং বাক্সগুলির সাথে অনেকগুলি সমস্যা রয়েছে , এবং যে বহুভুজের আগ্রহের অঞ্চলটিকে সংজ্ঞায়িত করে এমন একটি স্থানিক ওভারলে সাধারণত পছন্দনীয়, অনেক পরিস্থিতিতে বাউন্ডিং বাক্সগুলি সূক্ষ্মভাবে কাজ করে এবং আরও সহজ।


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

@ স্পিডম্যান স্পষ্ট করে বলেছিলেন যে আমি উভয়ের মধ্যেই আগ্রহী কিন্তু সহজ সংস্করণটি বর্তমান প্রশ্নের পক্ষে যথেষ্ট।
এরি বি ফ্রেডম্যান

আপনি ইতিমধ্যে rgeos ব্যবহার করে (2) এর সমাধানটি কার্যকর করেছেন? মনে হচ্ছে আপনি কমপক্ষে চেষ্টা করেছেন। আপনি কি আমাদের সেই সমাধান এবং একটি উদাহরণ দিতে পারেন তাই কমপক্ষে আমাদের 'সরলতার' সাথে তুলনা করার মতো কিছু আছে? কারণ, সত্যি বলতে, এটি বেশ সহজ বলে মনে হচ্ছে।
স্পেসডম্যান

@ স্পিডম্যান সব কিছুরই সহজ; সময় লাগে মাত্র .... :-) আমি এটি দিয়ে চেষ্টা করেছিলাম gIntersectionএবং Error in RGEOSBinTopoFunc(spgeom1, spgeom2, byid, id, "rgeos_intersection") : TopologyException: no outgoing dirEdge found at 3 2.5 আজই ডিবাগ করার সময় নেই; একটি ম্লান সংস্করণ লিখেছেন এবং ভবিষ্যতে ঠিক হয়ে যাবে।
এরি বি ফ্রেডম্যান

উত্তর:


11

আমি এই উদ্দেশ্যে খুব ছোট একটি ফাংশন তৈরি করেছি এবং এটি অন্যরা ভাল পর্যালোচনা সহ ব্যবহার করেছেন!

gClip <- function(shp, bb){
  if(class(bb) == "matrix") b_poly <- as(extent(as.vector(t(bb))), "SpatialPolygons")
  else b_poly <- as(extent(bb), "SpatialPolygons")
  gIntersection(shp, b_poly, byid = TRUE)
}

এটা আপনার সমস্যা সমাধান করবে. আরও ব্যাখ্যা এখানে: http://robinlovelays.net/r/2014/07/29/clipping-with-r.html

b_polyতৈরি করা ডামি বহুভুজের কোনও প্রজ 4 স্ট্রিং নেই, যার ফলস্বরূপ " সতর্কতা: স্পিজোম 1 এবং স্পিজোম 2 এর পৃথক প্রজ 4 স্ট্রিং রয়েছে ", তবে এটি নির্দোষ নয়।


আমি করেছি sp, maptools, rgdal, এবং rgeosলোড করা হয়নি। আমি কি Error in .class1(object) : could not find function "extent"আর / প্যাকেজ সংস্করণ ইস্যু পেতে পারি ?
গ্রেগম্যাকফার্লেনে

library(raster)আমার টিউটোরিয়ালে লাইনটি নোট করুন : রবিনলভলেস.নেট / r / 2014/07/29 / ক্লিপিং-উইথ-আরআর এইচটিএমএল আপনি কীভাবে যাবেন তা আমাদের জানান! চিয়ার্স।
রবিনলোলেস

এটি আমার জন্য একটি সতর্কতা বার্তা দেয়: স্পিজোম 1 এবং স্পিজোম 2 এর বিভিন্ন প্রজ 4 স্ট্রিং রয়েছে। প্রোজ 4 স্ট্রিং (বি_পলি) যুক্ত করা <- প্রজ 4 স্ট্রিং (shp) এর সমাধান করা উচিত?
মাতিফু

7

এখানে একটি opিপি সীমানা সংস্করণ (আগামীকাল মিনি-শেষের সময়কালের জন্য আমার প্রয়োজনগুলি পূরণ করার জন্য যথেষ্ট :-)):

#' Convert a bounding box to a SpatialPolygons object
#' Bounding box is first created (in lat/lon) then projected if specified
#' @param bbox Bounding box: a 2x2 numerical matrix of lat/lon coordinates
#' @param proj4stringFrom Projection string for the current bbox coordinates (defaults to lat/lon, WGS84)
#' @param proj4stringTo Projection string, or NULL to not project
#' @seealso \code{\link{clipToExtent}} which uses the output of this to clip to a bounding box
#' @return A SpatialPolygons object of the bounding box
#' @example 
#' bb <- matrix(c(3,2,5,4),nrow=2)
#' rownames(bb) <- c("lon","lat")
#' colnames(bb) <- c('min','max')
as.SpatialPolygons.bbox <- function( bbox, proj4stringFrom=CRS("+proj=longlat +datum=WGS84"), proj4stringTo=NULL ) {
  # Create unprojected bbox as spatial object
  bboxMat <- rbind( c(bbox['lon','min'],bbox['lat','min']), c(bbox['lon','min'],bbox['lat','max']), c(bbox['lon','max'],bbox['lat','max']), c(bbox['lon','max'],bbox['lat','min']), c(bbox['lon','min'],bbox['lat','min']) ) # clockwise, 5 points to close it
  bboxSP <- SpatialPolygons( list(Polygons(list(Polygon(bboxMat)),"bbox")), proj4string=proj4stringFrom  )
  if(!is.null(proj4stringTo)) {
    bboxSP <- spTransform( bboxSP, proj4stringTo )
  }
  bboxSP
}


#' Restrict to extent of a polygon
#' Currently does the sloppy thing and returns any object that has any area inside the extent polygon
#' @param sp Spatial object
#' @param extent a SpatialPolygons object - any part of sp not within a polygon will be discarded
#' @seealso \code{\link{as.SpatialPolygons.bbox}} to create a SP from a bbox
#' @return A spatial object of the same type
#' @example
#' set.seed(1)
#' P4S.latlon <- CRS("+proj=longlat +datum=WGS84")
#' ply <- SpatialPolygons(list(Polygons(list(Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))), "s1"),Polygons(list(Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))), "s2")), proj4string=P4S.latlon)
#' pnt <- SpatialPoints( matrix(rnorm(100),ncol=2)+2, proj4string=P4S.latlon )
#' # Make bounding box as Spatial Polygon
#' bb <- matrix(c(3,2,5,4),nrow=2)
#' rownames(bb) <- c("lon","lat")
#' colnames(bb) <- c('min','max')
#' bbSP <- as.SpatialPolygons.bbox(bb, proj4stringTo=P4S.latlon )
#' # Clip to extent
#' plyClip <- clipToExtent( ply, bbSP )
#' pntClip <- clipToExtent( pnt, bbSP )
#' # Plot
#' plot( ply )
#' plot( pnt, add=TRUE )
#' plot( bbSP, add=TRUE, border="blue" )
#' plot( plyClip, add=TRUE, border="red")
#' plot( pntClip, add=TRUE, col="red", pch="o")
clipToExtent <- function( sp, extent ) {
    require(rgeos)
    keep <- gContains( extent, sp,byid=TRUE ) | gOverlaps( extent, sp,byid=TRUE )
    stopifnot( ncol(keep)==1 )
    sp[drop(keep),]
}

বক্স ক্লিপিং

যদি আপনার প্রজেক্টের জন্য বাউন্ডিং বাক্সের প্রয়োজন হয় তবে সংস্করণটি এখানে একটি interpolateযুক্তি যুক্ত করে, ফলে ফলাফলযুক্ত বাক্সটি বাঁকা হয়।

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