Rgeos upuszcza powiązane wartości podczas przecinania wielokątów

11

Usiłuję przeciąć dwa SpatialPolygonsDataFrames i uzyskać wynik SpatialPolygonsDataFrame. Niestety, używając gIntersectionfunkcji z rgeos(która działa imponująco szybko, aby przeciąć wielokąty), nie mogę pobrać powiązanych ramek danych. Rozważ następujący przykład:

> fracPoly <- gIntersection( toSingle, fromSingle )
> class(toSingle)
[1] "SpatialPolygonsDataFrame"
> class(fromSingle)
[1] "SpatialPolygonsDataFrame"
> class(fracPoly)
[1] "SpatialPolygons"

Mogę napisać funkcję otoki, która obsługuje przenoszenie data.frames, ale poprawność wszystkich sprawdzeń będzie niewielka, a zanim to zrobiłem, miałem nadzieję, że ktoś może potwierdzić, że nie ma lepszego sposobu lub skierować mnie w stronę innej funkcji (lub opcji) dla gIntersection), co pozwoliłoby mi zachować powiązane data.frames.

Aktualizacja

Po dalszej refleksji może to być bardzo celowe zachowanie gIntersection. W końcu z dwóch SPDF, których ramkę danych przekazujesz? Więc może będę musiał napisać opakowanie, które połączy oba.

Ari B. Friedman
źródło
1
Jak ładujesz swoje polgyony - readShape * lub readOGR? Mam dziwne zachowanie z gIntersection w zależności od biblioteki, której użyłem do załadowania plików SPDF, do których nie dotarłem.
Simbamangu,
@Simbamangu Ciekawe. Używam readShapePoly, a następnie łączę się w ramkę data.frame ...
Ari B. Friedman,
gIntersection POWINIEN dać ramkom data.frame scalone dla nakładających się obszarów - jeśli uruchomię Vector | Geoprocessing | Intersect w QGIS, wynikiem jest zestaw scalonych atrybutów dla nakładania się i QGIS nie używa tej samej biblioteki GEOS do operacji przestrzennych takich jak to?
Simbamangu
Cóż, jeśli powinno, to jestem zakłopotany. Już przepisałem swój kod, aby scalić dane.frame ręcznie i przywrócić je z powrotem, więc na razie nie zamierzam poświęcać temu więcej czasu. Ale wskazówka, że ​​funkcja odczytu w pliku kształtu ma znaczenie.
Ari B. Friedman
1
To oczywiście nie jest odpowiedź, ale nie mam wystarczającej liczby punktów, aby zostawić komentarz ... Ari, zastanawiałem się, czy podzielisz się swoją częścią kodu, aby wyodrębnić zmienne po funkcjach nakładania rgeos. Mam problem z owinięciem głowy dobrym sposobem na zachowanie oryginalnego identyfikatora wielokąta z różnych operacji rgeos, takich jak gUnion ...
jed.a.long

Odpowiedzi:

2

W przypadku niektórych projektów miałem taką samą potrzebę. Znacznie więcej niż utrzymanie data.frame, musieliśmy wprowadzić dodatkowy kod, aby zarządzać wyjściowym typem geometrii, i przejść do czyszczenia (np. Czyste zbiory geometrii), aby uzyskać kompletny geoproces przecięcia. Jeśli nadal musisz wykonać takie zadanie w R, możesz wypróbować pakiet RFigisGeo :

#install RFigisGeo
require(devtools) 
install_github("RFigisGeo", "openfigis")
require(RFigisGeo)

#compute intersection
result <- getIntersection(features1, features2)
eblondel
źródło
Zarówno odpowiedzi na twoje, jak i @ berndv wyglądają, jakby rozwiązały mój problem. Dzięki! Oznaczenie tego, odkąd było pierwsze.
Ari B. Friedman
10

Zachowaniem gIntersection nie jest przekazywanie żadnych przecinanych danych według projektu:

Ponieważ nie ma ogólnych dopasowań między przecinającymi się obiektami przestrzennymi, wszelkie arbitralne operacje na atrybutach wymagają założenia o nieznanych zamiarach użytkownika. Dlatego nie należy przekazywać żadnych miejsc danych ...

... Projekt gIntesection () jest wstępny, ponieważ tylko użytkownik może wiedzieć, co zrobić z atrybutami elementów, których geometria została zmieniona. Różni użytkownicy mogą przyjmować różne założenia, ale nie ma ogólnego rozwiązania poza przekazywaniem identyfikatorów przecinających się geometrii, jak ma to miejsce w mechanizmie row.names ().

Ku mojemu zdziwieniu, pakiet rastrowy ma funkcję przecięcia , która po prostu przecina i przekazuje również dane.

Pakiet rastrowy ma kilka funkcji, które rozszerzają rgeos, również próbując obsługiwać dane atrybutów. W takim przypadku zobacz raster :: intersect I listę funkcji tutaj:? „Pakiet raster” (sekcja XIV)

Pełne informacje na ten temat: http://r-sig-geo.2731867.n2.nabble.com/Intended-usage-of-gIntersection-td7587120.html

Bernd V.
źródło
0

Dla tych (jak ja), dla których powyższe odpowiedzi nie zadziałały, link tutaj wyjaśnia, że ​​możesz to zrobić dokładnie za pomocą przecięcia rastra.

Jak zachować wszystkie dane atrybutów podczas obcinania dwóch wielokątów w R?

Użyłem tego do kadrowania SpatialPointsDataFrame za pomocą pliku kształtu SpatialPolygons; tworzy przyciętą / przyciętą wersję SpatialPointsDataFrame, zachowując oryginalne dane.

Leah Bevis
źródło