Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.

For the best experience please use the latest Chrome, Safari or Firefox browser.

Wie schreibe ich ein
GRASS GIS Addon?

Bewährte Praktiken,
Methoden und Werkzeuge

Carmen Tawalika - mundialis - FOSSGIS 2024

mundialis GmbH & Co. KG

Inhalt

. # Einführung

Die Modularität von GRASS GIS

GRASS GIS Module Tafel
* später mehr

Wozu ein eigenes Addon entwickeln?

  • Zusammenspiel und Verkettung mit bestehenden Tools

  • Effiziente Nutzung der GRASS Datenbank

  • Nutzung in actinia

  • Einhaltung von Standards erhöht die Wiederverwendbarkeit

  • ...
GRASS GIS Modul Wordcloud

Minimalversion

Python Skript (C auch möglich)
#!/usr/bin/python

def main():
    print("Created simple addon")


if __name__ == "__main__":
    main()
            
HTML Datei, für Minimalversion leer
Ordnerstruktur
t.fossgis.fortune/
├── Makefile
├── t.fossgis.fortune.html
└── t.fossgis.fortune.py
        
Makefile
MODULE_TOPDIR = ../..
PGM = t.fossgis.fortune
include $(MODULE_TOPDIR)/include/Make/Script.make
default: script
        
## Installation mit g.extension --- GRASS nc_spm_08/fossgis:~ > g.extension extension=t.fossgis.fortune url=t.fossgis.fortune Compiling... Installing... Updating extensions metadata file... Updating extension modules metadata file... WARNING: No metadata available for module 't.fossgis.fortune': 'bytes' object has no attribute 'encode' Installation of <t.fossgis.fortune> successfully finished Aufruf --- GRASS nc_spm_08/fossgis:~ > t.fossgis.fortune Created simple addon
# Konzepte # und # Praxis

Vorgehen

v.example --> umbenennen
├── .flake8
├── .git [...]
├── .github
│   └── workflows
│       └── linting.yml
├── .pre-commit-config.yaml
├── .pylintrc
├── .pylintrc_allowed_to_fail
├── Makefile
├── README.md
├── renovate.json
├── testsuite
│   ├── data
│   │   ├── README.md
│   │   └── area_beuel.geojson
│   └── test_v_example.py
├── v.example.html --> umbenennen
├── v.example.py --> umbenennen
└── v_example.png
        

1. Dokumentation

  • t.fossgis.fortune.html anpassen und um ausführliche Beschreibung ergänzen
  • auch gerne mit Bildern versehen (v.example.png)
<h2>DESCRIPTION</h2>
<em>t.fossgis.fortune</em>
prints fortune cookie sayings.

<h2>SEE ALSO</h2>
<em>
<a href="g.message.html">
g.message</a>
</em>

<h2>AUTHOR</h2>
Carmen Tawalika, mundialis, Germany
        
## 2. Shebang-Zeile und Header - Shebang-Zeile und Header inklusive Autor, Zweck und Lizenz in t.fossgis.fortune.py ergänzen --- #!/usr/bin/env python3 """ ############################################################################ # # MODULE: t.fossgis.fortune # AUTHOR(S): Carmen Tawalika # # PURPOSE: Prints fortune cookie sayings # COPYRIGHT: (C) 2024 by mundialis GmbH & Co. KG and the GRASS Development # Team # # This program is free software; you can redistribute it and/or modify # [...] # GNU General Public License for more details. # ############################################################################# """

    3. Der GRASS Parser

  • Die "Kommentare" # % sind wichtig für den GRASS Parser!
  • Es gibt module, option, flag und rules
  • Es gibt einige Standardoptionen, die erweitert werden können
  • Mit rules können Bedingungen für Parameter bestimmt werden
  • Die Parameter können in der main Funktion eingelesen werden, z.B. options['input']
  • Beispielaufruf: t.fossgis.fortune input=elevation
# %Module
# % description: Prints fortune...
# % keyword: general
# % keyword: fortune
# %end

# %option G_OPT_V_INPUT
# % key: input
# % required: no
# % description: Polygon to...
# %end

# %option
# % key: box
# % description: Width and height
# % type: double
# % answer: 10,10
# % required: yes
# %end

# %flag
# % key: v
# % description: Print fortune...
# %end

