R'deki basit özellikler nesnesini kırp


20

maptools::pruneMap(lines, xlim= c(4, 10), ylim= c(10, 15))SpatialPolygon veya SpatialLine için kullanılana benzer bir harita nesnesi kırpmak için bir işlev var mı ?

Düşünüyorum st_intersection()ama uygun bir yol olabilir.

Yanıtlar:


17

st_intersectionmuhtemelen en iyi yoldur. Bir sfnesnenin girdinizle kesişmesini sağlamak için en iyi yolu bulun . İşte raster::extenteski ve yeninin rahatlığını ve bir karışımını kullanmanın bir yolu . nctarafından oluşturuldu example(st_read):

st_intersection(nc, st_set_crs(st_as_sf(as(raster::extent(-82, -80, 35, 36), "SpatialPolygons")), st_crs(nc)))

st_intersectionTam eşleşen bir CRS'ye ihtiyaç duymayacağınızı sanmıyorum , bu yüzden ikisini de NA olarak ayarlayın veya aynı olduklarından emin olun. Bbox / ölçüde afaik için kolay bir araç yoktur, bu nedenle raster kullanmak işleri kolaylaştırmak için iyi bir yoldur.


Çok teşekkürler mdsumner, bir cazibe gibi çalıştı. Saatler geçirdim st_intersectionama kendim çözemedim.
17'de Kazuhito

Artık aramayı spex::spexdeğiştirmek için kullanabilirsiniz st_as_sf(as(...)). Ayrıca, tmaptools::crop_shape()bunu yapabilir.
AF7

1
sfşimdi, st_cropayrıntılar için cevabım bakın.
AF7

23

Bugünden berist_crop , github versiyonunda bir fonksiyon var sf( devtools::install_github("r-spatial/sf")muhtemelen yakın gelecekte CRAN'da da).

Sadece sorun:

st_crop(nc, c(xmin=-82, xmax=-80, ymin=35, ymax=36))

Vektör gerekir ile adlandırılabilir xmin xmax ymin ymax(hangisi sırayla).

st_bboxKırpma sınırları olarak okunabilen herhangi bir nesneyi de kullanabilirsiniz , bu da çok kullanışlıdır.


5

Başka bir çözüm, benim için daha büyük şekil dosyaları için daha hızlıydı:

library(sf)
library(raster)
library(rgeos)
library(ggplot2)

# Load National Forest shapefile
# https://data.fs.usda.gov/geodata/edw/edw_resources/shp/S_USA.AdministrativeForest.zip
nf.poly <- st_read("S_USA.AdministrativeForest"), "S_USA.AdministrativeForest")

crop_custom <- function(poly.sf) {
  poly.sp <- as(poly.sf, "Spatial")
  poly.sp.crop <- crop(poly.sp, extent(c(-82, -80, 35, 36)))
  st_as_sf(poly.sp.crop)
}

cropped <- crop_custom(nf.poly)

Teşekkürler. Bu ilginç bir iş akışı, raster :: crop () ve st_as_sf () ... + 1'in birleşimi. Keşke sf'nin gelecekteki sürümlerinde crop () gibi kolayca erişilebilir bir işleve sahip olabilseydik . Hız ile ilgili olarak , sisteminizle ilgili hızlı bir çalışma. Raporlanan kullanıcı: 5.42, sistem: 0.09, 5.52'yi geçti , st_intersection()yaklaşım kullanıcı: 1.18, sistem: 0.05, veri kümenizde 1.23'ü geçti . (Muhtemelen
ortamım

Bu ilginç - st_intersection yaklaşımı benim için 80s sürüyor.
pbaylis

Raster :: kırpma işlevinin, sp geometri nesnelerine uygulandığında, rgeos işlevleri için bir sargı işlevi gördüğünü unutmayın. Gerçi, çok uygun bir ambalaj. GEOS API, WKT nesneleri üzerinde çalışır, bu nedenle her zaman sf yer paylaşımı işlemleri için bir standart olacaktır.
Jeffrey Evans

1
Ve zamanla değişir, sf şimdi 0.5-1 cran.r-project.org/web/packages/sf/news.html'de yerleşik "mekansal indeksleme" ye sahiptir, bu yüzden muhtemelen sp / rgeos'dan daha hızlıdır.
mdsumner

1
sfşimdi, st_cropayrıntılar için cevabım bakın.
AF7

1

@ mdsumner'ın bir işlevi olarak çözümü. Works eğer rastabir RasterBrick, kapsamı, BBOX vb

# Crop a Simple Features Data Frame to the extent of a raster
crop.sf = function(sfdf, rasta) {
  st_intersection(sfdf, st_set_crs(st_as_sf(as(extent(rasta), "SpatialPolygons")), st_crs(sfdf)))
}

Raster crs bilgilerini atar çünkü raster crs () st_crs () dönüştürmek nasıl bilmiyorum

raster::cropMakinemde ve veri örneğimde bu, verilerin bir SpatialLinesDataFrame sürümüyle eşdeğer performansa sahiptir .

@ pbaylis'in çözümü yaklaşık 2,5 kat daha yavaştır:

# Slower option.
crop.sf2 = function(sfdf, rasta) {
  st_as_sf(crop(as(sfdf, "Spatial"), rasta))
}

Düzenleme: Somebodies comment anlaşılacağı Spex bir CR'leri varsa, rasta gelen crs ile SpatialPolygons üretir.

Bu kod spex ile aynı yöntemi kullanır:

# Crop a Simple Features Data Frame to the extent of a raster
crop.sf3 <- function(sfdf, rasta) {
  # Get extent and crs
  ext.sp <- as(extent(rasta), "SpatialPolygons")
  crs(ext.sp) <- crs(rasta)

  # crop
  st_intersection(sfdf, st_as_sf(ext.sp))
}

sf şimdi st_cropmuhtemelen kontrol edilmeye değer bir işleve sahiptir.
cmc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.