6 votos

¿Programar el campo del shapefile con áreas de polígonos en OGR?

Estoy intentando rellenar mediante programación un campo shp con áreas poligonales:

import sys
import ogr

ds = ogr.Open( 'tttttttttt.shp', update = 1 )
if ds is None:
    print "Open failed./n"
    sys.exit( 1 )

lyr = ds.GetLayerByName( "tttttttttt" )
lyr.ResetReading()

field_defn = ogr.FieldDefn( "Area", ogr.OFTReal )
lyr.CreateField(field_defn)

for i in lyr:
    # feat = lyr.GetFeature(i) 
    geom = i.GetGeometryRef()
    area = geom.GetArea()
    print 'Area =', area
    lyr.SetFeature(i)
    i.SetField( "Area", area )

ds = None

Pero me salen valores vacíos en el campo...

0 votos

¿Puede compartir un archivo de forma ficticia?

0 votos

¿Cómo lo comparto? ¿Por correo electrónico?

0 votos

15voto

shsteimer Puntos 8749

Tienes que usar lyr.SetFeature(i) para activar la actualización en su archivo shape. Al final tendrás que cerrar las fuentes de datos para que las cosas se escriban.

import sys
import ogr

ds = ogr.Open( 'tttttttttt.shp', update = 1 )
if ds is None:
    print "Open failed./n"
    sys.exit( 1 )

lyr = ds.GetLayerByName( "tttttttttt" )
lyr.ResetReading()

field_defn = ogr.FieldDefn( "Area", ogr.OFTReal )
lyr.CreateField(field_defn)

for i in lyr:
    # feat = lyr.GetFeature(i) 
    geom = i.GetGeometryRef()
    area = geom.GetArea()
    print 'Area =', area
    lyr.SetFeature(i)
    i.SetField( "Area", area )
    lyr.SetFeature(i)
ds = None

*Comentario de baja repercusión y preocupación: Si el campo 'Area' ya existe, este código crea un campo extra, como "Area_n", y sobrescribe el campo Area existente. Tal vez la gente debería añadir algún código de seguridad como:

ldef = lyr.GetLayerDefn()
if ldef.GetFieldIndex("Area") != -1:
    print "'Area' field already defined"
    ... # exit or overwrite logic

0 votos

De nada. Un upvote también estaría bien ;-)

0 votos

Tengo un proyecto similar en .net, el código es similar también.En su código se menciona que después de SetField método, debe utilizar SetFeature con el fin de actualizar la capa.Desafortunadamente eso no funciona.¿Alguna idea?

0 votos

@Myra Puede que quieras hacer eso en una pregunta aparte. Lamentablemente, no estoy muy familiarizado con .NET. Espero que otros puedan ayudarte. Sólo tienes que publicar la pregunta :)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X