To copy the attributes from one polygon layer to another where both polygons more or less - but not perfectly - overlap can be done by defining a point inside the polygon of one of the layer (here: the one called new
) and check within which polygon of the other layer (here: old
) this point is. Like this you reduce the problem of not-perfectly-overlapping to a point and ignore the (slightly) differing shapes of the two versions of polygons.
Once identified the polygons belonging togethis in this way, it is easy to copy the attributes from the old one to the new one. This can be done using QGIS expressions with Field calculator - see below for the expression to use.
Red labels come from the attribute table of layer old
, blue labels are generated on the new
layer using the expression below:

Use this expression on the new layer and replace old
with the name of your old polyon layer:
attribute (
get_feature_by_id (
'old',
array_max (
array_foreach (
overlay_nearest ('old', $id, limit:=12),
if (
within (
point_on_surface ($geometry),
geometry (
get_feature_by_id ('old',@element)
)
),
@element,
''
)
)
)
),
'name_of_the_attribute_you_want_to_copy'
)