[R-br] Criando uma mascara com shapefile sobre raster

Thiago V. dos Santos thi_veloso em yahoo.com.br
Sábado Abril 6 22:09:22 BRT 2013


Alexandre,

Acho que consigo ajudar.

a) a imagem final nao tera o histograma adulterado pelo recorte, mas ele sera diferente porque contem apenas uma parte dos dados da imagem original. Se voce quiser manter a mesma escala durante o plot, tera que controlar os valores manualmente (de acordo com o comando para plotar que voce esta usando) para que o range seja o mesmo da imagem original. Isso deixaria as duas imagens "comparaveis".

b) voce nao precisa fazer nenhuma conversao para salvar a imagem final de Tiff. O proprio pacote raster pode salvar (usando drivers do rgdal), em algo parecido com isso:
        require(rgdal)
writeRaster(land_mask, filename="landsat_cropped.tif", format="GTiff", overwrite=TRUE)

O comando acima funcionara tanto para uma imagem quanto para brick (ou stack).
 
Saudações,
--
Thiago V. dos Santos
PhD student
Land and Atmospheric Science
University of Minnesota
http://www.laas.umn.edu/CurrentStudents/MeettheStudents/ThiagodosSantos/index.htm
Phone: (612) 323 9898


________________________________
 From: ASANTOS <alexandresantosbr em yahoo.com.br>
To: r-br em listas.c3sl.ufpr.br 
Sent: Saturday, April 6, 2013 7:26 PM
Subject: Re: [R-br] Criando uma mascara com shapefile sobre raster
 

Thiago,

      Desculpe pensei um pouco e achei a solução para retornar ao
    valor inicial dos pixels, o problema agora esta sendo salvar esta
    imagem regular em tiff, sendo:
#Check final result
plot(land_mask)
image(land_mask, axes = FALSE, col = grey(seq(0, 1, length = 256)))
#
require(rgdal)
img.mask <- as(x, "SpatialPixelsDataFrame") # Converting the
    RasterLayer object to a SpatialPixelsDataFrame object
writeGDAL(img.mask, "img.mask.tif", drivername="GTiff") # This
    doesn´t works
#

     Sendo que a imagem final não produz um tiff com o mesmo
    resultado que em image(land_mask, axes = FALSE, col = grey(seq(0, 1,
    length = 256)))

Obrigado,

Alexandre



Em 06/04/2013 19:48, ASANTOS escreveu:

PERFEITO!!!! Thiago,
>
>         Era isto mesmo que eu queria fazer. Minha abordagem
      inicial era trabalhar com polígonos usando o PBSmapping, mas
      estava difícil fazer a representação do contorno neste formato
      sobre a imagem. Tenho uma última questão e vou precisar combinar
      diferentes bandas, por isso a bordagem inicial usando stack(), mas
      vou utilizar um loop sobre brick() conforme me recomendou, porém o
      que me preocupa foi o processo de rasterize() que gostaria de
      saber se vai mudar o valor dos pixels? Pois quero plotar novamente
      como na imagem inicial em escala de cinza, mas se fazer um plot
      greyscale o valor dos pixels não vão ficar subjetivo?
