From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

NAME

Graphics::HotMap -- generate thermographic images.

SYNOPSIS

# Create a new HotMap
my $hotMap = Graphics::HotMap->new(
minValue => 1,
maxValue => 50,
);
# Define scale
$hotMap->scale(20);
# Show legend
$hotMap->legend(1);
# Show CrossMarks and values
$hotMap->crossMark(1,1);
# Define a new size
$hotMap->mapSize({ sizeX => 15, sizeY => 15 });
# Add time
$hotMap->addHorodatage(time, 15, 30);
# Add layer
$hotMap->addLayer({ layerName => '10_back', visibility => 1, sliceColor => 1 });
# Add a zone
$hotMap->addZone({
zoneName => 'AllMap',
layerName => '10_back',
coordonates => [0,0,14,14],
border => 1,
});
# And add some points
$hotMap->addPoint({ layerName => '10_back', x => 2, y => 2, value => 15 });
$hotMap->addPoint({ layerName => '10_back', x => 1, y => 6, value => 5 });
$hotMap->addPoint({ layerName => '10_back', x => 9, y => 13, value => 25 });
$hotMap->addLayer({ layerName => '20_inner' });
# Add a zone
$hotMap->addZone({
zoneName => 'innerZone',
layerName => '20_inner',
coordonates => [4,0,9,6],
border => 1,
text => 'Inner Zone',
});
# And some points
$hotMap->addPoint({ layerName => '20_inner', x => 5, y => 1, value => 1 });
$hotMap->addPoint({ layerName => '20_inner', x => 6, y => 5, value => 9 });
# You can also prepare conf as a Hash, ...
my %other = (
layers => {
'30_anotherLayer' => {
visibility => 0,
sliceColors => 1,
},
'40_anotherLayer' => {
visibility => 0,
sliceColors => 0,
},
},
zones => {
anotherZone => {
layerName => '30_anotherLayer',
coordonates => [7,4,10,9],
border => 1,
text => 'other layer',
textSize => 8,
textColor => 'magenta',
},
zoneA => {
layerName => '40_anotherLayer',
coordonates => [0,10,1,12],
border => 1,
text => 'black',
textSize => 8,
textColor => 'white',
},
zoneB => {
layerName => '40_anotherLayer',
coordonates => [1,10,2,12],
border => 1,
text => 'blue',
textSize => 8,
textColor => 'white',
},
zoneC => {
layerName => '40_anotherLayer',
coordonates => [2,10,3,12],
border => 1,
text => 'green',
textSize => 8,
textColor => 'white',
},
zoneD => {
layerName => '40_anotherLayer',
coordonates => [3,10,4,12],
border => 1,
text => 'cyan',
textSize => 8,
textColor => 'white',
},
},
points => {
'30_anotherLayer' => [
[8,5,46],
[10,9,22],
],
'10_back' => [
[13,1,50],
],
'40_anotherLayer' => [
[0,10,1],
[1,10,2],
[2,10,3],
[3,10,4],
],
},
);
# ..., and import/add it
$hotMap->addConfs(\%other);
# Run the interpolation and generate and image
$hotMap->genImage;
# Save the image a a PNG file
$hotMap->genImagePng('MyTest.png');
# print the text representation of the map
print $hotMap->toString('floor') if $hotMap->scale < 3;

DESCRIPTION

Generate thermographic images from a few know points. Others values are interpolated. Graphics::HotMap use PDL to work on matrix. PDL can compute very very large matrix in a few seconds.

See http://kumy.org/HotMap/HotMap.png

FUNCTIONS

new(<HASH>)

Construct and return a new HotMap Object;

Graphics::HotMap->new(
outfileGif => <File path>, # file to write GIF
outfilePng => <File path>, # file to write PNG
legend => [0|1], # activate lengend
legendNbGrad => <number>, # Number a graduation
cross => <bool>, # activate crossing of known values
crossValues => <bool>, # activate values printing whith cross
minValue => <number>, # minimum value
maxValue => <number>, # maximum value
font => <path to font file>,
fontSize => <number>, # font size
scale => <number>, # scale values and coordonates
sizeX => <number>, # X size
sizeY => <number>, # Y size
);
my $hotMap = Graphics::HotMap->new(
sizeX => 10,
sizeY => 10,
minValue => 1,
maxvalue => 50,
);
initKnownPoints()

Reset all know points.

mapSize(<HASH>)

Set or Return mapSize

$hotMap->mapSize({sizeX => 15, sizeY => 15}); # Set map size
@size = $hotMap->mapSize; # Return the actual map size
scale(<SCALAR>)

Set or Return current scale factor.

$hotMap->scale(2);
$scale = hotMap->scale;
addLayer(<HASH>)

