Python| Criando shapefile com a biblioteca SHAPELIB

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

4 thoughts on “Python| Criando shapefile com a biblioteca SHAPELIB

Add yours

  1. 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

    1. 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

  2. Gostaria de saber se exite um tutorial para esta função shapelib.

    Muito obrigado pela atenção
    Gustavo

  3. 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…

Leave a reply to Razec Cancel reply

Up ↑