5. Trabalhando com esquemas: FeatureType

Os descritores contêm a informação sobre o nome, tipo, tamanho, precisão, etc. dos campos dos nossos dados.

Segundo seja o seu uso terá que cumprir certos requisitos. Por exemplo, se criamos uma capa vetorial, seu esquema tem que ter obrigatoriamente um campo GEOMETRY estabelecido.

5.1. Criando esquemas

Nota

Esta é uma nota de advertência

O nome de um campo em um documento shape não pode ter mais que 10 caracteres e também não é permitido utilizar caracteres especiais, espaços e acentuação. Underline, hifens, letras e números são permitidos.

createFeatureType([schema=None]):

Create an empty schema. If parameter schema is a DefaultEditableFeatureType, creates a copy of this schema DefaultFeatureType.

Parâmetros:schema (DefaultEditableFeatureType) – Schema from other layer
Retorna:empty schema or a copy of a schema

A interface DataTypes especifica um conjunto de constantes indicando os tipos de dados suportados por DAL.

Vamos a ver como criar um esquema com dois campos e atribuir este esquema em uma nova tabela:

from gvsig import *
from gvsig.geom import *

def main(*args):

        schema = createFeatureType() # DefaultFeatureType

        schema.append("ID", "INTEGER", 10)
        schema.append("NAME", "STRING", 20)

        dbf = createDBF(schema)

        d = loadDBF( dbf.getFullName()) # Carrega a tabela no  projeto

Também podemos criar um novo esquema baseado em outro já existente, muito útil para fazer copias de camadas. Para passar um esquema para a criação de camadas deve ser de tipo DefaultFeatureType, a função :py:func:createFeatureType() converte o esquema de tipo DefaultEditableFeatureType para o que necessitamos:

from gvsig import *
from gvsig.geom import *

def main(*args):

        schema = createFeatureType() # DefaultFeatureType

        schema.append("ID", "INTEGER", 10)
        schema.append("NAME", "STRING", 20)

        dbf_1 = createDBF(schema)

        dbf_schema = dbf_1.getSchema() # DefaultEditableFeatureType

        # Novo esquema baseado em outra camada
        new_schema = createSchema(dbf_schema)
        new_schema.append("CODE", "STRING", 5)

        dbf_2 = createDBF(new_schema)

Una forma de acessar os descritores contidos no esquema é mediante schema.get("Campo"). Também podemos iterar sobre eles. No seguinte exemplo, vemos a forma de adicionar diferentes campos de diferentes tipos em um novo esquema. Nós utilizamos uma função que itera sobre eles, para mostrar informações completas sobre o esquema que passamos como um parâmetro:

from gvsig import *
from gvsig.geom import *

def showInfoFeatureType(schema):
        #Mostra o esquema
        attrSchema = schema.getAttrNames()
        print "Esquema attr: ", attrSchema
        #Primeiro campo do esquema
        field1 = schema.get(0)

        # Descrição dos campos
        print u"\nDescrição dos campos"
        for field in schema:
                print " Nome: ", field.getName(),
                print " \tDataTypeName: ", field.getDataTypeName(),
                print " \tType: ", field.getType(),
                print " \tSubType: ", field.getSubtype(),
                print u" \tPrecisão: ", field.getPrecision(),
                print " \tTamanho: ", field.getSize()

                if field.getDataTypeName() == 'Geometry':
                  geomType = field.getGeomType()
                  print " \tGeom Name: ", geomType.getName()
                  print " \tGeom FullName: ", geomType.getFullName()
                  print " \tType: ", geomType.getType()
                  print " \tSubType: ", geomType.getSubType()
                  print " \tGeometryClass: ", geomType.getGeometryClass()
                  print u" \tDimensão: ", geomType.getDimension()

def main(*args):

        schema = createFeatureType()

        schema.append("ID", "INTEGER", 10)
        schema.append("NOME", "STRING", 20)
        schema.append("AREA", "DOUBLE", 20, 10)
        schema.append("DATA", "DATE", 20)
        schema.append("ATIVO", "BOOLEAN")
        schema.append("GEOMETRY", "GEOMETRY")
        schema.get('GEOMETRY').setGeometryType(POINT, D2)

        shape = createShape(schema, prefixname="date")
        currentView().addLayer(shape)
        showInfoFeatureType(schema)

No console veremos:

Esquema attr:  [u'ID', u'NOME', u'AREA', u'DATA', u'ATIVO', u'GEOMETRY']

Descrição dos campos
 Nome:  ID      DataTypeName:  Integer          Type:  4        SubType:  None          Precisão:  0    Tamanho:  10
 Nome:  NOME    DataTypeName:  String   Type:  8        SubType:  None          Precisão:  0    Tamanho:  20
 Nome:  AREA    DataTypeName:  Double   Type:  7        SubType:  None          Precisão:  4    Tamanho:  20
 Nome:  DATA    DataTypeName:  Date     Type:  9        SubType:  Date          Precisão:  0    Tamanho:  20
 Nome:  ATIVO   DataTypeName:  Boolean          Type:  1        SubType:  None          Precisão:  0    Tamanho:  0
 Nome:  GEOMETRY        DataTypeName:  Geometry         Type:  66       SubType:  Geometry      Precisão:  0    Tamanho:  0
        Geom Name:  Point2D
        Geom FullName:  Point:2D
        Type:  1
        SubType:  0
        GeometryClass:  <type 'org.gvsig.fmap.geom.jts.primitive.point.Point2D'>
        Dimensão:  2

5.2. Modificando esquemas

No seguinte exemplo, vamos modificar um esquema:

from gvsig import *
from gvsig.geom import *

def main(*args):

        schema = createFeatureType() # DefaultFeatureType

        schema.append("ID", "INTEGER", 10)
        schema.append("NOME", "STRING", 20)
        schema.append("CODE", "STRING", 2)


        # Por índice
        schema.remove(0)
        print "Remove descritor ID: ", schema.getAttrNames()

        # Por descritor
        rm = schema.getEditableAttributeDescriptor("CODE")
        schema.remove(rm)
        print "Remove descritor CODE: ", schema.getAttrNames()

        # Adiciona o campo geometria
        schema.append("GEOMETRY", "GEOMETRY")
        schema.get("GEOMETRY").setGeometryType(POINT, D2)
        print " Adiciona o campo geometria: ", schema.getAttrNames()

Mostra no console o seguinte:

Remove descritor ID:  [u'NOME', u'CODE']
Remove descritor CODE:  [u'NOME']
Adiciona o campo geometria:  [u'NOME', u'GEOMETRY']

5.3. Esquema para camadas vetoriais

Para a criação de uma camada vetorial, será similar ao exemplo, que deverá ter somente um campo GEOMETRY do tipo GEOMETRY. Depois de criar este campo, teremos que definir qual o tipo de geometria.

No exemplo mostramos o caso típico de criação de uma nova camada vetorial:

from gvsig import *
from gvsig.geom import *

def main(*args):

        schema = createFeatureType() # DefaultFeatureType

        schema.append("ID", "INTEGER", 10)
        schema.append("NOME", "STRING", 20)
        schema.append("GEOMETRY", "GEOMETRY")
        schema.get("GEOMETRY").setGeometryType(POINT, D2)

        shape = createShape(schema)
        currentView().addLayer(shape)