After the post of Etienne Tourigny about "Using/visualizing 3D data (Z values)", I realized that it was relatively easy from the Python console with matplotlib or visvis (new pure Python library for visualization of 1D to 4D data, http://code.google.com/p/visvis/ <http://code.google.com/p/visvis/> ).
*1) 3D shapefile* *a) with matplotlib.meshgrid* With a 3d point shapefile, the *shapely* module makes it very easy to extract the z coordinate: from mpl_toolkits.mplot3d.axes3d import * import pylab as plt from matplotlib import cm from matplotlib.mlab import griddata import numpy as np from shapely.wkb import loads x=[] y=[] z=[] for elem in layer.selectedFeatures(): geom= elem.geometry() wkb = geom.asWkb() x.append(loads(wkb).x) y.append(loads(wkb).y) z.append(loads(wkb).z) now, with the x,y,z coordinates, we can build a grid/surface with the matplotlib.meshgrid function xi = np.linspace(min(x), max(x)) yi = np.linspace(min(y), max(y)) X, Y = np.meshgrid(xi, yi) Z = griddata(x, y, z, xi, yi) and draw it in a 3D matplotlib window fig = plt.figure() ax = Axes3D(fig) ax.plot_surface(X, Y, Z, rstride=5, cstride=5, cmap=cm.jet,linewidth=1, antialiased=True) plt.show() <http://osgeo-org.1560.n6.nabble.com/file/n5005360/splinematplotlib.jpg> It is also possible to plot the points or the contours in 3D <http://osgeo-org.1560.n6.nabble.com/file/n5005360/contourpts.jpg> *with visvis* import visvis visvis.plot(x,y,z, lc='k', ls='', mc='g', mw=2, lw=2, ms='.') visvis.surf(xi, yi, Z) <http://osgeo-org.1560.n6.nabble.com/file/n5005360/splinevisvis.jpg> *b) with splines algorithms from scipy* It is also possible to use other interpolation algorithms like the spline interpolation class BivariateSpline <http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.BivariateSpline.html#scipy.interpolate.BivariateSpline> of scipy *with matplotlib* import scipy as sp from scipy.interpolate import SmoothBivariateSpline spl = SmoothBivariateSpline(x,y,z) # construction of the grid/surface x = np.array(x) y = np.array(y) xn, yn = sp.mgrid[x.min():x.max():50j,y.min():y.max():50j] zspline = spl( xn[:,0], yn[0,:]) fig = plt.figure() ax = Axes3D(fig) ax.plot_surface(xn, yn, zspline) plt.show() *with visvis* import visvis visvis.surf(xn,yn,zspline) *2) shapefile with z attribute* This is the same thing, but we must use the values of the attribute *Conclusions and a plugin ?* Build a plugin seems a priori to me very complex and time consuming - plot 3 d points is easy. - but in other cases, all the scenarios (3D shapefile points, lines or polygons, shapefile with z attribute, interpolation algorithm, ...) should be considered before - you need modules like shapely or matplotlib I do not have much time to write a plugin and personally I'm very happy with the Python console, sorry. <http://osgeo-org.1560.n6.nabble.com/file/n5005360/pythonconsole3.jpg> Then, If somebody else wants to go,I can help -- View this message in context: http://osgeo-org.1560.n6.nabble.com/visualizing-3D-data-Z-values-or-data-with-z-attribute-a-solution-tp5005360.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