Tags

, , , , , , ,

Definição: ESRI Shapefile ou shapefile é um popular formato vetorial desenvolvido pela ESRI para comunicar entre seus produtos,  possuindo informações geográficas, armazenadas no XBASE.

Esta breve explicação acima é para tornar mais facil o entendimento de nossa conversa. Alguns dias atrás surgiu a necessidade de desenvolver uma ferramenta para criar shapefiles, a partir de algumas padronizações estabelecidas no projeto.

Mas recebi a seguinte mensagem: “Não poderá ser construído no framework (Esri Arcobject) atual, tem que ser uma ferramenta separada.”

Este detalhe mudou o escopo do projeto, pode parecer engraçado mas gostei ainda mais do desafio.

Então comecei a estudar algumas bibliotecas open-source escritas em C/C++ para fazer esta implementação, foi ai que econtrei a biblioteca shapelib.

Shapelib:
O Shapelib é uma biblioteca escrita em C e mantida por Frank Warmerdam. Atualmente está implementada em muitos projetos GIS open-source (GDAL, QuantumGIS, etc) e tem por objetivo criar arquivos ESRI Shapefiles associados com XBASE(*.dbf) – Maiores Informações: http://shapelib.maptools.org/

Mas surgiu outra questão: “O projeto não poderá ser feito em C/C++, precisará ser um script.”

Voltei a página oficial do shapelib e lá estava a maravilha do open-source, Bernhard Herzog fez um porting da biblioteca criada por Frank Warmerdam para python.

Após muitos bugs e problemas o script está funcionando e segue abaixo a minha pequena contribuição, ou  seja, um exemplo de como utilizar o shapelib.

É necessário as seguintes ferramentas:

Exemplo do uso pyShapelib

Antes é interessante entender os 3 arquivos que seguem o shapefile:

  1. XXX.shp – formato vetorial.
  2. XXX.shx – faz o vinculo entre o *.shp e o arquivo *.dbf.
  3. XXX.dbf – armazena os atributos dos vetores criados no shp no xBase (dBase) format.

#############################################################################################
# shapemaker.py - Creates a shapefile in a folder.
#
# Using Library:
#  - pyshapelib (windows) - http://geoyard.googlecode.com/files/pyshapelib-0.3.win32-py2.5.exe
#  - pyshapelib (linux) - http://ftp.intevation.de/users/bh/pyshapelib/pyshapelib-0.3.tar.gz
#  - Python 2.5
#
# by Mario Ponciano - a.k.a Razec, mrazec@gmail.com - https://razec.wordpress.com
######################################June/2010################################################
import shapelib
import dbflib
import sys

class ShapeFile():
 # Create a DBF using dbflib
 def create_dbf(filename):
 try:
 dbf = dbflib.create(filename)
 dbf.add_field("ID", dbflib.FTInteger, 20, 0)
 dbf.close()
 except:
 print "Cannot create Database (*.dbf): %s.dbf" % filename
 sys.exit(1)

 # Create a shapefile and add data to the dbf
 def create_shp(filename):
 try:
 # Generate ShapeFile
 fshp = shapelib.create(filename, shapelib.SHPT_POINT)
 # Open dbf database
 dbf = dbflib.open(filename, "r+b")
 # Coordinate Define ( X = 10, Y = 20, Z = 30)
 obj = shapelib.SHPObject(shapelib.SHPT_POINT, 1, [[(10, 20, 30)]])
 rec = fshp.write_object(-1, obj)
 # Write data to the database directly
 dbf.write_record(rec, {'ID': 1})
 print "Created Shapfile: %s" % (filename)
 except:
 print "Cannot create Shapefile: %s.shp" % filename
 sys.exit(1)

 # Close shapefile/dbf
 fshp.close()
 dbf.close()

 if __name__ == "__main__":
 filename = "my_shapefile" # Shapefile name
 # Call functions
 create_dbf(filename)
 create_shp(filename)

*Para maiores detalhes sobre shape poderam ser lidos na especificação ESRI Shapefile.

*Eduardo Patto Kanegae escreveu um guia para os usuários utilizarem o shapelib e está em pt_br – Guia do usuário Shapelib

Advertisements