[GRASS-user] GRASS SCRIPT Execute Error

Ayush Chauhan ayush at huviair.com
Tue Jul 20 10:25:14 PDT 2021


Hi Veronica, everyone,

I used the below URL to re-install the grass7.8, after deleting the
previous grass6.4.4 and previous grass7.8.5 versions.

https://grass.osgeo.org/grass78/source/snapshot/grass-7.8.git_src_snapshot_2021_07_17.tar.gz

I am trying to run a simple grass script, that will count the number of
points on the geojson file.

```
# %module
# % description: greets the user and prints the information of a spatial file
# %end
# %option
# % key: test
# % type: string
# % required: yes
# % multiple: no
# % description: Geospatial test file
# %end

import sys
from grass.pygrass.modules import Module
import grass.script as grass


def main():
    # Import raster and vector
    Module("v.in.ogr", input=opts["test"], output="test", overwrite=True)
    info = grass.vector_info("test")
    print("Number of points: %s" % info["points"])


if __name__ == "__main__":
    opts, _ = grass.parser()
    sys.exit(main())

```

Now, when I am running the following command:
```
/home/ec2-user/src/grass/bin.x86_64-pc-linux-gnu/grass78 -c EPSG:4326
location --exec /home/ec2-user/volume_calc/.venv/bin/python3
/home/ec2-user/volume_calc/simple_test.py
test=/home/ec2-user/volume_calc/media/tour_id/tmpb1civ9id_grass_engine/test.geojson
```

I receive the following error:

```
Starting GRASS GIS...
Creating new GRASS GIS location <location>...
Traceback (most recent call last):
  File "/home/ec2-user/src/grass/bin.x86_64-pc-linux-gnu/grass78", line
2348, in <module>
    main()
  File "/home/ec2-user/src/grass/bin.x86_64-pc-linux-gnu/grass78", line
2248, in main
    geofile=params.geofile, create_new=True)
  File "/home/ec2-user/src/grass/bin.x86_64-pc-linux-gnu/grass78", line
1002, in set_mapset
    create_location(gisdbase, location_name, geofile)
  File "/home/ec2-user/src/grass/bin.x86_64-pc-linux-gnu/grass78", line
804, in create_location
    epsg=epsg, datum_trans=datum_trans)
  File
"/home/ec2-user/src/grass/dist.x86_64-pc-linux-gnu/etc/python/grass/script/core.py",
line 1541, in create_location
    gisdbase = gisenv()['GISDBASE']
KeyError: 'GISDBASE'
```

I have set all the environment variables for the binary file of grass78
("/home/ec2-user/src/grass/bin.x86_64-pc-linux-gnu/grass78")

GISBASE: /home/ec2-user/src/grass/dist.x86_64-pc-linux-gnu
GUI: text
GRASSBIN: /home/ec2-user/src/grass/bin.x86_64-pc-linux-gnu/grass78
PYTHONPATH: /home/ec2-user/src/grass/dist.x86_64-pc-linux-gnu/etc/python
GISDBASE: /home/ec2-user/volume_calc/media/tour_id
LD_LIBRARY_PATH: $LD_LIBRARY_PATH:$GISBASE/lib
PATH = $PATH:/usr/bin:$GISBASE/bin:$GISBASE/scripts
LC_ALL: C.UTF-8

Still, the python grass
script(/home/ec2-user/src/grass/dist.x86_64-pc-linux-gnu/etc/python/grass/script/core.py)
is giving me the GISDBASE error (I think it is env variable error, not
sure).
Please tell me, is there any environment variable that I am forgetting? Or
this is something else.

And this is happening after the new installation. In my previous version, I
was able to run this basic script to test my grass installation (which is
failing this time).
Please let me know if you need more information.
Thanks

On Mon, Jul 19, 2021 at 8:45 PM Veronica Andreo <veroandreo at gmail.com>
wrote:

