recdbf_toadd[ntag] = int(valtag)
            elif dbf_recc_type[ntag] == 'decimal':
                if valtag == 'None' or valtag == '':
                    recdbf_toadd[ntag] = float()
                else:
                    recdbf_toadd[ntag] = float(valtag)
            elif dbf_recc_type[ntag] == 'string':
                recdbf_toadd[ntag] = str(valtag)
        dbf.write_record(k, recdbf_toadd)
        recdbf_toadd.clear 
    dbf.close()

    #Fill metadata
    gml_generator = GMLGenerator(user_enc)
    input_metadata = utOpen(gml_file)
    retMetadata = meta_import(input_metadata.read())

    l_file = open(os.path.join(FILES_PATH, '%s%s' % (name, '.xml')), 'wb')
    l_file.write(gml_generator.fillExportMetadata(retMetadata, name))
    l_file.close()

    #Fill projection
    input_prj = utOpen(gml_file)
    retProjection = prj_import(input_prj.read())

    l_file = open(os.path.join(FILES_PATH, '%s%s' % (name, '.prj')), 'wb')
    l_file.write(str(retProjection))
    l_file.close()

    res = zip_generator(FILES_PATH, name)
def shp_to_gml(filename, in_schema, user_enc="utf-8", temp_name=None):
    #generate name
    name_tmp = os.path.split(filename)[1]
    if '.' in name_tmp:
        name = name_tmp[:name_tmp.rfind('.')]
    else:
        name = name_tmp

    if temp_name:
        meta_filename = temp_name
    else:
        meta_filename = name

    # Creates the GML file
    inputfilepath = os.path.join(FILES_PATH, filename)

    shp = shapelib.ShapeFile(inputfilepath)
    dbf = dbflib.DBFFile(inputfilepath)

    # GML output
    gml_generator = GMLGenerator(user_enc)

    # Some alias
    shp_read = shp.read_object

    #file read
    if not in_schema:
        in_schema = XSD_FILE
    input_schema = utOpen(in_schema)
    # Fill schema(dbf) information
    conv_gml = gml_sd_import(input_schema.read())



    #Read metadata
    retMetadata = {}
    try:
        input_metadata = utOpen("%s.xml" % os.path.join(FILES_PATH, name))
        retMetadata = meta_import(input_metadata.read())
    except:
        for k in METADATA_LABELS:
            retMetadata[k] = ''

    #Read projection
    try:
        input_prj = utOpen("%s.prj" % os.path.join(FILES_PATH, name)).read()
    except:
        input_prj = ''

    dbf_filter = {}
    for j in range(len(conv_gml.getRec_dbf())):
        ttype, tname, tlen, tdecc = (conv_gml.getRec_dbf())[j]
        dbf_filter[tname] = {'type':ttype, 'len':tlen, 'decc':tdecc}

    gml_data = gml_generator.fillHeader(in_schema)
    gml_data += gml_generator.fillMetadata(retMetadata, meta_filename)
    gml_data += gml_generator.fillProjection(input_prj)
    gml_data += gml_generator.fillBoundingBox(shp.info()[2][0], shp.info()[2][1], shp.info()[3][0], shp.info()[3][1])
    for j in range(dbf.record_count()):
        dbf_ready = {}
        for k,v in ((dbf.read_record(j)).items()):
            if k in dbf_filter:
                if dbf_filter[k]['type'] == 'string':
                    if len(v) is not 0:
                        if len(v) > int(dbf_filter[k]['len']):
                            v = v[:int(dbf_filter[k]['len'])]
                if dbf_filter[k]['type'] == 'decimal':
                    if not len(str(v)) == 0:
                        if not '.' in str(v):
                            v = float(str(v) + ".0")
                        whole,decimal = str(v).split('.')
                        if len(whole) > int(dbf_filter[k]['len']):
                            whole = whole[:int(dbf_filter[k]['len'])]
                        if len(decimal) > int(dbf_filter[k]['decc']):
                            decimal = decimal[:int(dbf_filter[k]['decc'])]
                        v = whole + '.' + decimal
                if dbf_filter[k]['type'] == 'integer':
                    if not len(v) == 0:
                        if len(v) > int(dbf_filter[k]['len']):
                            v = v[:int(dbf_filter[k]['len'])]
                dbf_ready[k] = v
        # Add rest of the records as null
        for kf in dbf_filter:
            if kf not in dbf_ready:
                    dbf_ready[kf] = ''


        # Geometry types
        # Point
        if shp.info()[1] == 1:
            gml_data += gml_generator.fillFeatureMemberPoint("F%s" % j, shp_read(j).vertices()[0][0], shp_read(j).vertices()[0][1], dbf_ready)
        # Polyline
        elif shp.info()[1] == 3:
            gml_data += gml_generator.fillFeatureMemberLine("F%s" % j, shp_read(j).vertices(), dbf_ready)
        # Polygon
        elif shp.info()[1] == 5:
            gml_data += gml_generator.fillFeatureMemberPolygon("F%s" % j, shp_read(j).vertices(), dbf_ready)
    gml_data += gml_generator.fillFooter()

    shp.close()
    dbf.close()

    return gml_data