from osgeo import ogr
import os

def copyAttributes(layerOut, featureIn):
    
    featureOutDefn = layerOut.GetLayerDefn()
    featureOut = ogr.Feature(featureOutDefn)
    for x in range(featureOutDefn.GetFieldCount()):
        print featureOutDefn.GetFieldDefn(x).GetNameRef(), featureIn.GetField(x)
        print featureOut
        featureOut.SetField(featureOutDefn.GetFieldDefn(x).GetNameRef(), featureIn.GetField(x))    
         
    return featureOut

## READ
driver = ogr.GetDriverByName('ESRI SHAPEFILE')
datasource = driver.Open('src/P_test.shp')
layer = datasource.GetLayer(0)
layerDefn = layer.GetLayerDefn()

## INFOS
#nb Field
nbFieldShp = layerDefn.GetFieldCount()
#nb Feat
nbFeatShp =  layer.GetFeatureCount()
    
if os.path.isfile('src/P_test2.shp')==True:
    os.remove('src/P_test2.shp')
    os.remove('src/P_test2.shx')
    os.remove('src/P_test2.dbf')

## WRITE
newDriver = ogr.GetDriverByName('ESRI SHAPEFILE')
newDatasource =newDriver.CreateDataSource('src/P_test2.shp')
newLayer =newDatasource.CreateLayer('P_test2', None , 1)

#=========================================================
#Checkout the input attribute table, create the outut layer, output attribute table, output layer, and first output feature
#=========================================================
featureInDefn = layer.GetLayerDefn()
#field_count = feature_in_defn.GetFieldCount()#count the number of fields
for x in range(featureInDefn.GetFieldCount()): #iterate through the fields
    fieldDef = featureInDefn.GetFieldDefn(x) #Read the field def. from the input
    try:
        newLayer.CreateField(fieldDef) #Write the field definition from the input attribute table to the output attribute table.
        print "%s field successfully created." %fieldDef.GetNameRef() #Sweet!
    except:
        print "Creating %s field failed." % fieldDef.GetNameRef() #Woops!
        
    

# Write Features
for i in xrange(nbFeatShp):

    # Read Shp Feature
    feature = layer.GetFeature(i)
    
    #Copy the attributes
    newFeature = copyAttributes(newLayer, feature)
    
    # Stock Geometry Shp Feature
    x = feature.GetGeometryRef().GetX()
    y = feature.GetGeometryRef().GetY()
    xBase = int((int(x/1)*1))
    yBase = int((int(y/1)*1))
    if x - xBase >= 0.5:
        x = xBase+0.75
    else:
        x = xBase+0.25
    if y - yBase >= 0.5:
        y = yBase+0.75
    else:
        y = yBase+0.25
    #Create Geometry
    newGeometry = ogr.Geometry(feature.GetGeometryRef().GetGeometryType())
    newGeometry.AddPoint(x,y)
    

    
    #Write Geometry
    newFeature.SetGeometry(newGeometry)
    #The Feat is ready create Feat
    newLayer.CreateFeature(newFeature)
    newFeature.Destroy()
newDatasource.Destroy()
        
print 'done !'
    