> Hi Ayush
>
> GRASS 7.8 already has the r.external module, so no need to patch it. I'd
> try first by using a clean installation of grass 7.8.5 (or compilation of
> 7.8.6 for that matter).
>
> Also the same way there's v.import for vector data, there's r.import for
> quick raster import, so you could try that for importing your raster map.
>
> my 0.02 cents
> Vero
>
> El lun, 19 jul 2021 a las 8:16, Ayush Chauhan (<ayush at huviair.com>)
> escribió:
>
>> Hi,
>>
>> I am using the below code in my grass script to calculate volume from the
>> DSM file input into the script and the polygon points on the DSM.
>> ```
>>
>> # %module
>> # % description: Calculate volume of area and prints the volume to stdout
>> # %end
>> # %option
>> # % key: area_file
>> # % type: string
>> # % required: yes
>> # % multiple: no
>> # % description: Geospatial file containing the area to measure
>> # %end
>> # %option
>> # % key: points_file
>> # % type: string
>> # % required: yes
>> # % multiple: no
>> # % description: Geospatial file containing the points defining the area
>> # %end
>> # %option
>> # % key: dsm_file
>> # % type: string
>> # % required: yes
>> # % multiple: no
>> # % description: GeoTIFF DEM containing the surface
>> # %end
>>
>> import sys
>> from grass.pygrass.modules import Module
>> import grass.script as grass
>>
>>
>> def main():
>>
>>     Module(
>>         "v.import",
>>         input=opts['area_file'],
>>         output="polygon_area",
>>         overwrite=True
>>     )
>>     Module(
>>         "v.import",
>>         input=opts['points_file'],
>>         output="polygon_points",
>>         overwrite=True
>>     )
>>     Module(
>>         "v.buffer",
>>         input="polygon_area",
>>         s=True,
>>         type="area",
>>         output="region",
>>         distance=1,
>>         minordistance=1,
>>         overwrite=True
>>     )
>>     Module("r.external", input=opts['dsm_file'], output="dsm",
>> overwrite=True)
>>     # Set Grass region and resolution to DSM
>>     Module("g.region", raster="dsm")
>>     # Set Grass region to vector bbox
>>     Module("g.region", vector="region")
>>     # Create a mask to speed up computation
>>     Module("r.mask", vector="region")
>>     # Transfer dsm raster data to vector
>>     Module("v.what.rast", map="polygon_points", raster="dsm",
>> column="height")
>>     # Decimate DSM and generate interpolation of new terrain
>>     Module("v.surf.rst", input="polygon_points", zcolumn="height",
>>            elevation="dsm_below_pile", overwrite=True)
>>     # Compute difference between dsm and new dsm
>>     Module("r.mapcalc",
>>            expression='pile_height_above_dsm=dsm-dsm_below_pile',
>> overwrite=True)
>>     # Set region to polygon area to calculate volume
>>     Module("g.region", vector="polygon_area")
>>     # Volume output from difference
>>     Module("r.volume", input="pile_height_above_dsm", f=True)
>>
>>     return 0
>>
>>
>> if __name__ == "__main__":
>>     opts, _ = grass.parser()
>>     sys.exit(main())
>>
>> ```
>>
>> The area file I am providing contains the below
>> contents(area_file.geojson):
>>
>> ```
>>
>> {"type": "Feature", "properties": {}, "geometry": {"type": "Polygon",
>> "coordinates": [[[73.31231666938123, 26.22297239890824],
>> [73.31241572405983, 26.222379996744422], [73.3134282830031,
>> 26.222577464467804], [73.31281194277611, 26.222906576595037],
>> [73.31231666938123, 26.22297239890824]]]}}
>>
>> ```
>>
>> The points file I am providing contains the below
>> contents(points_file.geojson):
>>
>> ```
>>
>> {"type": "FeatureCollection", "features": [{"type": "Feature",
>> "properties": {}, "geometry": {"type": "Point", "coordinates":
>> [73.31231666938123, 26.22297239890824]}}, {"type": "Feature", "properties":
>> {}, "geometry": {"type": "Point", "coordinates": [73.31241572405983,
>> 26.222379996744422]}}, {"type": "Feature", "properties": {}, "geometry":
>> {"type": "Point", "coordinates": [73.3134282830031, 26.222577464467804]}},
>> {"type": "Feature", "properties": {}, "geometry": {"type": "Point",
>> "coordinates": [73.31281194277611, 26.222906576595037]}}, {"type":
>> "Feature", "properties": {}, "geometry": {"type": "Point", "coordinates":
>> [73.31231666938123, 26.22297239890824]}}]}
>>
>> ```
>>
>> When I run the below command,
>>
>> ```
>>
>> */home/ec2-user/grass/bin.x86_64-pc-linux-gnu/grass78 -c \*
>> */home/ec2-user/volume_calc/media/tour_id/files/dsm_volume.tif location \*
>> *--exec python3 /home/ec2-user/volume_calc/grass_calc_vol.py \*
>> *area_file=/home/ec2-user/volume_calc/media/tour_id/tmpo99fe5bi_grass_engine/area_file.geojson
>> \*
>> *points_file=/home/ec2-user/volume_calc/media/tour_id/tmpo99fe5bi_grass_engine/points_file.geojson
>> \*
>> *dsm_file=/home/ec2-user/volume_calc/media/tour_id/files/dsm_volume.tif*
>>
>> ```
>>
>> I get below output.
>> ```
>>
>> (.venv) [ec2-user at ip-10-0-3-14 volume_calc]$
>> /home/ec2-user/grass/bin.x86_64-pc-linux-gnu/grass78 -c
>> /home/ec2-user/volume_calc/media/tour_id/files/dsm_volume.tif location
>> --exec python3 /home/ec2-user/volume_calc/grass_calc_vol.py
>> area_file=/home/ec2-user/volume_calc/media/tour_id/tmpo99fe5bi_grass_engine/area_file.geojson
>> points_file=/home/ec2-user/volume_calc/media/tour_id/tmpo99fe5bi_grass_engine/points_file.geojson
>> dsm_file=/home/ec2-user/volume_calc/media/tour_id/files/dsm_volume.tif
>> Starting GRASS GIS...
>> Creating new GRASS GIS location <location>...
>> Cleaning up temporary files...
>> Executing <python3 /home/ec2-user/volume_calc/grass_calc_vol.py
>> area_file=/home/ec2-user/volume_calc/media/tour_id/tmpo99fe5bi_grass_engine/area_file.geojson
>> points_file=/home/ec2-user/volume_calc/media/tour_id/tmpo99fe5bi_grass_engine/points_file.geojson
>> dsm_file=/home/ec2-user/volume_calc/media/tour_id/files/dsm_volume.tif> ...
>> Check if OGR layer <OGRGeoJSON> contains polygons...
>>  100%
>> Creating attribute table for layer <OGRGeoJSON>...
>> Importing 1 features (OGR layer <OGRGeoJSON>)...
>>  100%
>> -----------------------------------------------------
>> Registering primitives...
>> -----------------------------------------------------
>> Cleaning polygons
>> -----------------------------------------------------
>> Breaking polygons...
>> Breaking polygons (pass 1: select break points)...
>>  100%
>> Breaking polygons (pass 2: break at selected points)...
>>  100%
>> -----------------------------------------------------
>> Removing duplicates...
>>  100%
>> -----------------------------------------------------
>> Breaking boundaries...
>>  100%
>> -----------------------------------------------------
>> Removing duplicates...
>>  100%
>> -----------------------------------------------------
>> Cleaning boundaries at nodes...
>>  100%
>> -----------------------------------------------------
>> Merging boundaries...
>>  100%
>> -----------------------------------------------------
>> Removing dangles...
>>  100%
>> -----------------------------------------------------
>> Building areas...
>>  100%
>> -----------------------------------------------------
>> Removing bridges...
>>  100%
>> -----------------------------------------------------
>> Registering primitives...
>> Building areas...
>>  100%
>> Attaching islands...
>>  100%
>> -----------------------------------------------------
>> Finding centroids for OGR layer <OGRGeoJSON>...
>>  100%
>> -----------------------------------------------------
>> Writing centroids...
>>  100%
>> -----------------------------------------------------
>> 1 input polygons
>> Total area: 4106.45 (1 areas)
>> -----------------------------------------------------
>> Copying features...
>>  100%
>> Building topology for vector map <polygon_area at PERMANENT>...
>> Registering primitives...
>> Building areas...
>>  100%
>> Attaching islands...
>>  100%
>> Attaching centroids...
>>  100%
>> Input
>>
>> </home/ec2-user/volume_calc/media/tour_id/tmpo99fe5bi_grass_engine/area_file.geojson>
>> successfully imported without reprojection
>> Check if OGR layer <OGRGeoJSON> contains polygons...
>>  100%
>> Creating attribute table for layer <OGRGeoJSON>...
>> Importing 5 features (OGR layer <OGRGeoJSON>)...
>>  100%
>> -----------------------------------------------------
>> Building topology for vector map <polygon_points at PERMANENT>...
>> Registering primitives...
>> Input
>>
>> </home/ec2-user/volume_calc/media/tour_id/tmpo99fe5bi_grass_engine/points_file.geojson>
>> successfully imported without reprojection
>> Note: In latitude-longitude coordinate system specify distances in degree
>> unit
>> WARNING: Option 'minordistance' is not available with GEOS buffering
>> Buffering areas...
>>  100%
>> Cleaning buffers...
>> Building parts of topology...
>> Building topology for vector map <region at PERMANENT>...
>> Registering primitives...
>> Snapping boundaries...
>> Reading features...
>> Snap vertices Pass 1: select points
>>  100%
>> Snap vertices Pass 2: assign anchor vertices
>>  100%
>> Snap vertices Pass 3: snap to assigned points
>>  100%
>> Breaking polygons...
>> Breaking polygons (pass 1: select break points)...
>>  100%
>> Breaking polygons (pass 2: break at selected points)...
>>  100%
>> Removing duplicates...
>>  100%
>> Breaking boundaries...
>>  100%
>> Removing duplicates...
>>  100%
>> Cleaning boundaries at nodes
>>  100%
>> Building topology for vector map <region at PERMANENT>...
>> Building areas...
>>  100%
>> Removing dangles...
>>  100%
>> Removing bridges...
>>  100%
>> Attaching islands...
>> Building topology for vector map <region at PERMANENT>...
>> Attaching islands...
>>  100%
>> Calculating centroids for all areas...
>>  100%
>> Generating list of boundaries to be deleted...
>>  100%
>> Deleting boundaries...
>>  100%
>> Calculating centroids for areas...
>>  100%
>> Building topology for vector map <region at PERMANENT>...
>> Registering primitives...
>> Building areas...
>>  100%
>> Attaching islands...
>>  100%
>> Attaching centroids...
>>  100%
>> WARNING: Unable to open datum table file
>>          </home/ec2-user/grass/dist.x86_64-pc-linux-gnu/etc/datum.table>
>> WARNING: Datum <WGS_1984> not recognised by GRASS and no parameters found
>> WARNING: Unable to open ellipsoid table file
>>          </home/ec2-user/grass/dist.x86_64-pc-linux-gnu/etc/ellipse.table>
>> Projection of input dataset and current location appear to match
>> Importing band 1 of 1...
>> Link to raster map <dsm> created
>> Reading areas...
>>  100%
>> Writing raster map...
>>  100%
>> Reading areas...
>>  100%
>> Writing raster map...
>>  100%
>> Reading areas...
>>  100%
>> Writing raster map...
>>  100%
>> Reading areas...
>>  100%
>> Writing raster map...
>> ^CTraceback (most recent call last):
>>   File "/home/ec2-user/grass/dist.x86_64-pc-linux-gnu/scripts/r.mask",
>> line 199, in <module>
>>     main()
>>   File "/home/ec2-user/grass/dist.x86_64-pc-linux-gnu/scripts/r.mask",
>> line 179, in main
>>     type='area', cats=cats, where=where, env=env)
>>   File
>> "/home/ec2-user/grass/dist.x86_64-pc-linux-gnu/etc/python/grass/script/core.py",
>> line 440, in run_command
>>     returncode = ps.wait()
>>   File "/usr/lib64/python3.7/subprocess.py", line 1019, in wait
>>     return self._wait(timeout=timeout)
>>   File "/usr/lib64/python3.7/subprocess.py", line 1653, in _wait
>>     (pid, sts) = self._try_wait(0)
>>   File "/usr/lib64/python3.7/subprocess.py", line 1611, in _try_wait
>>     (pid, sts) = os.waitpid(self.pid, wait_flags)
>> KeyboardInterrupt
>> Traceback (most recent call last):
>>   File "/home/ec2-user/volume_calc/grass_calc_vol.py", line 80, in
>> <module>
>>     sys.exit(main())
>>   File "/home/ec2-user/volume_calc/grass_calc_vol.py", line 61, in main
>>     Module("r.mask", vector="region")
>>   File
>> "/home/ec2-user/grass/dist.x86_64-pc-linux-gnu/etc/python/grass/pygrass/modules/interface/module.py",
>> line 602, in __init__
>>     self.__call__(*args, **kargs)
>>   File
>> "/home/ec2-user/grass/dist.x86_64-pc-linux-gnu/etc/python/grass/pygrass/modules/interface/module.py",
>> line 660, in __call__
>>     return self.run()
>>   File
>> "/home/ec2-user/grass/dist.x86_64-pc-linux-gnu/etc/python/grass/pygrass/modules/interface/module.py",
>> line 783, in run
>>     self.wait()
>>   File
>> "/home/ec2-user/grass/dist.x86_64-pc-linux-gnu/etc/python/grass/pygrass/modules/interface/module.py",
>> line 796, in wait
>>     stdout, stderr = self._popen.communicate(input=self.stdin)
>>   File "/usr/lib64/python3.7/subprocess.py", line 956, in communicate
>>     self.wait()
>>   File "/usr/lib64/python3.7/subprocess.py", line 1019, in wait
>>     return self._wait(timeout=timeout)
>>   File "/usr/lib64/python3.7/subprocess.py", line 1653, in _wait
>>     (pid, sts) = self._try_wait(0)
>>   File "/usr/lib64/python3.7/subprocess.py", line 1611, in _try_wait
>>     (pid, sts) = os.waitpid(self.pid, wait_flags)
>> KeyboardInterrupt
>> Traceback (most recent call last):
>>   File "/home/ec2-user/grass/bin.x86_64-pc-linux-gnu/grass78", line 2348,
>> in <module>
>>     main()
>>   File "/home/ec2-user/grass/bin.x86_64-pc-linux-gnu/grass78", line 2286,
>> in main
>>     returncode = run_batch_job(batch_job)
>>   File "/home/ec2-user/grass/bin.x86_64-pc-linux-gnu/grass78", line 1635,
>> in run_batch_job
>>     returncode = proc.wait()
>>   File "/usr/lib64/python3.7/subprocess.py", line 1019, in wait
>>     return self._wait(timeout=timeout)
>>   File "/usr/lib64/python3.7/subprocess.py", line 1653, in _wait
>>     (pid, sts) = self._try_wait(0)
>>   File "/usr/lib64/python3.7/subprocess.py", line 1611, in _try_wait
>>     (pid, sts) = os.waitpid(self.pid, wait_flags)
>> KeyboardInterrupt
>>
>> ```
>>
>> I had to hit *CTRL + C *to stop the infinite loop.
>>
>> Few lines from my grass78 bin file inside
>> */home/ec2-user/grass/bin.x86_64-pc-linux-gnu/*
>>
>> ```
>>
>> GISBASE =
>> os.path.normpath("/home/ec2-user/grass/dist.x86_64-pc-linux-gnu")
>> os.environ['GISBASE'] = GISBASE
>> CMD_NAME = "grass78"
>> GRASS_VERSION = "7.8.6dev"
>> LD_LIBRARY_PATH_VAR = 'LD_LIBRARY_PATH'
>> CONFIG_PROJSHARE = os.environ.get('GRASS_PROJSHARE', "/usr/share/proj")
>>
>> ```
>> Environment variables that I am setting:
>>
>> ```
>>         env["LC_ALL"] = "C.UTF-8"
>>         env["GISBASE"] = "/home/ec2-user/grass/dist.x86_64-pc-linux-gnu"
>>         env["GISDBASE"] = self.tmpdir  # in the above code eg.
>> *tmpo99fe5bi_grass_engine*
>>         env['PATH'] = "$PATH:/usr/bin:$GISBASE/bin:$GISBASE/scripts"
>>         env['LD_LIBRARY_PATH'] = "$LD_LIBRARY_PATH:$GISBASE/lib"
>>         env['GISRC'] = "$HOME/.grass7"
>>         env['PYTHONPATH'] =
>> "$HOME/grass/dist.x86_64-pc-linux-gnu/etc/python"
>> ```
>>
>> Also, I had copied the r.external file from version grass-6.4.4 that was
>> installed automatically when I ran `sudo yum install grass`. Because it was
>> not present in the bin folder of this location
>>
>>
>> */home/ec2-user/grass/dist.x86_64-pc-linux-gnu/bin/*
>>
>>
>> Is there a way to get the file from outside, thus removing the
>> grass-6.4.4 version and using the grass-7.8.5 version r.external file (can
>> that be a cause of infinite loop)?
>> Any suggestions as to what is going wrong? or anything wrong in the Grass
>> SCRIPT mentioned above, that could potentially lead to an infinite loop.
>> Please let me know if you need more information.
>>
>> --
>> Regards,
>> Ayush Chauhan
>>
>> _______________________________________________
>> grass-user mailing list
>> grass-user at lists.osgeo.org
>> https://lists.osgeo.org/mailman/listinfo/grass-user
>>
>

-- 
Regards,
Ayush Chauhan,
Senior Product Engineer,
+91 8269036401 | Huviair Technologies <http://huviair.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/grass-user/attachments/20210720/1de82615/attachment-0001.html>


More information about the grass-user mailing list