Analytical data visualizations at ICC 2017: Difference between revisions
⚠️Wenzeslaus (talk | contribs) (→Running modules: replace images by r.viewshed command) |
⚠️Wenzeslaus (talk | contribs) |
||
Line 264: | Line 264: | ||
== Scripting of rendering in GRASS GIS == | == Scripting of rendering in GRASS GIS == | ||
<source lang="python"> | |||
import grass.script as gs | |||
for point_id in [0.5, 1, 2, 5]: | |||
gs.run_command('d.mon', start='cairo', | |||
output='viewshed_{}.png'.format(point_id)) | |||
gs.run_command('d.rast', | |||
map='viewshed_{}'.format(point_id)) | |||
gs.run_command('d.mon', stop='cairo') | |||
</source> | |||
To | |||
<source lang="python"> | |||
os.environ['GRASS_FONT'] = 'sans' | |||
os.environ['GRASS_RENDER_IMMEDIATE'] = 'cairo' | |||
os.environ['GRASS_RENDER_FILE_READ'] = 'TRUE' | |||
os.environ['GRASS_LEGEND_FILE'] = 'legend.txt' | |||
os.environ['GRASS_RENDER_FILE'] = 'map.png' | |||
</source> | |||
== See also == | == See also == |
Revision as of 21:00, 19 June 2017
This is material for two sessions at the ICC 2017 workshop called Analytical data visualizations with GRASS GIS and Blender and Mapping open data with open source geospatial tools held in Washington, DC, July 1-2, 2017. These two sessions introduce GRASS GIS, example of its processing capabilities, and visualization techniques relevant to spatio-temporal data and high performance computing (HPC). Participants interactively visualize open data and design maps with several open source geospatial tools including Tangible Landscape system.
Software
We will use GRASS GIS 7.2.
MS Windows
Then download standalone GRASS GIS 7.2. binaries (64-bit version, or 32-bit version) from grass.osgeo.org. During the installation you can also download North Carolina sample dataset so please select this option. You can also download the dataset later (see the following section).
Mac OS
Install GRASS GIS 7.2 using Homebrew osgeo4mac:
brew tap osgeo/osgeo4mac brew install grass7
OSGeo-Live
All needed software is included except for Blender.
Ubuntu
Install GRASS GIS from packages:
sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable sudo apt-get update sudo apt-get install grass
Linux
Install GRASS GIS from packages:
sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable sudo apt-get update sudo apt-get install grass
For other Linux distributions other then Ubuntu, please try to find GRASS GIS in their package managers.
Data
Prepared data
- digital surface model derived from North Carolina Flood Plain Mapping lidar
- orthophoto
Download OpenStreetMap data
We will use overpass turbo (web-based data filtering tool) to create and run Overpass API queries to obtain OSM data.
You can use Wizard to create simple queries on the currently zoomed extent. Zoom to a small area and paste for example this into the Wizard and run the query:
highway=* and type:way
The query was built in the editor and ran and you can see the results in a map now.
Now, paste this query in the editor window:
[out:json][timeout:25]; // gather results ( // query part for: “highway=*” way["highway"](35.76599,-78.66249,35.77230,-78.65261); ); // print results out body; >; out skel qt;
It finds roads in our study area. When you run the query, the roads appear on the map and we can export them as GeoJSON.
[out:json][timeout:25]; // gather results ( // query part for: “building=*” way["building"](35.76599,-78.66249,35.77260,-78.65261); ); // print results out body; >; out skel qt;
Build and run query Export as GeoJSON
Introduction to GRASS GIS
Here we provide an overview of GRASS GIS. For this exercise it's not necessary to have a full understanding of how to use GRASS GIS. However, you will need to know how to place your data in the correct GRASS GIS database directory, as well as some basic GRASS functionality.
Structure of the GRASS GIS Spatial Database
GRASS uses unique database terminology and structure (GRASS GIS Spatial Database) that are important to understand for working in GRASS GIS efficiently. You will create a new location and import the required data into that location. In the following we review important terminology and give step by step directions on how to download and place you data in the correct place.
- A GRASS GIS Spatial Database (GRASS database) consists of directory with specific Locations (projects) where data (data layers/maps) are stored.
- Location is a directory with data related to one geographic location or a project. All data within one Location has the same coordinate reference system.
- Mapset is a collection of maps within Location, containing data related to a specific task, user or a smaller project.
-
GRASS GIS Spatial Database structure
Creating a GRASS database for the tutorial
Unless you already have a directory called grassdata in your Documents directory (on MS Windows) or in your home directory (on Linux), create one. You can use the Browse button and the dialog in the GRASS GIS start up screen to do that.
-
GRASS GIS 7.2 startup dialog
Displaying and exploring data
Now that we have the data in the correct GRASS database, we can launch the Graphical User Interface (GUI) in Mapset user1.
The GUI interface allows you to display raster, vector data as well as navigate through zooming in and out. More advanced exploration and visualization is also possible using, e.g., queries and adding legend. The screenshots below depicts how you can add different map layers (left) and display the metadata of your data layers.
-
Add raster map layer
-
Add raster legend
-
Layer Manager and Map Display overview. Annotations show how to add raster layer, query, add legend.
-
Show raster map metadata by right click on layer
GRASS GIS modules
One of the advantages of GRASS is the diversity and number of modules that let you analyze all manner of spatial and temporal. GRASS GIS has over 500 different modules in the core distribution and over 230 addon modules that can be used to prepare and analyze data layers.
GRASS functionality is available through modules (tools, functions). Modules respect the following naming conventions:
Prefix | Function | Example |
---|---|---|
r.* | raster processing | r.mapcalc: map algebra |
v.* | vector processing | v.clean: topological cleaning |
i.* | imagery processing | i.segment: object recognition |
db.* | database management | db.select: select values from table |
r3.* | 3D raster processing | r3.stats: 3D raster statistics |
t.* | temporal data processing | t.rast.aggregate: temporal aggregation |
g.* | general data management | g.rename: renames map |
d.* | display | d.rast: display raster map |
These are the main groups of modules. There is few more for specific purposes. Note also that some modules have multiple dots in their names. This often suggests further grouping. For example, modules staring with v.net. deal with vector network analysis.
The name of the module helps to understand its function, for example v.in.lidar starts with v so it deals with vector maps, the name follows with in which indicates that the module is for importing the data into GRASS GIS Spatial Database and finally lidar indicates that it deals with lidar point clouds.
Finding and running a module
To find a module for your analysis, type the term into the search box into the Modules tab in the Layer Manager, then keep pressing Enter until you find your module.
Alternatively, you can just browse through the module tree in the Modules tab. You can also browse through the main menu. For example, to find information about a raster map, use: Raster → Reports and statistics → Basic raster metadata.
-
Search for a module in module tree (searches in names, descriptions and keywords)
-
Modules can be also found in the main menu
Running a module as a command
If you already know the name of the module, you can just use it in the command line. The GUI offers a Command console tab with command line specifically build for running GRASS GIS modules. If you type module name there, you will get suggestions for automatic completion of the name. After pressing Enter, you will get GUI dialog for the module.
-
Automatic suggestions when typing name of the module: By typing prefix r. we make a list of modules starting with that prefix to show up.
You can use the command line to run also whole commands for example when you get a command, i.e. module and list of parameters, in the instructions.
Command line vs. GUI interface
GRASS modules can be executed either through a GUI or command line interface. The GUI offers a user-friendly approach to executing modules where the user can navigate to data layers that they would like to analyze and modify processing options with simple check boxes. The GUI also offers an easily accessible manual on how to execute a model. The command line interface allows users to execute a module using command prompts specific to that module. This is handy when you are running similar analyses with minor modification or are familiar with the module commands for quick efficient processing. In this workshop we provide module prompts that can be copy and pasted into the command line for our workflow, but you can use both GUI and command line depending on personal preference. Look how GUI and command line interface represent the same tool.
Task: compute aspect (orientation) from provided digital elevation model using module r.slope.aspect using both module dialog and command line.
- How to find modules? Modules are organized by their functionality in wxGUI menu, or we can search for them in Search modules tab. If we already know which module to use, we can just type it in the wxGUI command console.
Module parameters
-
Module dialog
The same analysis can be done using the following command:
r.neighbors -c input=elevation output=elev_smooth size=5
Conversely, you can fill the GUI dialog parameter by parameter when you have the command.
Computational region
Before we use a module to compute a new raster map, we must set properly computational region. All raster computations will be performed in the specified extent and with the given resolution.
Computational region is an important raster concept in GRASS GIS. In GRASS a computational region can be set, subsetting larger extent data for quicker testing of analysis or analysis of specific regions based on administrative units. We provide a few points to keep in mind when using the computational region function:
- defined by region extent and raster resolution
- applies to all raster operations
- persists between GRASS sessions, can be different for different mapsets
- advantages: keeps your results consistent, avoid clipping, for computationally demanding tasks set region to smaller extent, check your result is good and then set the computational region to the entire study area and rerun analysis
- run
g.region -p
or in menu Settings - Region - Display region to see current region settings
-
Computational region concept: A raster with large extent (blue) is displayed as well as another raster with smaller extent (green). The computational region (red) is now set to match the smaller raster, so all the computations are limited to the smaller raster extent even if the input is the larger raster. (Not shown on the image: Also the resolution, not only the extent, matches the resolution of the smaller raster.)
-
Simple ways to set computational region from GUI. On the left, set region to match raster map. On the right, select the highlighted option and then set region by drawing rectangle.
-
Set computational region (extent and resolution) to match a raster (Layers tab in the Layer Manager)
The numeric values of computational region can be checked using:
g.region -p
After executing the command you will get something like this:
north: 220750 south: 220000 west: 638300 east: 639000 nsres: 1 ewres: 1 rows: 750 cols: 700 cells: 525000
Computational region can be set also using a vector map. In that case, only extent is set (as vector map does not have any resolution - at least not in the way raster map does). In GUI, this can be done in the same way as for the raster map. In the command line, it looks like this:
g.region vector=lakes
Resolution can be set separately using the res
parameter of the g.region module. The units are the units of the current location, in our case meters. This can be done in the Resolution tab of the g.region dialog or in the command line in the following way (using also the -a
flag to print the new values):
g.region res=3 -p
The new resolution may be slightly modified in this case to fit into the extent which we are not changing. However, often we want the resolution to be the exact value we provide and we are fine with a slight modification of the extent. That's what -a
flag is for.
The following example command will use the extent from the vector named lakes
, use resolution 10
, modify the extent to align it to this 10 meter resolution, and print the values of this new computational region settings:
g.region vector=lakes res=10 -a -p
Running modules
Find the module for computing viewshed in the menu or the module tree under Raster → Terrain analysis → Visibility and aspect or simply run r.viewshed from the Console.
r.viewshed input=elevation output=viewshed coordinates=638587.6,220649.5
3D view
We can explore our study area in 3D view.
- Add elev_lid792_1m and uncheck or remove any other layers.
- Set computational region to this raster. Switch to 3D view (in the right corner on Map Display).
- Adjust the view (perspective, height, vertical exaggeration)
- In Data tab, set Fine mode resolution to 1 and set slope (computed in the previous step) as the color of the surface.
- When finished, switch back to 2D view.
Scripting in GRASS GIS
Introduction to Blender
Animation in GRASS GIS
Scripting of rendering in GRASS GIS
import grass.script as gs
for point_id in [0.5, 1, 2, 5]:
gs.run_command('d.mon', start='cairo',
output='viewshed_{}.png'.format(point_id))
gs.run_command('d.rast',
map='viewshed_{}'.format(point_id))
gs.run_command('d.mon', stop='cairo')
To
os.environ['GRASS_FONT'] = 'sans'
os.environ['GRASS_RENDER_IMMEDIATE'] = 'cairo'
os.environ['GRASS_RENDER_FILE_READ'] = 'TRUE'
os.environ['GRASS_LEGEND_FILE'] = 'legend.txt'
os.environ['GRASS_RENDER_FILE'] = 'map.png'
See also
GRASS GIS at ICC 2017 Unleash the power of GRASS GIS at US-IALE 2017