Opened 4 years ago

Closed 3 years ago

#2659 closed defect (duplicate)

replace function bug in t.rast.mapcalc.py

Reported by: eosduero Owned by: grass-dev@…
Priority: normal Milestone: 7.0.5
Component: Python Version: 7.0.0
Keywords: t.rast.mapcalc Cc:
CPU: x86-32 Platform: Unspecified

Description

There is a bug in the t.rast.mapcalc.py function. The problem occurs when we have 2 temporal datasets with similar names, for example:

  • map1
  • ecmmap1

When we try:

t.rast.mapcalc.py" --o input=map1,ecmmap1 expr="map1 - ecmmap1" out=sal1 basename=sal1 method=start

It cause an error. I think that the problem is in the line 217 (file etc\python\grass\temporal\mapcalc.py):

                expr = expr.replace(id_list[j], map_matrix[j][i])

The function can not replace correctly the raster dataset when they have equal substrings.

Thanks and sorry for my english.

Change History (10)

comment:1 Changed 4 years ago by eosduero

NOTE: In the example the basename of map1 and ecmmap1 datasets were created with the same name (map1 and ecmmap1).

comment:2 Changed 4 years ago by eosduero

A possible solution:

            # current time step
            for j in range(len(map_matrix)):
                if map_matrix[j][i] is None:
                    valid_maps = False
                    break
                # Substitute the dataset name with the map name
                expr = expr.replace(id_list[j], "aux__%00002d__" % j)
                
            # EOS
            for j in range(len(map_matrix)):
                if map_matrix[j][i] is None:
                    valid_maps = False
                    break
                # Substitute the dataset name with the map name
                expr = expr.replace("aux__%00002d__" % j, map_matrix[j][i])

comment:3 Changed 4 years ago by eosduero

Other better posibility:

...............
from grass.exceptions import CalledModuleError
import re

############################################################################

def multiple_replace(string, rep_dict):
    pattern = re.compile("|".join([re.escape(k) for k in rep_dict.keys()]), re.M)
    return pattern.sub(lambda x: rep_dict[x.group(0)], string)
       

...................

            # Replace all dataset names with their map names of the
            # current time step
            plants = {}
            
            for j in range(len(map_matrix)):
                if map_matrix[j][i] is None:
                    valid_maps = False
                    break
                # Substitute the dataset name with the map name
                #expr = expr.replace(id_list[j], map_matrix[j][i])
                plants[id_list[j]] = map_matrix[j][i]
                #msgr.message()
            
            expr = multiple_replace(expr, plants)

comment:4 Changed 4 years ago by neteler

Milestone: 7.0.17.0.2

Ticket retargeted after 7.0.1 milestone closed

comment:5 Changed 4 years ago by neteler

Milestone: 7.0.27.0.3

Ticket retargeted after milestone closed

comment:6 Changed 3 years ago by neteler

Potential duplicate of #2735

comment:7 Changed 3 years ago by neteler

Milestone: 7.0.3

Ticket retargeted after milestone closed

comment:8 Changed 3 years ago by neteler

Milestone: 7.0.4

Ticket retargeted after 7.0.3 milestone closed

comment:9 Changed 3 years ago by martinl

Milestone: 7.0.47.0.5

comment:10 Changed 3 years ago by martinl

Resolution: duplicate
Status: newclosed
Note: See TracTickets for help on using tickets.