R'de ters kırpma (silme)?


15

Ters klip, uzamsal nesnenizin , diğer nesnenin içindeki parçaları kaydeden normal bir klibin aksine, yalnızca başka bir nesnenin sınırları dışında kalan kısmını kaydeder .

ArcMap'te ters klip mi yapıyorsunuz? ArcMap'te nasıl yapılacağını gösterir.

Bunu R'de nasıl yapabilirim?

Tekrarlanabilir örnek (Linux makinelerde):

system("wget 'https://github.com/Robinlovelace/Creating-maps-in-R/archive/master.zip' -P /tmp/")
unzip("/tmp/master.zip", exdir = "/tmp/master")
uk <- readOGR("/tmp/master/Creating-maps-in-R-master/data/", "ukbord")
lnd <- readOGR("/tmp/master/Creating-maps-in-R-master/data/", "LondonBoroughs")
plot(uk)
plot(lnd, add = T, col = "black")

Burada yapmak istediğim şey Londra hariç tüm İngiltere'yi kurtarmak . Görsel olarak, ortaya çıkan görüntüdeki siyah şeklin bir delik olmasını istiyorum.

resim açıklamasını buraya girin

Yanıtlar:


5

Basit Özellikler için Cevap:

sf paketi Geometry Engine Açık Kaynaktan yararlanır ve böylece st_within vb. gibi komutlar listesine erişebilir.

Böyle bir komut, st_difference işi yapar:

require(sf)

# make a square simple feature
s <- rbind(c(1,1), c(1,5), c(5,5), c(5,1), c(1,1))
s.sf <-st_sfc(st_polygon(list(s)))
s.pol = st_sf(ID = "sq", s.sf)

# make a smaller triangle simple feature
s2 <- rbind(c(2,2), c(3,4), c(4,2), c(2,2))
s2.sf <-st_sfc(st_polygon(list(s2)))
s2.pol = st_sf(ID = "tr", s2.sf)

# find the 'difference', i.e. reverse of st_intersection
t <- st_difference(s.pol,s2.pol)

plot(t)

# have a look at the new geometry, a well known text format with exterior followed by hole
st_geometry(t)[[1]]
POLYGON((1 1, 1 5, 5 5, 5 1, 1 1), (2 2, 4 2, 3 4, 2 2))

ayrıca bu makalenin sonuna doğru bakın

Sp'yi sf'ye st_as_sf ile zorlayarak da yapılabilir. Nitelikleri yönetmek zor olabileceğinden uyarıları dikkate alın!


13

Basit bir uygulama gibi görünüyor gDifferencedan rgeospaketin:

> require(rgeos)
> ukhole = gDifference(uk, lnd)
Warning message:
In RGEOSBinTopoFunc(spgeom1, spgeom2, byid, id, "rgeos_difference") :
  spgeom1 and spgeom2 have different proj4 strings
> plot(ukhole)

Yansıtma uyarısı, LondonBoroughsşekil .prjdosyasının bir dosyaya sahip olmamasıdır .

Bunun bir anahat veya başka bir katı çokgen değil, bir delik olduğundan emin olmak için:

> gArea(lnd) + gArea(ukhole) - gArea(uk)
[1] 0

Çok basit, hızlı yanıt için teşekkürler. Kaputun altında neler olup bittiğini görmek için bu işlevlerin kaynak koduna bakmak isterdim.
RobinLovelace

Derinlemesine sadece geometri fonksiyonlarının bir C kodu kütüphanesi olan GEOS adını veriyorlar trac.osgeo.org/geos
Spacedman

İlginç - ve sanırım neden hızlı olduğunu açıklamaya yardımcı oluyor. Bu sayfaya dayanarak, aktif olarak geliştirilmiyor gibi görünüyor herkes bunu onaylayabilir / reddedebilir mi? svn.osgeo.org/geos/branches/3.4/ChangeLog
RobinLovelace

1
Elbette geliştirildi. Zaman çizelgesine bakın trac.osgeo.org/geos/timeline veya posta listesi arşivleri lists.osgeo.org/pipermail/geos-devel
user30184

5

Partiye biraz geç, ama bunu 'ters' argümanını kullanarak maske ile yapmanın basit bir yolu var;

ukhole <- mask(uk, lnd, inverse = TRUE)

Raster paketinden. Ve sf'den herhangi bir fikir?
RobinLovelace
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.