[gdal-dev] Shapefile read/write
Howard Butler
hobu.inc at gmail.com
Tue Dec 4 12:06:45 EST 2007
Me too :) I seem to remember making the same mistake(s) the last time
I tried to do something similar...
Howard
On Dec 4, 2007, at 11:01 AM, Mullins, Steven wrote:
> Frank,
>
> Works perfect! Now I understand OGR's data handling better too.
>
> Many thanks,
>
> Steve
>
> -----Original Message-----
> From: Frank Warmerdam [mailto:warmerdam at pobox.com]
> Sent: Tue, December 04, 2007 11:26 AM
> To: Mullins, Steven
> Cc: gdal-dev at lists.osgeo.org
> Subject: Re: FW: [gdal-dev] Shapefile read/write
>
>
> Mullins, Steven wrote:
>> Frank,
>>
>> Thanks for the reply. It runs without an error, but is not
>> updating the shapefile on disk. My Python code is below. Perhaps
>> I am not opening the file correctly. I can't find any good example
>> to go by. Every example I found copies the schema and data to a
>> new file using recursion over the fields. I also found an old list
>> email (2005) that stated that shapefile write-backs did not work in
>> OGR at that time. A shapefile write-back would be ideal for me, if
>> It can be done. Do any errors jump out at you?
>>
>> Thanks,
>>
>> Steve
>>
>> ###############################################
>> #!/usr/local/bin/python
>> # read SHP file and update attributes per coordinates
>>
>> import ogr
>> import osr
>> import string
>>
>> ###############################################
>> # Data Source
>> data_source = ogr.Open('./shapefiles83/rainfalls-active/rainfalls-
>> active.shp')
>
> Steven,
>
> Thi is your first problem. You need to open the file in update
> mode. Try:
>
> data_source = ogr.Open('./shapefiles83/rainfalls-active/rainfalls-
> active.shp',1)
>
> But also the following never actually sends the modified feature
> back to the layer.
>
>> while current_feature is not None:
>> current_point = current_feature.GetGeometryRef()
>> current_feature.SetField ( 0, current_point.GetX())
>> current_feature.SetField ( 1, current_point.GetY())
>> current_feature = layer_0.GetNextFeature()
>> layer_0.SyncToDisk()
>> data_source.Destroy()
>
> Try adding:
>
> layer.SetFeature( current_feature )
>
> after the two SetField calls. The SetFeature() call tells the
> layer to write this feature back to disk. It is often unclear to
> people, but the feature object is not a direct proxy for the data
> in the datastore. It is a relatively freestanding feature in
> memory that you can manipulate and use. If you want changes to it
> to be reflected in the file, then you need to explicitly request it.
>
> Best regards,
> --
> ---------------------------------------
> +--------------------------------------
> I set the clouds in motion - turn up | Frank Warmerdam, warmerdam at pobox.com
> light and sound - activate the windows | http://pobox.com/~warmerdam
> and watch the world go round - Rush | President OSGeo, http://osgeo.org
> _______________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/gdal-dev
More information about the gdal-dev
mailing list