wiki:GSoC/2021/EasyToUseCliAndApiIdea

Version 1 (modified by wenzeslaus, 22 months ago) ( diff )

move idea details from the main page

New Easy-to-use CLI and API Idea

  • Make running of GRASS GIS modules as easy as it is to run GDAL commands.
  • GRASS GIS requires GRASS GIS Database, Location and Mapset to be set up to maintain data consistency, efficiency and security. Unfortunately, this is cumbersome when GRASS GIS is not the primary tool user is using.
  • There are different ways for calling GRASS modules without starting iterative GRASS session:
    • Modules executed with the --exec interface (see the grass7 manual page >=7.2)
    • GRASS_BATCH_JOB: same as newer --exec but through environmental variable and more limited
    • Use grass.script.setup package from GRASS GIS (requires boilerplate to add the packages on path first)
    • Use the standalone grass_session package (new, see here)
    • Set up environmental variables and "RC file" yourself (the classic method).
  • None of these allows the user to skip the database setup phase. This leads to the need for constant reimplementing of setup, import and export steps in various software and environments including user scripts (in Bash, Python, R), QGIS Processing, gvSIG/SEXTANTE, uDig/JGrassTools, and all the web/server/cloud tools and applications which use GRASS GIS as a processing backend (e.g. PyWPS server).
  • GRASS GIS itself can make it easier for the callers (at least in most cases) by implementing an interface which would allow to use GRASS GIS modules without explicit dealing with GRASS GIS database.
  • The command line call using the proposed interface would look like these:
grass run r.lake elevation=some/file.tiff water_level=10 lake=some/new/file.tiff coordinates=100,520
grass run r.slope.aspect elevation=file://.../elevation.tiff aspect=file://...aspect.tiff
grass run r.slope.aspect elevation=https://.../elevation.tiff.zip aspect=file://...aspect.tiff
  • Basic execution phases:
    • The grass command would have to parse the command line, compare it with the module XML interface description, find the files which should be maps (either using file:// and ideally anything else), potentially download and uncompress, and import (or link) them, and then call the actual command (GRASS module).
      • The input maps could be linked (external) rather than imported (except for the cases when projection differs) which should be faster than import.
      • Doing the work in GRASS rather than in the other software would allow GRASS to make the decision about the details, for example the data exchange (r.external vs r.import vs r.in.gdal - see comment from MarkusN for QGIS Processing issue or mailing list).
    • GRASS Database would be created with an appropriate Location (projection based on input files or additional CLI input).
      • The GRASS GIS Database, Location and Mapset should be created on the fly and deleted afterwards (the .grassrc wouldn't be used).
    • Computational region would be set based on input file(s) or additional CLI input.
    • Module execution.
    • The output maps could be be also linked (e.g. r.external.out) with projection same as input which is should be faster then export.
      • Ideally export (as well as import) should work also with PostGIS and databases provided through GDAL/OGR.
  • Proposal should discuss and address how advanced things such raster algebra, multi-map inputs and outputs, temporal framework, cartography and visualization tools will work (or what are the limits).
  • Use should be able to always specify the details manually:
grass run --mapset=/some/directory/grassdata/ncspm/practice1 r.lake elevation=some/file.tiff ...
grass run --region="s=55600 n=60500..." --mask=some/mask.tiff r.lake elevation=some/file.tiff ...
grass run --crs=EPSG:3358 --mask=some/mask.tiff r.lake elevation=some/file.tiff ...
grass run --use=some/file_a.tiff --get=some/file_b.tiff r.slope.aspect elevation=file_a aspect=file_b
  • The system behind the interface will be inherently fragile, so it is necessary to write large amount of tests which would check different combinations of data types and projections.
  • All the underlying code is expected to be in Python, so the project should involve also creation of Python API on the way.
  • Bonus tasks:
    • Making this work for the GUI in the same way. It is expected that this would work for any g.gui.* modules too but implementing similar mechanism also for module dialogs is more work (but some basic implementation might be quite straightforward).
    • Making this connected to the standalone grass_session package.
    • Generalization of the API, so that it incorporates also the concept of remote sessions (see e.g. g.remote on GitHub)
  • Current GRASS code involved:

See also

Note: See TracWiki for help on using the wiki.