>
>Obrigado,
>
>Alexandre
>
>
>
>Em 06/04/2013 18:52, Thiago V. dos Santos escreveu:
>
>Alexandre, 
>>
>>
>>Acredito que o codigo no final dessa mensagem funcione. 
>>
>>
>>O maior problema foi converter o seu shapefile de polylines para polygons (voce tinha mencionado na primeira pergunta). So consegui fazer isso usando uma combinacao de funcoes dos pacores maptools e PBSmapping - voce deve instalar esse pacote. 
>>
>>
>>Primeiro eu converti as polylines para polysets (classe do pacote PBSmapping) e em seguida polysets para poligonos. O fluxo subsequente foi o mesmo que eu tinha te passado anteriormente.
>>
>>
>>Alem disso, carreguei a banda que voce mandou como brick (ao inves de stack) para para fins de simplicidade. Se voce fizer questao do stack para aplicar a todas as bandas da imagem, entao tera que fazer um loop entre elas - for (i in 1:nbands(land)){}.
>> 
>>
>>---------------------------------------------------
>># Require packages
>>require(raster)
>>require(maptools)
>>require(PBSmapping)
>>
>>
>>#Load data
>>land <-  raster("LANDSAT_5_TM_20100506_217_074_L2_BAND7.tif")
>>contorno_line <- readShapeLines ("Catas_Altas.shp",  proj4string=CRS("+proj=utm +zone=23 +south +datum=WGS84 +units=m +no_defs"))
>>
>>
>>
>># Convert SpatialLines to PolySet and then to SpatialPolygons - this will require package PBSmapping
>>contorno_poly <- PolySet2SpatialPolygons (SpatialLines2PolySet(contorno_line), close_polys=TRUE)
>>
>>
>># Then, perform crop and mask procedures as usual
>>land.crop <- crop(land, extent(contorno_poly), snap='out')
>>contorno.na <- setValues(land.crop, NA)
>>contorno.r <- rasterize(contorno_poly, contorno.na)
>>land_mask <- mask(x=land.crop, mask=contorno_poly)
>>
>>
>>#Check final result
>>plot(land_mask)
>>---------------------------------------------------
>>
>>
>>
>>Saudações,
>>--
>>Thiago V. dos Santos
>>PhD student
>>Land and Atmospheric Science
>>University of Minnesota
>>http://www.laas.umn.edu/CurrentStudents/MeettheStudents/ThiagodosSantos/index.htm
>>Phone: (612) 323 9898
>>
>>
>>________________________________
>> From: ASANTOS <alexandresantosbr em yahoo.com.br>
>>To: r-br em listas.c3sl.ufpr.br; Thiago V. dos Santos <thi_veloso em yahoo.com.br> 
>>Sent: Saturday, April 6, 2013 1:17 PM
>>Subject: Re: [R-br] Criando uma mascara com shapefile sobre raster
>> 
>>
>>Thiago
>>
>> Segue dbf e shx, prj não foi projetado ainda não,
>>
>>https://www.dropbox.com/s/p0idcxmh7td8hgi/Catas_Altas.dbf   ## Dbf
>>
>>https://www.dropbox.com/s/mssh8lq6cy61ncd/Catas_Altas.shx ## Shx,
>>
>>
>>Muito obrigado,
>>
>>
>>Alexandre
>>
>> 
>>
>>Em 06/04/2013 14:05, Thiago V. dos Santos escreveu:
>>
>>Alexandre,
>>>
>>>
>>>O .shp é só uma parte do dado, a geometria. Para reproduzir o seu problema, vou precisar também do .dbf e do .shx, além do .prj se ele já estiver projetado.
>>> 
>>>
>>>Saudações,
>>>--
>>>Thiago V. dos Santos
>>>PhD student
>>>Land and Atmospheric Science
>>>University of Minnesota
>>>http://www.laas.umn.edu/CurrentStudents/MeettheStudents/ThiagodosSantos/index.htm
>>>Phone: (612) 323 9898
>>>
>>>
>>>________________________________
>>> From: ASANTOS <alexandresantosbr em yahoo.com.br>
>>>To: r-br em listas.c3sl.ufpr.br 
>>>Sent: Saturday, April 6, 2013 11:32 AM
>>>Subject: Re: [R-br] Criando uma mascara com shapefile sobre raster
>>> 
>>>
>>>Obrigado pela atenção Thiago,
>>>
>>>   Tentei fazer um CRM, mas com raster
                              estava difícil, coloquei no dropbox mesmo,
                              segue a ultima tentativa que fiz com suas
                              dicas:
>>>
>>>#
>>>require(raster)
>>>
>>>#Dados
>>>https://www.dropbox.com/s/lzj71k9vt6dbou1/LANDSAT_5_TM_20100506_217_074_L2_BAND7.tif#Raster in tiff
>>>https://www.dropbox.com/s/bfcwpbw36gdlwjq/Catas_Altas.shp#contorno em shapefile
>>>#
>>>land.img<-
                              stack(c("LANDSAT_5_TM_20100506_217_074_L2_BAND7.tif"))
                              ## Imagem Landsat 5
>>>plotRGB(land.img,1) #Plota a banda 7 da
                              imagem
>>>
>>>#Poligono de interesse em shapefile comm
                              coordenadas em UTM