Define a new Layer to store values.

Layers are parsed by alphabetical order.

* visibility (default: 1) : allow crossMarks to be displayed for this layer.

* sliceColor (default: 1) : colors are looked up in the gradient. If set to 0, values between 0 to 16 are fixed colors (LUT).

$hotMap->addLayer({ layerName => 'Layer1' });
$hotMap->addLayer({ layerName => 'Layer2', visibility => 1, sliceColor => 1 });
addZone(<HASH>)

Define a new zone to interpolate over a layer.

$hotMap->addZone({
zoneName => 'AllMap', # zone name
layerName => 'Layer1', # layer from which zone belongs
coordonates => [0,0,9,9], # coordonates [startX, startY, endX, endY]
border => 1, # border color (LUT) or undef for none
text => "your text", #
textSize => 10, #
textColor => 'red', #
noScale = 0, # if true, coordonates will not be auto-scaled
});
addPoint(<HASH>)

Add a know point to a zone. Zone should first be declared with addZone.

$hotMap->addPoint({
layerName => 'AllMap',
x => 7,
y => 8,
value => 25,
noScale => 0,
});
addHorodatage($timestamp, $x, $y)

Timestamp on the image.

$hotMap->addHorodatage(time, 10, 10);
$hotMap->addHorodatage(1269122338, 10, 10);
addText(<HASH>)

Add text on the image.

$hotMap->addText({
text => "your text",
x => $x,
y => $y,
font => <path to font file>
pointsize => 10,
fill => 'black',
align => '[left|center|right],
});
addConfs(<HASH>)

Add Layers/Zones/Point from a hash config.

my %other = (
layers => {
'30_anotherLayer' => {
visibility => 0,
sliceColors => 1,
},
},
zones => {
anotherZone => {
layerName => '30_anotherLayer',
coordonates => [7,4,10,9],
border => 1,
text => 'other layer',
textSize => 8,
textColor => 'magenta',
},
},
points => {
'30_anotherLayer' => [
[8,5,46],
[10,9,22],
],
},
);
$hotMap->addConfs(\%other);
getPoint()

Return a point value at coordonate x/y. Without a zone name, it returns a point from the interpolated table. With zone name, it returns a point from that zone.

$hotMap->getPoint(6, 2, 'Zone1')
$hotMap->getPoint(6, 2)
fusionLayers()

Fusion the second layer to the first one.

$hotMap->fusionLayers('AllMap', 'Zone1');
getLayer()

Return all values from a layer.

my $piddleVal = $hotMap->getLayer('AllMap');
setLayer()

Define all values from a layer.

$hotMap->setLayer('AllMap', $piddleVal);
toString()

Convert the interpolated table to text. The parameter 'floor' can be added to return rounded values.

print $hotMap->toString('floor');
[
[ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
[ 1 14 14 14 14 13 13 13 13 13 14 14 14 15 1]
[ 1 14 15 14 13 13 13 13 13 13 14 14 15 15 1]
[ 1 13 14 13 13 12 12 13 13 14 14 15 15 15 1]
[ 1 9 10 11 11 12 12 13 13 14 15 15 16 16 1]
[ 1 6 7 8 10 11 12 13 14 15 15 16 16 17 1]
[ 1 5 5 7 9 11 12 13 14 15 16 17 17 17 1]
[ 1 5 6 7 9 11 13 14 16 17 17 18 18 18 1]
[ 1 6 7 8 10 12 14 16 17 18 19 19 19 19 1]
[ 1 8 8 10 11 14 16 18 19 20 21 21 20 20 1]
[ 1 9 10 11 13 16 18 20 21 22 22 22 21 21 1]
[ 1 11 12 13 15 17 20 22 23 23 23 23 22 22 1]
[ 1 12 13 15 17 19 21 23 24 24 24 24 23 22 1]
[ 1 13 15 16 18 20 22 23 24 25 24 24 23 22 1]
[ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
]
legend()

Set or Return legend status. When enabled, the legend gradient will be drawn on the image.

crossMark()

Set or Return cross marks status. When enabled, a cross will be drawn on the image where points have been defined.

Set the gradient.

Parameter must be an array of RGB array.

See Math::Gradient::multi_array_gradient()

genImage()

Calculate the interpolation of all Zones.

This function will write image to disk.

genImagePng()

Write a PNG image from the interpolated table.

$hotMap->genImagePng('<path_to_png'>);
genImageGif()

Add a GIF image to the annimation from the interpolated table.

$hotMap->genImageGif('<path_to_gif'>);

SEE ALSO

PDL

Math::Gradient

AUTHOR

Mathieu Alorent (cpan@kumy.net)