4 votos

Necesito ayuda para asignar valores a un campo utilizando OGR en python

Tengo una pregunta similar a esta ¿Cómo se rellena mediante programación un campo shapefile con áreas poligonales en OGR? pero la solución no parece funcionar para mí. Estoy tratando de importar un shapefile de PostGIS en python utilizando OGR, añadir un campo, a continuación, rellenar el campo con los datos de un csv basado en un ID y la fecha. Cuando imprimo los campos para la característica durante el bucle, el campo obtiene los datos correctos pero no está escribiendo en la capa o3_proj (las dos últimas sentencias de impresión). ¿Estoy utilizando la función SetFeature incorrectamente? Soy nuevo en PostGIS y en ogr, así que por favor habla despacio.

import os, ogr, gdal, csv
driver = ogr.GetDriverByName('PostgreSQL')
datasource = driver.Open("PG: host='localhost' port='54321' dbname='chicago' user='postgres'", update = 1)

o3_proj = datasource.GetLayerByName('o3_monitors(geom3528)')

date = []
maxozone = []
aqi = []
aqs_site_id = []

f = csv.reader(open('/ozone/ozone_data.csv','rU'))
x = list(f)

for iii in range(1,len(x)):
    date.append(x[iii][0])
    aqs_site_id.append(x[iii][1])
    maxozone.append(float(x[iii][2]))
    aqi.append(int(x[iii][3]))

daily_field = ogr.FieldDefn('temp_o3',ogr.OFTReal)
o3_proj.CreateField(daily_field)

for feat in o3_proj:
    for jjj in range(0,len(date)):
        if aqs_site_id[jjj] == feat.GetField(0) and date[jjj] == '03/06/2005':
            o3_proj.SetFeature(feat)
            feat.SetField2(6,maxozone[jjj])
            o3_proj.SetFeature(feat)            
            print str(feat.GetField(0))+','+str(feat.GetField(1))+','+str(feat.GetField(2))+','+str(feat.GetField(3))+','+str(feat.GetField(4))+','+str(feat.GetField(5))+','+str(feat.GetField(6))
            print o3_proj.GetFeature(feat.GetFID()).GetField(6)

Resultado de las declaraciones de impresión:

17-031-0064,41.79079,-87.60165,2001,2012,None,0.036
None
17-031-0076,41.7514,-87.71349,2004,2012,None,0.038
None
17-031-4007,42.06028,-87.86323,2002,2012,None,0.035
None
17-031-4201,42.14,-87.79922,2001,2012,None,0.031
None

2voto

Julien Grivaux Puntos 113

Sugiero añadir al final de tu script:-

o3_proj.Destroy()
o3_proj = None

Como en otros tutoriales de OGR que he leído al trabajar en mis scripts, estas llamadas al final se sugieren como necesarias para asegurar no sólo la liberación de memoria, sino también la escritura de datos.

Háganos saber cómo va - ya que su uso de SetFeature() parece correcto por lo que puedo decir. Y puedo ver que has abierto el archivo en modo de actualización.

La otra posibilidad que se me ocurre, si mi sugerencia no funciona, es que tal vez la actualización no sea compatible con los archivos PostGIS por el controlador OGR de GDAL. Habría que comprobarlo.

1voto

Jon Puntos 21

Sé que no es una respuesta directa a tu pregunta pero te aconsejo que uses pyshp para crear y manipular archivos de forma. Está escrito en python puro y es muy fácil de usar. Para editar un shapefile simplemente haga:

e = shapefile.Editor(shapefile="shapefiles/test/name.shp")

A continuación, añada un campo

e.field("add_field","C","30")

Pues bien, a continuación, inicie su bucle y rellénelo con

e.record("value")

Cuando haya terminado, llame al método de guardar w.save() . Eso es todo.

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