Shapefile no IDL

Um “shapefile” consiste de três arquivos que trabalham conjuntamente: um arquivo principal (.shp) que traz o desenho do mapa propriamente, um arquivo índice (.shx) que é um indexador de informações para facilitar buscas e um arquivo de banco de dados (.dbf) trazendo informações e atributos das unidades espaciais (população do município, renda per capita, etc). O que liga esses três arquivos é um ID, único para cada unidade espacial, geralmente chamado de Geocódigo.

Um objeto da classe IDLffShape contém geometria, conectividade e atributos de gráficos acessados ​​a partir da ESRI (Enviromental Systems Research Institute) Shapefiles. O Esri Shapefile (ou simplesmente shapefile) é um formato popular de arquivo que contém dados geoespaciais em forma de vetor usado por Sistemas de Informações Geográficas (SIG, ou GIS em inglês), que podem descrever pontos, linhas, e polígonos. Cada item pode ter atributos que os descrevem, como nome, temperatura ou profundidade.

Através da classe IDLffShape, é possível acessar dos arquivos shapefile os elementos Entidades e Atributos.

Entidades

A geometria de uma “feature” (marcações) é armazenada com uma “shape” (camada) que compreende um conjunto de coordenadas vetoriais, referidas como “entities” (entidades). Exemplos de shapes: ponto (código 1), PolyLine (código 3), polígono (código 5), etc. Ao recuperar entidades utilizando o método “IDLffShape::GetEntity”, uma estrutura IDL é retornado. Esta estrutura tem os seguintes campos: SHAPE_TYPE, ISHAPE, BOUNDS, N_VERTICES, VERTICES, MEASURE, N_PARTS, PARTS, PART_TYPES e ATTRIBUTES (ponteiro que contém as estruturas dos atributos da entidade).

Atributos

Um Shapefile fornece a capacidade de associar informações que descrevem cada entidade (um elemento geométrico) contido no arquivo. Essas informações descritivas são chamadas atributos, e cada atributo é composto por um conjunto de elementos de dados nomeados para cada entidade geométrica contido no arquivo. O conjunto de atributos disponíveis é o mesmo para todas as entidades contidas em um shapefile, com cada entidade tendo seu próprio conjunto de valores atribuídos. Um atributo consiste de dois componentes: “name” (nome) e “data value” (dados).

Para obter o nome de atributos de um arquivo específico, utiliza-se a palavra-chave ATTRIBUTE_NAMES ao método IDLffShape::GetProperty, retornando uma matriz que contém os nomes dos atributos definidos para o arquivo. Para obter os valores dos atributos, utiliza-se a palavra-chave ATTRIBUTES ao método IDLffShape::GetEntity, retornando os valores de atributos para a entidade especificada como uma estrutura IDL anônimo – a ordem numérica dos campos define a relação com os nomes das estruturas (ATTRIBUTE_0 : VALUE, ATTRIBUTE_1 : VALUE, etc).

Classe IDLffShape, método GetProperty

Dado o nome de uma estrutura que define uma classe de objeto (ou entidade), a função OBJ_NEW retorna uma referência de objeto para uma nova instância do objeto especificado. Na primeira linha do exemplo abaixo, a variável “myshape” recebe a saída da função OBJ_NEW. Ao acessar métodos e propriedades de uma classe, você pode usar o operador seta (->). No exemplo a seguir, o objeto “myshape” solicita o método “GetProperty” aplicado à classe “IDLffShape”, onde a variável “num_ent” recebe o valor da propriedade (ou atributo) N_ENTITIES.

> myshape=OBJ_NEW('IDLffShape', camada.shp)
> myshape->IDLffShape::GetProperty, N_ENTITIES=num_ent

As propriedades que retornam desse método são: número de entidades, tipo das entidades, número de atributos associados a cada entidade, nomes dos atributos, nome/tipo/tamanho/precisão dos atributos, status e nome do arquivo. O exemplo a seguir mostra uma rotina para imprimir o número de entidades e o tipo:

;Rotina para retornar quantidade e tipo de entidades
PRO entity_info

  CD, '/home/user/diretorio'
  ; abrir o arquivo shapefile
  myshape=OBJ_NEW('IDLffShape', 'nome_do_arquivo.shp')

  ; pegar o número e tipo de entidades
  myshape->GetProperty, N_ENTITIES=num_ent, ENTITY_TYPE=ent_type

  ; imprmir variáveis
  PRINT, 'Number of Entities: ', num_ent
  PRINT, 'Entity Type: ', ent_type

  ; Fechar o objeto
  OBJ_DESTROY, myshape

END

Impressão de shapefile em imagem (conversão SHP para PNG)

Um arquivo vetorial guarda melhor informações de pontos e figuras geométricas, mas caso sejam muitos, o arquivo acaba ficando muito grande. Caso o objetivo seja sua visualização simples, sem grande definição, uma possibilidade é imprimir a imagem em uma figura do tipo PNG (Portable Network Graphics). As linhas abaixo permitem a “conversão” de todos os arquivos “.shp” em “.png”, desde os arquivos “.shx” e “.dbf” estejam com o mesmo nome e no mesmo diretório.

; Script para converter shp em png
; Diretório do script
CD,'/home/user/shp_exemplo'
; Limites da área a ser impressa e resolução
area_name='CE'
lat0=-8.
lat1=-2.
lon0=-42.
lon1=-37.
res=0.01
ncol=fix((lon1-lon0)/res)+1
nlin=fix((lat1-lat0)/res)+1

; Definições de vídeo
thisDevice = !D.Name
Set_Plot,'Z'
Erase
Device,Set_Resolution=[ncol,nlin],Set_Pixel_Depth=24, Decomposed=1
!p.background=((256L)^3)-1
map_set,0,0,limit=[lat0,lon0,lat1,lon1],/noborder,position=[0,0,1,1]
TVLCT,[[0],[0],[0]],0

; Busca de arquivos .shp
shp=FILE_SEARCH('Diretorio/*.shp', count=count)
print,shp
for i=0,count-1 do begin
  myshape=OBJ_NEW('IDLffShape',shp[i])
  myshape->IDLffShape::GetProperty,N_ENTITIES=num_ent
	for j=0,num_ent-1 do begin
		attr=myshape->IDLffShape::GetAttributes(j)
		ent=myshape->IDLffShape::GetEntity(j)
    n_vertices=ent.N_VERTICES
    if (n_vertices NE 0) then begin
 		 plots,(*ent.vertices)[0,*],(*ent.vertices)[1,*],color=0
     ;POLYFILL, (*ent.vertices)[0,*], (*ent.vertices)[1,*],COLOR=0
 		endif
	endfor
OBJ_DESTROY,myshape
endfor

; Imprimir imagem e salvar como arquivo png
write_png,'img_'+area_name+'_'+string(res,format='(f4.2)')+'.png',tvrd(true=1)
Set_Plot,'X'
end

Segue a tabela de cores do IDL para escolher uma cor diferente para as curvas impressas (veja como utilizá-la no site do IDL Coyote):

Tabela de cores do IDL.
Tabela de cores do IDL.

Fontes

Wikipedia e Exelis IDLffShape.

Compartilhe :)

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.