Posted by & filed under QGIS.

One of the really cool features in QGIS that doesn’t get much press is the ability to run actions based on a feature selection. Under 1.7.4 this works by using the identify tool and then choosing an action from the action list in the identified feature(s) attributes. A new improvement in QGIS master (and should be in the upcoming 1.8) added by Giuseppe Sucameli adds an action map tool which allows you to click on any feature and run a related action. Actions can include tokens referencing feature attributes so that you can, for example, display a picture related to a feature using an external program, passing the program a file name taken from an attribute of the selected feature. Most people immediately grasp that you can just add the name of an external app e.g. firefox and pass attributes as parameters. There are some shortcomings with this approach in that it adds an unknowable dependency – will the end-user have the software required to execute the action on their system? Its easy to forget that QGIS sits on top of the incredibly powerful and versatile Qt4 library, and all that goodness is just a heartbeat away with a python line or two. Also, in QGIS actions can be arbitrary, tokenised (i.e. using variable information based on the contents of a field attribute) python commands! In this short article I will demonstrate how to use an a python action to show a web page. The url will be generated based on an attribute value and best of all, it requires no browser on the user’s system since it uses the Qt4 QWebView class (which is a webkit based html widget) to display the content in a pop up window.

Our webkit popup window after clicking on South Africa with the action map tool.

Our webkit popup window after clicking on South Africa with the action map tool.

For this article I used the ‘gadm’ global borders dataset which I described a little in a previous article. My intention is to use the ‘name_0′ attribute to construct a wikipedia url like this:

http://wikipedia.org/wiki/South_Africa

Note: that this is a completely contrived example, I haven’t checked to see if it will work in all possible values obtained from the gadm name_0 field.

Ok so to create our layer action, open the gadm layer properties dialog and head over to the Actions tab.

Now set up a new action using the following properties for the action:

Type: Python

Name: Wikipedia

Action (as listed below but all on one single line):

from PyQt4.QtCore import QUrl; from PyQt4.QtWebKit import QWebView;  myWV = QWebView(None);
myWV.load(QUrl('http://wikipedia.org/wiki/[% "name_0" %]')); myWV.show()

Ok so there are a couple of things going on here:

  • All the python code is in a single line with semi-colons separating commands instead of newlines
  • [% “name_0″ %] will be replaced by the actual attribute value when the action is invoked
  • The code simply creates a new QWebView instance, sets its url and then calls show to make it visible as a window on the user’s desktop

As I mentioned, this is a contrived example – in the real world more likely you might import your logic from a python module and then call a function with a field attribute as parameter. You could equally use the approach to display an image without requiring that the user has a particular image viewer on their system.

 

  • Pingback: A python layer action to open a wikipedia page in QGIS « Linfiniti Geo Blog « bloco de notas

  • gene

    in my case (Mac OS X)
    from PyQt4.QtCore import QUrl; from PyQt4.QtWebKit import QWebView; myWV = QWebView(None); myWV.load(QUrl(‘http://wikipedia.org/wiki/[%NAME_0]’)); myWV.show()
    or
    Import from PyQt4.QtCore QUrl; import from PyQt4.QtWebKit QWebView; myWV QWebView = (None); myWV.load (QUrl (‘% http://wikipedia.org/wiki/ %NAME_0′)); myWV.show ()
    works
    Import from PyQt4.QtCore QUrl; import from PyQt4.QtWebKit QWebView; myWV QWebView = (None); myWV.load (QUrl (‘http://wikipedia.org/wiki/ [%”name_0″%]’)); myWV . show ()
    not

    • gene

      it is
      from PyQt4.QtCore import QUrl; from PyQt4.QtWebKit import QWebView; myWV = QWebView(None); myWV.load(QUrl(‘http://wikipedia.org/wiki/%NAME_0′)); myWV.show()
      or
      from PyQt4.QtCore import QUrl; from PyQt4.QtWebKit import QWebView; myWV = QWebView(None); myWV.load(QUrl(‘http://wikipedia.org/wiki/[%NAME_0]’)); myWV.show()

    • http://linfiniti.com Tim Sutton

      Hi

      Sorry I should have mentioend that I did the above on QGIS master build – which might explain the small syntactical differences. Glad you got it working though and thanks for sharing!

      regards

      Tim

  • Kurt

    Tim, thanks for this very interesting post.

    Unfortunately I cant get it working (using qgis 1.8 on windows) and I also tried the code examples, which gene posted. I must make a terrible beginners error

    May I please aks you for the complete example ([email protected])?

    thanks

    Kurt

  • Kurt

    Tim,
    after fiddling around I got it working, great tipp
    thanks Kurt