TopolojiException: geom 1 girişi geçersiz; bu, R'deki kendi kendine kesişme nedeniyle mi?


24

'TopologyException: Giriş geom 1 geçersiz' geçersiz poligon geometrilerinden kaynaklanan kendi kesişme hatası yaygın olarak tartışıldı. Ancak, web üzerinde yalnızca R işlevselliğine dayanan uygun bir çözüm bulamadım.

Mesela, map("state", ...)Josh O'Brien'ın buradaki güzel cevabını takip etmenin sonucundan bir 'SpatialPolygons' nesnesi yaratmayı başardım .

library(maps)
library(maptools)

map_states = map("state", fill = TRUE, plot = FALSE)

IDs = sapply(strsplit(map_states$names, ":"), "[[", 1)
spydf_states = map2SpatialPolygons(map_states, IDs = IDs, proj4string = CRS("+init=epsg:4326"))

plot(spydf_states)

devletler

Yaygın olarak uygulanan bu veri setiyle ilgili sorun, kendi kendine kesişmenin aşağıda verilen noktada meydana gelmesidir.

rgeos::gIsValid(spydf_states)
[1] FALSE
Warning message:
In RGEOSUnaryPredFunc(spgeom, byid, "rgeos_isvalid") :
  Self-intersection at or near point -122.22023214285259 38.060546477866055

Ne yazık ki, bu sorun, örneğin spydf_states 'in örneğin daha fazla kullanılmasını önler rgeos::gIntersection. Bu sorunu R içinden nasıl çözebilirim?


1
Bu noktayı yakınlaştırırsanız: Bu konuda plot(spydf_states, xlim=c(-122.1,-122.3),ylim=c(38,38.1))“görünüşte” bir şey olmadığını göreceksiniz - bir kesişme noktası var.
Spacedman 18:15

Yanıtlar:


39

Sıfır genişlikli bir tampon kullanmak, R'deki birçok topoloji sorununu temizler.

spydf_states <- gBuffer(spydf_states, byid=TRUE, width=0)

Ancak, projelendirilmemiş enine uzun koordinatlarla çalışmak, rgeosuyarıların atılmasına neden olabilir .

İşte ilk önce bir Albers projeksiyonuna itiraz eden genişletilmiş bir örnek:

library(sp)
library(rgeos)

load("~/Dropbox/spydf_states.RData")

# many geos functions require projections and you're probably going to end
# up plotting this eventually so we convert it to albers before cleaning up
# the polygons since you should use that if you are plotting the US
spydf_states <- spTransform(spydf_states, 
                            CRS("+proj=aea +lat_1=29.5 +lat_2=45.5 +lat_0=37.5 +lon_0=-96"))

# simplify the polgons a tad (tweak 0.00001 to your liking)
spydf_states <- gSimplify(spydf_states, tol = 0.00001)

# this is a well known R / GEOS hack (usually combined with the above) to 
# deal with "bad" polygons
spydf_states <- gBuffer(spydf_states, byid=TRUE, width=0)

# any bad polys?
sum(gIsValid(spydf_states, byid=TRUE)==FALSE)

## [1] 0

plot(spydf_states)

görüntü tanımını buraya girin


4
gBuffer"Hack" un neden çalıştığı hakkında ilave yorum / okuma var mı?
MichaelChirico,

DataFrame'i parçalayan ve SPDF'yi uzaysal çokgen nesnesine dönüştürürken gSimplify kullanmak ister misiniz?
wnursal

5
Kullanıyorsanız sfda kullanabilirsinizsf::st_buffer(x, dist = 0)
Phil

ayrıca bazı durumlarda kullanırken çalışırPostGIS
natsuapo
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.