Tuesday 19 June 2018

Simple thematic mapping of shapefile using Python?


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?



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


No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...