123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- #!/usr/bin/env python3
- #
- ############################################################################
- #
- # MODULE: d.correlate for GRASS 6; based on dcorrelate.sh for GRASS 4,5
- # AUTHOR(S): CERL - Michael Shapiro; updated to GRASS 6 by Markus Neteler 5/2005
- # Converted to Python by Glynn Clements
- # PURPOSE: prints a graph of the correlation between data layers (in pairs)
- # derived from <grass5>/src.local/d.correlate.sh
- # COPYRIGHT: (C) 2005, 2008, 2011 by the GRASS Development Team
- #
- # This program is free software under the GNU General Public
- # License (>=v2). Read the file COPYING that comes with GRASS
- # for details.
- #
- #############################################################################
- # %module
- # % description: Prints a graph of the correlation between raster maps (in pairs).
- # % keyword: display
- # % keyword: statistics
- # % keyword: raster
- # % keyword: diagram
- # % keyword: correlation
- # %end
- # %option G_OPT_R_MAPS
- # %end
- import sys
- import os
- from grass.script.utils import try_remove
- from grass.script import core as gcore
- from grass.exceptions import CalledModuleError
- def main():
- layers = options["map"].split(",")
- if len(layers) < 2:
- gcore.error(_("At least 2 maps are required"))
- tmpfile = gcore.tempfile()
- for map in layers:
- if not gcore.find_file(map, element="cell")["file"]:
- gcore.fatal(_("Raster map <%s> not found") % map)
- try:
- gcore.write_command(
- "d.text", color="black", size=4, line=1, stdin="CORRELATION"
- )
- except CalledModuleError:
- return 1
- os.environ["GRASS_RENDER_FILE_READ"] = "TRUE"
- colors = "red black blue green gray violet".split()
- line = 2
- iloop = 0
- jloop = 0
- for iloop, i in enumerate(layers):
- for jloop, j in enumerate(layers):
- if i != j and iloop <= jloop:
- color = colors[0]
- colors = colors[1:]
- colors.append(color)
- gcore.write_command(
- "d.text", color=color, size=4, line=line, stdin="%s %s" % (i, j)
- )
- line += 1
- ofile = open(tmpfile, "w")
- gcore.run_command("r.stats", flags="cnA", input=(i, j), stdout=ofile)
- ofile.close()
- ifile = open(tmpfile, "r")
- first = True
- for line in ifile:
- f = line.rstrip("\r\n").split(" ")
- x = float(f[0])
- y = float(f[1])
- if first:
- minx = maxx = x
- miny = maxy = y
- first = False
- if minx > x:
- minx = x
- if maxx < x:
- maxx = x
- if miny > y:
- miny = y
- if maxy < y:
- maxy = y
- ifile.close()
- kx = 100.0 / (maxx - minx + 1)
- ky = 100.0 / (maxy - miny + 1)
- p = gcore.feed_command("d.graph", color=color)
- ofile = p.stdin
- ifile = open(tmpfile, "r")
- for line in ifile:
- f = line.rstrip("\r\n").split(" ")
- x = float(f[0])
- y = float(f[1])
- ofile.write(
- b"icon + 0.1 %f %f\n"
- % ((x - minx + 1) * kx, (y - miny + 1) * ky)
- )
- ifile.close()
- ofile.close()
- p.wait()
- try_remove(tmpfile)
- return 0
- if __name__ == "__main__":
- options, flags = gcore.parser()
- sys.exit(main())
|