[Python] create a FID column in shapefile in ogr or geopandas python

Discussão em 'Python' iniciado por Stack, Abril 11, 2025.

  1. Stack

    Stack Membro Participativo

    I need the information of the FID column from a shapefile. Somehow that column is not "shown" when you load shapefile. I need the information of that column because I need to say something like:

    fid id label
    1 1 forest
    2 1 forest
    3 2 water
    4 2 water
    5 3 urban

    I need to know which fids belong to ids X,Y,Z, etc. I tried the following in geopandas. Is there a more efficient way of doing it using geopandas or OGR from osgeo? Thanks

    import os
    import geopandas as gpd
    import numpy as np
    from osgeo import ogr

    # open the training data
    train_cl_fn = os.path.join(src, "train.shp")

    # read the column "id" that already exists. This id column says that feature X belongs to id Y
    X_train_G = gpd.read_file(train_cl_fn)
    class_ids = X_train_G["id"].unique()
    print('class ids: ', class_ids)

    # I create an empty array for the fids
    class_fids = np.array([])
    print('class labels: ', class_fids)

    # add "fidl" column, using "id" and the empty array
    # FID and fid are the same, therefore "fidl"
    X_train_G['fidl'] = X_train_G['id'].map(dict(zip(class_ids, class_fids)))
    print(X_train_G.head())

    # export: rewrite file
    X_train_G.to_file(os.path.join(src, "train.shp"))

    # open the SAME file again, this time in ogr
    train_cl_fn = os.path.join(src, "train.shp")
    driver = ogr.GetDriverByName('ESRI Shapefile')
    train_ds = driver.Open(train_cl_fn, 1) # 0 means read-only. 1 means writeable.
    layer = train_ds.GetLayer()

    for Ft in layer:
    ThisID = int(Ft.GetFID())
    #print('id is {}'.format(ThisID))
    Ft.SetField('fidl',ThisID) # Write the FID to the fidl field
    layer.SetFeature(Ft) # update the feature
    dataSource = None # save/rewrite file with fid info in the fidl column

    Continue reading...

Compartilhe esta Página