# %rules
# % requires: input,box
# %end
      

4. main.py und cleanup

if __name__ == "__main__":
    options, flags = grass.parser()
    atexit.register(cleanup)
    main()
def cleanup():
"""Cleanup function (can be extended)"""
nulldev = open(os.devnull, "w", encoding="utf-8")
kwargs = {"flags": "f", "quiet": True, "stderr": nuldev}
for rmvec in rm_vec:
    if grass.find_file(name=rmvec, element="vector")["file"]:
        grass.run_command("g.remove", type="vector", name=rmvec, **kwargs)
## 5. grass.script - Nutzung von vorgefertigten Funktionen aus [GRASS GIS source code](https://grass.osgeo.org/grass83/manuals/libpython/script.html) - Nutzung von existierenden Modulen - i18n --- import grass.script as grass try: from fortune import fortune except: grass.fatal(_("No fortune")) grass.message(_(fortune())) --- kachel = grass.parse_command( "v.db.select", map=overlay, columns="cat", flags="c", quiet=True) grass.run_command( "v.extract", input=overlay, output=f"{options['output']}_{kachel}", cats=kachel)

Zwischenstand

import grass.script as grass

try:
    from fortune import fortune
except:
    grass.fatal(_("No fortune"))

def main():
    grass.message(_(fortune()))


if __name__ == "__main__":
    options, flags = grass.parser()
    atexit.register(cleanup)
    main()

Zwischenstand

GRASS nc_spm_08/fossgis > g.extension extension=t.fossgis.fortune url=t.fossgis.fortune
WARNING: Extension <t.fossgis.fortune> already installed. Re-installing...
[...]
Installation of <t.fossgis.fortune> successfully finished

GRASS nc_spm_08/fossgis > t.fossgis.fortune --help
Prints fortune cookie sayings.

Usage:
 t.fossgis.fortune [-v] [input=name] [box=value] [--help] [--verbose]
   [--quiet] [--ui]

Flags:
  -v   Print fortune version and exit

Parameters:
  input   Name of input vector map
    box   Width and height
          default: 10,10
GRASS nc_spm_08/fossgis > t.fossgis.fortune
Sanity and insanity overlap a fine grey line.
# Qualitätssteigerung und Arbeitserleichterung

Wiederverwendbare GitHub Worflows

[flake8]
# E402 module level import not at top of file
# F821 undefined name '_'
exclude = .git
max-line-length = 80
per-file-ignores =
    ./v.example.py: F821, E402
name: Python Flake8, black and pylint code quality check
on: [push, pull_request]
jobs:
  lint:
    uses: mundialis/github-workflows/
          .github/workflows/linting.yml@main
        
t.fossgis.fortune
├── .flake8
├── .git [...]
├── .github
│   └── workflows
│       └── linting.yml
├── .pre-commit-config.yaml
├── .pylintrc
├── .pylintrc_allowed_to_fail
├── Makefile
├── README.md
├── renovate.json
├── testsuite
│   ├── data
│   │   ├── README.md
│   │   └── area_beuel.geojson
│   └── test_v_example.py
├── t.fossgis.fortune.html
├── t.fossgis.fortune.py
└── t.fossgis.fortune.png
        

Wiederverwendbare GitHub Worflows

repos:
-   repo: https://github.com/mundialis/github-workflows
    rev: 1.0.3
    hooks:
    -   id: linting
{
    "$schema": "https://docs.renovatebot.com/
                renovate-schema.json",
    "extends": [
        "config:base"
    ],
    "pre-commit": {
        "enabled": true
    }
}
t.fossgis.fortune
├── .flake8
├── .git [...]
├── .github
│   └── workflows
│       └── linting.yml
├── .pre-commit-config.yaml
├── .pylintrc
├── .pylintrc_allowed_to_fail
├── Makefile
├── README.md
├── renovate.json
├── testsuite
│   ├── data
│   │   ├── README.md
│   │   └── area_beuel.geojson
│   └── test_v_example.py
├── t.fossgis.fortune.html
├── t.fossgis.fortune.py
└── t.fossgis.fortune.png
            

Wiederverwendbare GitHub Worflows

name: Run tests for GRASS GIS addons
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  tests:
    uses: mundialis/github-workflows/.github/
          workflows/grass-tests.yml@grass-tests
    # set NC_TEST_DATA to 'NC' for using
    # NC GRASS GIS sample location
    with:
      NC_TEST_DATA: 'NC'
            
