Rgeos descarta valores associados ao cruzar polígonos

11

Estou tentando interceptar dois SpatialPolygonsDataFrames e obter um SpatialPolygonsDataFrame como resultado. Infelizmente, usando a gIntersectionfunção from rgeos(que funciona de maneira impressionante para interceptar os polígonos), não consigo recuperar os quadros de dados associados. Considere o seguinte exemplo:

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

Eu posso escrever uma função de wrapper que lida com a transferência de data.frames, mas será um pouco difícil acertar todas as verificações e antes de fazê-lo, esperava que alguém pudesse confirmar que não há melhor maneira ou me indicar outra função (ou opção). para gIntersection) o que me permitiria manter o associado data.frames.

Atualizar

Em uma reflexão mais aprofundada, isso pode ser um comportamento muito deliberado por gIntersection. Afinal, dos dois SPDFs, cujo data.frame você transmite? Então, talvez eu precise escrever um wrapper que mescla os dois.

Ari B. Friedman
fonte
1
Como você está carregando seus polígonos - readShape * ou readOGR? Eu recebo um comportamento estranho com o gIntersection, dependendo de qual biblioteca eu usei para carregar SPDFs, da qual não cheguei ao fundo.
Simbamangu 6/10/12
@Simbamangu Interessante. Estou usando readShapePoly e depois fundindo em um data.frame ....
Ari B. Friedman
O gIntersection DEVE fornecer os data.frames mesclados para as áreas sobrepostas - se eu executar o Vector | Geoprocessing | Intersect no QGIS, a saída é um conjunto de atributos mesclados para a sobreposição e o QGIS não usa a mesma biblioteca GEOS para operações espaciais como esta?
Simbamangu 15/10/12
Bem, se deveria, estou perplexo. Eu já reescrevi meu código para mesclar os dados. Quadros manualmente e devolvê-los, então não vou gastar mais tempo nisso por enquanto. Mas a dica de que a leitura da função no arquivo shapefile é útil.
Ari B. Friedman
1
Isso claramente não é uma resposta, mas não tenho pontos suficientes para deixar um comentário ... Ari, fiquei pensando se você compartilharia seu pedaço de código para extrair as variáveis ​​após as funções de sobreposição do rgeos. Estou tendo problemas envolvendo minha cabeça em torno de uma boa maneira de manter operações de diversos rgeos do id polígono original, como Gunion ...
jed.a.long

Respostas:

2

Para alguns projetos, eu tinha a mesma necessidade. Muito mais do que manter data.frameisso, tivemos que implementar um código adicional para gerenciar o tipo de geometria de saída e prosseguir com alguma limpeza (por exemplo, coleções de geometrias limpas), para ter um geoprocesso de interseção completo. Caso você ainda precise executar essa tarefa no R, tente o pacote RFigisGeo :

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

#compute intersection
result <- getIntersection(features1, features2)
eblondel
fonte
As respostas de você e de @ berndv parecem que resolveriam meu problema. Obrigado! Marcando este desde que veio primeiro.
Ari B. Friedman
10

O comportamento do gIntersection não é transmitir dados cruzados por design:

Como não há correspondências gerais entre objetos espaciais cruzados, quaisquer operações arbitrárias nos atributos requerem suposições sobre intenções desconhecidas do usuário. É por isso que nenhum slot de dados deve ser passado ...

... O design de gIntesection () é intencional, porque apenas o usuário pode saber o que fazer com os atributos de entidades que tiveram suas geometrias alteradas. Usuários diferentes podem fazer suposições diferentes, mas não há solução geral além de passar pelos IDs das geometrias que se cruzam, como é feito no mecanismo row.names ().

Para minha surpresa, o pacote raster tem uma função de interseção , que simplesmente intercepta e entrega os dados também.

O pacote raster possui algumas funções que estendem os rgeos, tentando também manipular dados de atributo. Nesse caso, consulte raster :: intersect E a lista de funções aqui:? "Raster-package" (seção XIV)

As informações completas que obtive sobre isso: http://r-sig-geo.2731867.n2.nabble.com/Intended-usage-of-gIntersection-td7587120.html

Bernd V.
fonte
0

Para aqueles (como eu) para quem as respostas acima não funcionaram, o link aqui explica que você pode fazer isso com a interseção de raster.

Como reter todos os dados de atributo ao recortar dois polígonos em R?

Eu usei isso para cortar um SpatialPointsDataFrame com um shapefile SpatialPolygons; ele cria uma versão cortada / cortada do SpatialPointsDataFrame, mantendo os dados originais.

Leah Bevis
fonte