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

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

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s