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):
Fontes
Wikipedia e Exelis IDLffShape.