Python Thematic Mapping of Shapefile – Simple Visualization Techniques

matplotlibpythonshapefilevisualisation

I wish to visualize geographical data in Python, without using ArcGIS/ArcPy, and make a map.

On the internet I found how to make a thematic map using Python:

Here is some code that I tried:

import shpUtils
import matplotlib.pyplot as plt

shpRecords = shpUtils.loadShapefile('C:\\Users\\shapefile.shp')

for i in range(0,len(shpRecords)):
    x = []
    y = []
    for j in range(0,len(shpRecords[i]['shp_data']['parts'][0]['points'])):

    tempx = float(shpRecords[i]['shp_data']['parts'][0]['points'][j]['x'])
    tempy = float(shpRecords[i]['shp_data']['parts'][0]['points'][j]['y'])
    x.append(tempx)
    y.append(tempy)
    plt.fill(x,y)

plt.axis('equal')
plt.title("Testing")
plt.show()

However, when I run this, it gives me random colors.

If I want to visualise one certain column of my shapefile, how can I implement this using similar code?

This is very unclear in the link provided above where he only discusses the usage of colors…

Would I perhaps need extra modules to accomplish this, like descartes and PySAL?

Best Answer

I do not know ArcPy, but I work with shapefiles and raster in Python for years

  1. For processing shapefiles in Python, there are many modules like osgeo/ogr, Fiona, Pysal or Pyshp (shpUtils is one of them and not the most used), and others, see Pypi: GIS and examples on gis.stackexchange and many examples on the Web (not only in English). Most of them are much older than ArcPy (or arcgisscripting)...
  2. for processing raster you can use osgeo/gdal, the standard
  3. For processing geospatial geometries, there is shapely
  4. For plotting the geometries you can use matplotlib and possibly descartes, "extension" of matplotlib for areas, but also many, many other modules, see Pypi: Plotting and modules like mayavi for 3D representation (matplotlib also)
  5. There are also modules like mapnik which give you directly the possibilities of 1) read a shapefile and 4) plotting with the module Pycairo.

After that, it's like a GIS:

  • you use the modules 1) to open, save the shapefiles and carry out the treatments with other modules like numpy or scipy, if you want.
  • you can use shapely for manipulation and analysis of the geometric objects (buffer, etc.).
  • you can use matplotlib to plot the geometries, but matplotlib do not know what you want to plot. It is your work with modules 1) or 3) to specify what to plot (attributes, etc,.) and how.

If I want to visualise one certain column of my shapefile, how can I implement this in the code?

So, you must learn matplotib and the other modules. You have to learn ArcPy, it's the same...(there are lots of excellent tutorials on the web, especially for matplolib, and it's easier that ArcPy because it is pure Python).

Some examples with Python only

enter image description here

Geological map (polygon shapefile) with colors based on an attribute

enter image description here

3D Points (PointZ shapefile) with color based on an attribute

enter image description here

3D points (Point shapefile with z as attribute) and 3D line (PolyLineZ shapefile) on a DEM, and on a raster draped onto the DEM surface.

enter image description here

Topographic profile with z values and colors based on attributes (geological formations = Cross section) of the original shapefile (Polyline shapefile)

enter image description here

DEM (GeoTIFF) with the module Mayavi2

enter image description here

DEM (ESRI ascii grid, .asc) and Point shapefiles (with z as attribute) with the module visvis

enter image description here

Boreholes (3D buffer of a polylineZ with colors based on an attribute (geological formations), with a grid surface calculated with the modules numpy and matplotlib from a points shapefile (with z as an attribute), visualized with the module visvis