[GRASS-user] GRASS SCRIPT Execute Error

Ayush Chauhan ayush at huviair.com
Mon Jul 26 10:26:11 PDT 2021


Update:

So, the folder from which I was running the command was wrong, and when ran
the script from the correct folder, it ran just fine.

On Tue, Jul 20, 2021 at 10:55 PM Ayush Chauhan <ayush at huviair.com> wrote:

> 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>
>


-- 
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/20210726/eb41b411/attachment-0001.html>


More information about the grass-user mailing list