Take the 2-minute tour ×
Geographic Information Systems Stack Exchange is a question and answer site for cartographers, geographers and GIS professionals. It's 100% free, no registration required.

The following is currently unsuccessful at fulfilling a table field join to a point shapefile in Qgis.
All instances of the join object will print the proper values, and no error is flagged when processing - but the target layer does not exhibit any effect.

Something missing?

    Heads = QgsVectorLayer(headCSV, 'Heads', 'ogr')
    QgsMapLayerRegistry.instance().addMapLayer(Heads)
    self.iface.legendInterface().setLayerVisible(Heads,False)
    grid = ftools_utils.getMapLayerByName(unicode('Grid'))
    joinObject = QgsVectorJoinInfo()
    joinObject.targetFieldName = str('ID')
    joinObject.joinLayerID = Heads.id()
    joinObject.joinFieldName = str('cellID')
    grid.addJoin(joinObject)
    grid.reload()

UPDATE:

The following returns 'None'. I expect this is actually supposed to return the field names to be joined? (e.g. - a clue to the mistake)

    print joinObject.joinFieldNamesSubset()

FURTHER UPDATE:

Added the following, and now the previous update command returns the accurate fields to be joined - yet the destination layer does not show 'joined' fields...

    joinObject.setJoinFieldNamesSubset(['someFieldName'])
share|improve this question
    
Have you read Joining table to shapefile with pyQGIS already? –  gcarrillo Feb 8 at 13:13
    
indeed, this as well gis.stackexchange.com/questions/67062/… –  Katalpa Feb 8 at 13:18

2 Answers 2

up vote 1 down vote accepted

This has worked for me:

# Get input (csv) and target (Shapefile) layers
shp=iface.activeLayer()
csv=iface.mapCanvas().layers()[0]

# Set properties for the join
shpField='code'
csvField='codigo'
joinObject = QgsVectorJoinInfo()
joinObject.joinLayerId = csv.id()
joinObject.joinFieldName = csvField
joinObject.targetFieldName = shpField
shp.addJoin(joinObject)

The error you are facing is, believe it or not, by a typo in joinLayerId. The question is, why QGIS doesn't throw an error there?

share|improve this answer
1  
You are exactly right. Works beautifully now. Highly appreciate the help. A mistake easily overlooked it seems without a syntax error. Thanks! –  Katalpa Feb 8 at 15:10

If it's ok for you to use Processing algorithms for that, it's as simple as this (from the QGIS Python console):

import processing
res = processing.runalg("qgis:joinattributestable","/path/to/shape.shp","/path/to/table.csv","fieldShp","fieldTable","/path/to/output.shp")
layer = QgsVectorLayer(res['OUTPUT_LAYER'], "joined layer", "ogr")
QgsMapLayerRegistry.instance().addMapLayer(layer)

You can have a look at the algorithm source code so that you decide whether you want to adapt it for your own script.

share|improve this answer
    
While this is a great alternative, the need is a 'virtual join', as accomplished from the properties menu of a layer. This is because the operation might be done repeatedly, and avoidance of data overhead is a must. –  Katalpa Feb 8 at 13:51
    
Well, you could still use temporary layers setting the last parameter of the algorithm to None, but I see your point. –  gcarrillo Feb 8 at 14:48

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.