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:
- XXX.shp – formato vetorial.
- XXX.shx – faz o vinculo entre o *.shp e o arquivo *.dbf.
- 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
Boa tarde,
Eu tentei instalar o shapelib usando o python 2.6 entretanto me deparei com este erro:
error: unabla to find vcvarsall.bat
Na minha procura por este erro descobri que precisaria utilizar o compilador mingw32 para acabar com o problema. Entretanto ocorreu um outro problema.
error: command ‘gcc’ failed: No such file or directory
Vocês teriam alguma sugestão para acabar com estes problemas.
Obrigado
Olá Gustavo,
Eu não tive este problema até porque tenho o mingw32/gcc instalado (Compilador C), estou achando estranho ele pedir isso.
Bom você instalou o shapelib para o Python 2.6. Caso não tenha feito isto baixe para a sua versão, segue link para ajuda-lo:
shaplib_python_2.6
Depois da um feed back sobre isto.
Abraço
Gostaria de saber se exite um tutorial para esta função shapelib.
Muito obrigado pela atenção
Gustavo
Gustavo infelizmente desconheço algum tutorial, realmente aprendi lendo a documentação e acompanhando o mailing list.
Até uma das razões de escrever este post foi por isto, caso eu econtre alguma faço um post por aqui.
Abraço…