Hi all, developping EasyCustomLabeling plugin that duplicates layers into memory layers, and also testing brand new duplicate plugin,* we found a very cheating behaviour with field Id's and AttributeMap() / AddAttribute methods of QgsFeature()*.
I'll try to be as clear as possible: *Qgis provider masks some fields types to user*, such as *oid, fid or geometry* (if used as displayed geom). This is true for postgis. I guess other spatial databases are concerned too. *What happens: * - if good data admin practice,* oid and geometry fields are generally stored as last fields *in table or views . (test_oid_geom_at_the_end.jpeg) :* Everything goes fine* / ex: CREATE OR REPLACE VIEW dce.rwbody_ag_testoid_end AS SELECT rwbody.eu_cd, masse_eau.nom_masse_eau, masse_eau.nature::character varying AS nature, rwbody.region_cd, rwbody.system, rwbody.geoml93, rwbody.oid FROM rwbody; / - *If oid or fid or geom field are NOT last fields (test_oid_third_geomend.jpeg )* / ex: CREATE OR REPLACE VIEW dce.rwbody_ag_testoid_end AS SELECT rwbody.eu_cd, masse_eau.nom_masse_eau, rwbody.oid masse_eau.nature::character varying AS nature, rwbody.region_cd, rwbody.system, rwbody.geoml93 FROM rwbody; / Fields are masked but ids are just omitted. Just have a look to field id's in layer properties to check this by yourself. When copying fields or attributes from that source table to a target table will not copy attributes in the right columns . Id handling seems is different between fetch attribute with attributeMap() and SetAttributes().. First one increment ids without oid / fid /geom fields, the other one does... As a workaround, it is necessary to handle its own incremented id, *but, this workaround is not possible when attributes are NULL, because SourceFeature.attributeMap() only returns NOT empty attributes*. Looping on that attributeMap is quite tricky: -- this code is mixing attributes: for SourceFeature in sourcelayer.selectedFeatures(): Targetfeature = QgsFeature() sourceAttrs = SourceFeature.attributeMap() Targetfeature.setAttributeMap(sourceAttrs) targetProvider.addFeatures( [ Targetfeature] ) -- this is a workaround : for SourceFeature in sourcelayer.selectedFeatures(): Targetfeature = QgsFeature() sourceattrs = SourceFeature.attributeMap() idx = 0 for k,v in sourceattrs .iteritems(): Targetfeature .changeAttribute(idx, v) idx = idx + 1 targetProvider.addFeatures( [ Targetfeature] ) *My question : Is possible to correct attributeMap() and setAttributeMap() methods so that they both handle the same way ids, even if some are masked? * This would be really easier to handle, especially with growing number of users with SpatialDB. Cheers, RĂ©gis -- View this message in context: http://osgeo-org.1560.n6.nabble.com/Messy-field-s-Id-handling-with-AttributeMap-and-fieldmaps-if-oid-fid-geom-fields-tp4994389.html Sent from the Quantum GIS - Developer mailing list archive at Nabble.com. _______________________________________________ Qgis-developer mailing list Qgis-developer@lists.osgeo.org http://lists.osgeo.org/mailman/listinfo/qgis-developer