>>>contorno<-
                              readShapeLines("Catas_Altas.shp",
                              proj4string=CRS("+proj=utm +zone=23 +south
                              +datum=WGS84 +units=m +no_defs"))
>>>#
>>>#Quero selecionar os pixels da imagem que
                              estão contidos no interior do polígono
                              contorno
>>>A.crop <- crop(land.img,
                              extent(contorno), snap='out')
>>>contorno.na<-setValues(A.crop, NA)
>>>contorno.r<-rasterize(contorno,
                              contorno.na) 
>>>C <- mask(x=A.crop, mask=contorno.r)
>>>#
>>>
>>>
>>>
>>>Em 05/04/2013 09:18, Thiago V. dos Santos escreveu:
>>>
>>>Mas você recebe algum erro ou o resultado é diferente do esperado?
>>>>
>>>>
>>>>O melhor mesmo seria fornecer seus dados para tentarmos reproduzir o problema. Não dá pra colocar no dropbox? 50Mb não é nada tão grande assim...
>>>> 
>>>>Saudações,
>>>>--
>>>>Thiago V. dos Santos
>>>>PhD student
>>>>Land and Atmospheric Science
>>>>University of Minnesota
>>>>http://www.laas.umn.edu/CurrentStudents/MeettheStudents/ThiagodosSantos/index.htm
>>>>Phone: (612) 323 9898
>>>>
>>>>
>>>>________________________________
>>>> From: ASANTOS <alexandresantosbr em yahoo.com.br>
>>>>To: r-br em listas.c3sl.ufpr.br; Thiago V. dos Santos <thi_veloso em yahoo.com.br> 
>>>>Sent: Thursday, April 4, 2013 9:23 PM
>>>>Subject: Re: [R-br] Criando uma mascara com shapefile sobre raster
>>>> 
>>>>Thiago,
>>>>
>>>>      Explicando melhor
                                      teoricamente, pois um CRM
                                      implicaria em uma 
>>>>imagem de 50MB, tenho:
>>>>
>>>>1) Uma imagem do landsat 5 com um
                                      quadrante de interesse;
>>>>2)Um contorno em shapefile de uma
                                      área de 200 hectares.
>>>>
>>>>    Quero utilizar apenas os
                                      pixels da imagem contidos no
                                      interior da 
>>>>área de 200 hectares, para tanto
                                      extend() não resolve pois utiliza 
>>>>apenas utiliza coordenadas max e
                                      min e não considera a forma
                                      (contorno) 
>>>>do meu polígono para seleção dos
                                      pixels contidos nele.
>>>>
>>>>    Não consegui realizar o que
                                      desejo com a rotina sugerida.
                                      Mascara, 
>>>>usei como um termo que implica em
                                      área útil da imagem, não quero o 
>>>>quadrante todo oferecido pela
                                      imagem, mas aquilo que esta
                                      contido no meu 
>>>>shapefile.
>>>>
>>>>Obrigado pela atenção,
>>>>
>>>>Alexandre
>>>>
>>>>
>>>>
>>>>Em 04/04/2013 21:03, Thiago V. dos
                                      Santos escreveu:
>>>>> Alexandre,
>>>>>
>>>>> O que a área do raster tem a
                                      ver com o tipo de função usada
                                      para carregar o shapefile?
>>>>>
>>>>> Você não consegui recortar o
                                      raster com o shapefile usando os
                                      comandos que eu eu sugeri? O que
                                      exatamente você quis dizer com
                                      criar uma máscara na pergunta
                                      inicial?
>>>>>
>>>>> Saudações,
>>>>> --
>>>>> Thiago V. dos Santos
>>>>> PhD student
>>>>> Land and Atmospheric Science
>>>>> University of Minnesota
>>>>> http://www.laas.umn.edu/CurrentStudents/MeettheStudents/ThiagodosSantos/index.htm
>>>>> Phone: (612) 323 9898
>>>>>
>>>>>
>>>>> ----- Original Message -----
>>>>> From: ASANTOS <alexandresantosbr em yahoo.com.br>
>>>>> To: r-br em listas.c3sl.ufpr.br
>>>>> Cc:
>>>>> Sent: Thursday, April 4, 2013
                                      5:14 PM
>>>>> Subject: Re: [R-br] Criando
                                      uma mascara com shapefile sobre
                                      raster
>>>>>
>>>>> Thiago,
>>>>>
>>>>>            Não deu certo não,
                                      transformei em
>>>>>
                                      SpatialPolygons(list(Polygons(list(Polygon(contorno2)),"contorno2"))),
