我在awk中有一个程序,它有一个Lat,long值的数组。假设lat / long是网格的bin的中心。对于每个bin都有一个值,我想创建一个png文件,根据值对每个bin进行颜色编码。对于lat / long / value的每一行(比如600X600像素或360,000个bin),我想生成png文件。每个箱子现在代表大约30米乘30米的箱子尺寸。见图片。假设我想在整个数值范围内有5种颜色可以说0-10是蓝色,11-20,红色等等。
我的数据如下: 38.0098946,78.5092495,30 38.0101420,78.5091242,20 38.0103893,78.5089989,10 38.0106366,78.5088737,50
答案 0 :(得分:6)
我仍然不理解您的问题,因为您的数据似乎与您的图表不符,但我可以向您展示如何使用awk
中您选择的颜色制作600x500 PNG。
最简单的方法,我认为是使用NetPBM
ASCII便携式Pixmap格式,其描述为here。我正在使用P3
因此它是ASCII并且易于处理但不节省空间。
以下是一个例子:
awk '
BEGIN{
# Output NetPBM P3 ASCII Portable Pixmap header
printf "P3\n"
# Output width and height
width=600; height=500
printf "%d %d\n",width,height
# Output maximum range (i.e. 8-bit)
printf "255\n"
# Set up colors
color[1]="255 0 0" # red
color[2]="0 255 0" # green
color[3]="0 0 255" # blue
color[4]="0 255 255" # cyan
color[5]="255 0 255" # magenta
color[6]="255 255 0" # yellow
}
END{
for(y=0;y<height;y++){
for(x=0;x<width;x++){
# Select new random color every 30 pixels so it comes out "blocky"
if((x%30)==0){
c=color[int(rand()*6)+1];
}
printf "%s\n",c
}
}
}' /dev/null | convert - result.png
在BEGIN
块中,我输出PPM标题并设置我的颜色。在END
块中,我运行一个循环,为图像的每个像素生成颜色。我使用/dev/null
作为文件,因此awk
不会挂起,它会转到END
块。
因此,(中间)PPM
文件在您的情况下将如下所示 - 显示标题和第一行的前3个绿色像素:
P3
600 500
255
0 255 0
0 255 0
0 255 0
...
...
之后,我告诉 ImageMagick 将传入的PPM
文件转换为PNG
文件。
如果你需要计算地球表面上的点之间的距离(我无法从你的问题中得知),你需要使用Haversine公式,我将其作为awk
函数写成另一个答案{ {3}}
ImageMagick 安装在大多数Linux发行版上,适用于OSX和Windows - here。
答案 1 :(得分:2)
作为我的其他答案的替代方案,您可以编写一个PGM
(便携式灰度图)文件,该文件在我在另一个答案中链接到的同一维基百科页面上进行了描述。因此,在标题中,您可以用P2
代替P3
,对于每个像素,您将编写已有的单个值(范围0-50),而不是a的三个组成部分。特定的颜色。
他的方法的优点是,您可以随后使用查找表为图像着色并使用颜色进行染色,而无需更改程序或缩放。
所以,让我们说你的程序(奇迹般地)产生了这个灰度渐变,其中值从0到255(output.pgm
)变化:
现在你要根据以下颜色进行着色:
您可以像这样制作颜色查找表:
convert -size 10x1 xc:red xc:yellow xc:lime xc:gray40 xc:gray80 +append -background magenta -extent 256x1\! LUT.png
现在您可以使用以下命令将该查找表应用于结果:
convert output.pgm LUT.PNG -clut result.png