t.fossgis.fortune
├── .flake8
├── .git [...]
├── .github
│   └── workflows
│       └── linting.yml
├── .pre-commit-config.yaml
├── .pylintrc
├── .pylintrc_allowed_to_fail
├── Makefile
├── README.md
├── renovate.json
├── testsuite
│   ├── data
│   │   ├── README.md
│   │   └── area_beuel.geojson
│   └── test_v_example.py
├── t.fossgis.fortune.html
├── t.fossgis.fortune.py
└── t.fossgis.fortune.png
        
## grass-gis-helpers - Python Bibliothek [grass-gis-helpers](https://github.com/mundialis/grass-gis-helpers) - Auslagerung von in GRASS GIS Addons häufig verwendeten Funktionen - Verbessern der Dokumentation zur Wiederverwendbarkeit - Cleanup Funktionen für spezielle Use Cases - Paralleles Prozessieren - Validierungsmethoden - ... - Contributions welcome! --- def check_valid_rasterdata(input, strict=True): def get_location_size():
# Wrap it up - Minimalversion (Makefile, HTML, Python) - Abgucken / Kopieren [v.example](https://github.com/mundialis/v.example) - Anleitung befolgen [How-to-create-a-GRASS-GIS-addon.md](https://github.com/mundialis/grass-gis-helpers/blob/main/How-to-create-a-GRASS-GIS-addon.md) - 1. Dokumentation in HTML-Datei - 2. Shebang-Zeile und Header - 3. Der GRASS Parser [g.parser](https://grass.osgeo.org/grass-devel/manuals/g.parser.html) - 4. main.py und cleanup - 5. Verwendung von grass.script - Wiederverwendbare GitHub Worflows [mundialis/github-workflows](https://github.com/mundialis/github-workflows) - Linting (Workflow & pre-commit) - Test Worflow - [mundialis/grass-gis-helpers](https://github.com/mundialis/grass-gis-helpers)
# Addons von mundialis - [mundialis/grass-addons](https://mundialis.github.io/grass-addons/) (38 Repositories*, grass-gis-helpers) ![Übersicht über GRASS GIS addons von mundialis](resources/img/mundialis-gga.jpg)
## GRASS GIS Addons von mundialis __[grass-keyhole](https://github.com/mundialis/grass-keyhole)__ - Keyhole Satellitenprogramm von 1959 bis 1972 - Orthorektifizierung alter Spionagesatellitenbilder - Zusammensetzen einer Szene aus Einzelscans - Sammeln von Kontroll-Punkten (GCP) - Orthorektifizierung - siehe auch "Das Beste der 60er, 70er und 80er: hochauflösende Spionagesatellitenaufnahmen" FOSSGIS 2023, Vortrag von M. Metz ![](resources/img/gg-corona-flugzeug.jpg) ![](resources/img/gg-corona-aufnahme.jpg) ![](resources/img/gg-corona-aufnahme-aktuell.jpg) ![](resources/img/gg-corona-verzerrung.jpg)
## GRASS GIS Addons von mundialis __[r.geoserver](https://github.com/mundialis/r.geoserver)__ - Nutzung der GeoServer REST API - Publizieren von - Raumzeitwürfeln als GeoTIFF/Image Mosaic (t.geoserver.publish) - Rasterkarten und Raumzeitwürfeln im [geoserver-grass-raster-datastore](https://mundialis.github.io/geoserver-grass-raster-datastore/) (r.geoserver.publish) - Upload eines GRASS GIS Stils und Verknüpfung mit einem Layer (r.geoserver.style) ![](resources/img/gga-geoserver.jpg)
## GRASS GIS Addons von mundialis __[v.alkis.buildings.import](https://github.com/mundialis/v.alkis.buildings.import)__ - Herunterladen von ALKIS-Gebäudedaten und Import in GRASS GIS - Download per Bundesland - Mögliche Bundesländer bisher: - Baden-Würrtemberg (nur lokaler Import) - Berlin - Brandenburg - Hessen - Nordrhein-Westfalen - Sachsen --- v.alkis.buildings.import output=alkis_buildings federal_state=Nordrhein-Westfalen -r



Vielen Dank!

Fragen?