Eu tenho um shapefile de linha representando uma rede de estradas. Desejo rasterizar esses dados, com os valores resultantes na varredura mostrando o comprimento total das linhas que se enquadram na célula de varredura.
Os dados estão na projeção da British National Grid, portanto as unidades serão metros.
Idealmente, eu gostaria de executar esta operação usando R
, e estou supondo que a rasterize
função do raster
pacote tenha um papel importante nesse processo, simplesmente não consigo descobrir qual deve ser a função aplicada.
raster
r
line
rasterization
JPD
fonte
fonte
vignette('over', package = 'sp')
possa ajudar.Respostas:
Após uma pergunta recente , convém usar as funcionalidades oferecidas pelo pacote rgeos para resolver seu problema. Por motivos de reprodutibilidade, baixei um arquivo de forma das estradas da Tanzânia do DIVA-GIS e o coloquei no meu diretório de trabalho atual. Para as próximas tarefas, você precisará de três pacotes:
Conseqüentemente, suas primeiras linhas de could devem ficar assim:
Depois disso, você precisa importar os dados do shapefile. Observe que os shapefiles do DIVA-GIS são distribuídos no EPSG: 4326, então projetarei o shapefile no EPSG: 21037 (UTM 37S) para lidar com medidores e não com graus.
Para rasterização subsequente, você precisará de um modelo raster que cubra a extensão espacial do seu shapefile. O modelo de varredura consiste em 10 linhas e 10 colunas por padrão, evitando assim tempos de computação muito extensos.
Agora que o modelo está configurado, percorra todas as células da varredura (que atualmente consiste apenas em valores de NA). Ao atribuir um valor de '1' à célula atual e subsequentemente executar
rasterToPolygons
, o shapefile resultante 'tmp_shp' mantém automaticamente a extensão do pixel processado no momento.gIntersects
detecta se essa extensão se sobrepõe às estradas. Caso contrário, a função retornará um valor '0'. Caso contrário, o shapefile da estrada é cortado pela célula atual e o comprimento total de 'SpatialLines' nessa célula está sendo calculado usandogLength
.Por fim, você pode inserir os comprimentos calculados (que são convertidos em quilômetros) no modelo de varredura e verificar visualmente seus resultados.
fonte
sapply()
parapbsapply()
e usei o argumento clustercl = detectCores()-1
. Agora eu sou capaz de executar este exemplo em paralelo!O abaixo é modificado a partir da solução de Jeffrey Evans. Esta solução é muito mais rápida, pois não utiliza rasterização
fonte
raster::intersect()
antes, gosto que ele combina os atributos dos recursos cruzados, ao contráriorgeos::gIntersection()
.Você não precisa de um loop for. Basta interceptar tudo de uma só vez e adicionar comprimentos de linha aos novos segmentos de linha usando a função "SpatialLinesLengths" em sp. Em seguida, usando a função rasterize do pacote raster com o argumento fun = sum, é possível criar uma varredura com a soma do (s) comprimento (s) da linha que cruzam cada célula. Usando a resposta acima e os dados associados, aqui está o código que irá gerar os mesmos resultados.
fonte
SpatialLinesLengths
. Acho que nunca é tarde demais para aprender, obrigado (:rasterize
leva muito longo, embora (7 vezes mais do que a abordagem superior em minha máquina).rasterize()
função inclui todas as linhas que tocam uma determinada célula. Isso resulta em comprimentos de segmentos de linha sendo contados duas vezes em alguns casos: uma vez na célula eles deveriam e uma vez na célula adjacente que apenas o ponto final da linha toca.Aqui está mais uma abordagem. Ele se desvia daqueles já fornecidos usando o
spatstat
pacote. Tanto quanto posso dizer, este pacote tem sua própria versão de objetos espaciais (por exemplo,im
vs.raster
objetos), mas omaptools
pacote permite a conversão entrespatstat
objetos e objetos espaciais padrão.Essa abordagem é retirada deste post do R-sig-Geo .
O bit mais lento é converter as estradas de
SpatialLines
para um padrão de segmento de linha (ou sejaspatstat::psp
). Feito isso, as peças de cálculo do comprimento real são bastante rápidas, mesmo para resoluções muito mais altas. Por exemplo, no meu antigo MacBook de 2009:fonte
Deixe-me apresentar a veia do pacote com várias funções para trabalhar linhas espaciais e importar sf e data.table
fonte
Isso pode parecer um pouco ingênuo, mas se for um sistema de estradas, selecione as estradas e salve em uma área de transferência. Procure uma ferramenta que permita adicionar um buffer à área de transferência, defina-a na largura legal da estrada, ou seja, 3 metros +/- lembre-se de que o buffer é da linha central até a borda * 2i para cada lado, de modo que um buffer de 3 metros é na verdade uma estrada de 6 metros de um lado para o outro.
fonte