>>>>> prefiro continuar tentando
                                      com
                                      readShapeLines("Catas_Altas.shp",
>>>>> proj4string=CRS("+proj=utm
                                      +zone=23 +south +datum=WGS84
                                      +units=m
>>>>> +no_defs")), porque consigo
                                      visualizar a área sobre o raster,
                                      achei
>>>>> alguns posts mais usando o
                                      GRASS, mas gostaria de fazer tudo
                                      só no R.
>>>>>
>>>>> Obrigado,
>>>>>
>>>>> Alexandre
>>>>>
>>>>>
>>>>> Em 04/04/2013 12:18, Thiago
                                      V. dos Santos escreveu:
>>>>>> Alexandre,
>>>>>>
>>>>>> a) Tente ler o seu
                                      shapefile com a funcao
                                      readShapePoly.
>>>>>>
>>>>>> b) Se nao der certo,
                                      sugiro uma combinacao das funcoes
                                      crop e raster. Nesse caso,
                                      experimente rodar o seu codigo com
                                      as seguintes mudancas:
>>>>>>
>>>>>> require("raster")
>>>>>> A <-
                                      stack("LANDSAT_5_TM_20100506_217_074_L2_BAND7.tif")
>>>>>> contorno<-
                                      readShapePoly("Catas_Altas.shp")
>>>>>>
>>>>>> A.crop <- crop(A,
                                      extent(contorno), snap='out')
>>>>>>
>>>>>>
                                      contorno.na<-setValues(A.crop,
                                      NA)
>>>>>>
                                      contorno.r<-rasterize(contorno,
                                      contorno.na) ### isso pode
                                      demorar, dependendo do seu
                                      shapefile
>>>>>> C <- mask(x=A.crop,
                                      mask=contorno.r)
>>>>>>
>>>>>>
>>>>>> Saudações,
>>>>>>
>>>>>> --
>>>>>> Thiago V. dos Santos
>>>>>> PhD student
>>>>>> Land and Atmospheric
                                      Science
>>>>>> University of Minnesota
>>>>>> http://www.laas.umn.edu/CurrentStudents/MeettheStudents/ThiagodosSantos/index.htm
>>>>>> Phone: (612) 323 9898
>>>>>>
>>>>>>
>>>>>> ----- Original Message
                                      -----
>>>>>> From: ASANTOS<alexandresantosbr em yahoo.com.br>
>>>>>> To:r-br em listas.c3sl.ufpr.br
>>>>>> Cc:
>>>>>> Sent: Thursday, April 4,
                                      2013 10:31 AM
>>>>>> Subject: [R-br] Criando
                                      uma mascara com shapefile sobre
                                      raster
>>>>>>
>>>>>> Boa tarde pessoal,
>>>>>>
>>>>>>            Estou com um
                                      problema e não consigo criar uma
                                      mascara com um arquivo no formato
                                      shapefile sobre raster usando a
                                      função crop() do pacote raster,
                                      por algum motivo meu objeto
                                      contorno que é um
                                      SpatialLinesDataFrame não esta
                                      servido para oferecer o polígono
                                      limítrofe da área, alguém poderia
                                      me dar um help, segue CRM:
>>>>>>
>>>>>> require("raster")
>>>>>> A <-
                                      stack(c("LANDSAT_5_TM_20100506_217_074_L2_BAND7.tif"))##
                                      Imagem
>>>>>> plotRGB(A) ## Plota a
                                      imagem
>>>>>> contorno<-
                                      readShapeLines("Catas_Altas.shp") 
                                      ## Contorno da área
>>>>>> lines(contorno,
                                      col="red")Plota o contorno
>>>>>> C <- crop(A,contorno)
                                      ## Recorta o que esta contido no
                                      contorno na imagem
>>>>>> Erro em .local(x, y, ...)
                                      :
>>>>>>      nenhum slot de nome
                                      "legend" para esse objeto de
                                      classe "RasterStack"
>>>>>>
>>>>>>
>>>>>> --
                                      ======================================================================
>>>>>> Alexandre dos Santos
>>>>>> Proteção Florestal
>>>>>> Coordenador do curso
                                      Técnico em Florestas
>>>>>> Vice Coordenador do curso
                                      de Engenharia Florestal
>>>>>> IFMT - Instituto Federal
                                      de Educação, Ciência e Tecnologia
                                      de Mato Grosso
>>>>>> Campus Cáceres
>>>>>> Caixa Postal 244
>>>>>> Avenida dos Ramires, s/n
>>>>>> Bairro: Distrito
                                      Industrial
>>>>>> Cáceres - MT             
                                              CEP: 78.200-000
>>>>>> Fone: (+55) 65 8132-8112
                                      (TIM)  (+55) 65 9686-6970 (VIVO)
>>>>>> e-mails:alexandresantosbr em yahoo.com.br
>>>>>>            alexandre.santos em cas.ifmt.edu.br
>>>>>>
                                      ======================================================================
>>>>>>
>>>>>>
                                      _______________________________________________
>>>>>> R-br mailing list
>>>>>> R-br em listas.c3sl.ufpr.br
>>>>>> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>>>>>> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
>>>>>>
>>>>>>
>>>>
>>>>-- 
>>>>======================================================================
>>>>Alexandre dos Santos
>>>>Proteção Florestal
>>>>Coordenador do curso Técnico em
                                      Florestas
>>>>Vice Coordenador do curso de
                                      Engenharia Florestal
>>>>IFMT - Instituto Federal de
                                      Educação, Ciência e Tecnologia de
                                      Mato Grosso
>>>>Campus Cáceres
>>>>Caixa Postal 244
>>>>Avenida dos Ramires, s/n
>>>>Bairro: Distrito Industrial
>>>>Cáceres - MT                     
                                      CEP: 78.200-000
>>>>Fone: (+55) 65 8132-8112 (TIM) 
                                      (+55) 65 9686-6970 (VIVO)
>>>>e-mails:alexandresantosbr em yahoo.com.br
>>>>        alexandre.santos em cas.ifmt.edu.br
>>>>======================================================================
>>>>
>>>>
>>>>
>>>>
>>>
>>>-- 
======================================================================
Alexandre dos Santos
Proteção Florestal
Coordenador do curso Técnico em Florestas
Vice Coordenador do curso de Engenharia Florestal 
IFMT - Instituto Federal de Educação, Ciência e Tecnologia de Mato Grosso
Campus Cáceres
Caixa Postal 244
Avenida dos Ramires, s/n
Bairro: Distrito Industrial 
Cáceres - MT                      CEP: 78.200-000
Fone: (+55) 65 8132-8112 (TIM)   (+55) 65 9686-6970 (VIVO) e-mails:alexandresantosbr em yahoo.com.br alexandre.santos em cas.ifmt.edu.br ====================================================================== 
>>>_______________________________________________
>>>R-br mailing list
>>>R-br em listas.c3sl.ufpr.br
>>>https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>>>Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
>>>
>>>
>>>
>>>
>>>_______________________________________________
R-br mailing list R-br em listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
>>
>>-- 
======================================================================
Alexandre dos Santos
Proteção Florestal
Coordenador do curso Técnico em Florestas
Vice Coordenador do curso de Engenharia Florestal 
IFMT - Instituto Federal de Educação, Ciência e Tecnologia de Mato Grosso
Campus Cáceres
Caixa Postal 244
Avenida dos Ramires, s/n
Bairro: Distrito Industrial 
Cáceres - MT                      CEP: 78.200-000
Fone: (+55) 65 8132-8112 (TIM)   (+55) 65 9686-6970 (VIVO) e-mails:alexandresantosbr em yahoo.com.br alexandre.santos em cas.ifmt.edu.br ====================================================================== 
>>
>>
>
>-- 
======================================================================
Alexandre dos Santos
Proteção Florestal
Coordenador do curso Técnico em Florestas
Vice Coordenador do curso de Engenharia Florestal 
IFMT - Instituto Federal de Educação, Ciência e Tecnologia de Mato Grosso
Campus Cáceres
Caixa Postal 244
Avenida dos Ramires, s/n
Bairro: Distrito Industrial 
Cáceres - MT                      CEP: 78.200-000
Fone: (+55) 65 8132-8112 (TIM)   (+55) 65 9686-6970 (VIVO) e-mails:alexandresantosbr em yahoo.com.br alexandre.santos em cas.ifmt.edu.br ====================================================================== 
>
>
>_______________________________________________
R-br mailing list R-br em listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

-- 
======================================================================
Alexandre dos Santos
Proteção Florestal
Coordenador do curso Técnico em Florestas
Vice Coordenador do curso de Engenharia Florestal 
IFMT - Instituto Federal de Educação, Ciência e Tecnologia de Mato Grosso
Campus Cáceres
Caixa Postal 244
Avenida dos Ramires, s/n
Bairro: Distrito Industrial 
Cáceres - MT                      CEP: 78.200-000
Fone: (+55) 65 8132-8112 (TIM)   (+55) 65 9686-6970 (VIVO) e-mails:alexandresantosbr em yahoo.com.br alexandre.santos em cas.ifmt.edu.br ====================================================================== 
_______________________________________________
R-br mailing list
R-br em listas.c3sl.ufpr.br
https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20130406/36812ee6/attachment-0001.html>


Mais detalhes sobre a lista de discussão R-br