2016-09-26 60 views
0

我在awk中有一个程序,它有一个Lat,long值的数组。假设lat/long是网格的bin的中心。对于每个bin都有一个值,我想创建一个png文件,根据值对每个bin进行颜色编码。对于lat/long/value的每一行(比方说600X600像素或360,000个bin),我想要生成png文件。现在每个垃圾桶都代表大约30米×30米的垃圾桶尺寸。以图片为例。假设我竟被dlike有5种颜色为值的整个范围内可以说0-10是蓝色的,11-20,红色等从lat,long创建一个png文件,值

我有数据如下: 38.0098946,78.5092495,30 38.0101420 ,78.5091242,20 38.0103893,78.5089989,10 38.0106366,78.5088737,50

example

+0

PNG文件将反映可以说10种颜色,其中值被划分为10个范围,每个范围 –

+0

1种颜色这是挺难理解,但我敢肯定这是可以做到很容易不够的,如果你花时间来正确解释它。请显示你的第一个纬度和经度,以及相应的情节如何。目前,例如,您的滑动条和长条形可能看起来像54度33分钟N和32度18分钟W,或者可能是18和32作为100x100网格上的坐标。 –

+1

什么颜色与任何事情有关?你没有提到你的问题中的颜色。另外,请不要在注释中解释事情 - 这真的很难阅读 - 相反,单击原始问题下的“编辑”并澄清您的问题。 –

回答

2

至于我的其他答案一种选择,你可以写一个PGM(便携式灰图)文件,该文件是相同的维基百科页面我联系到对方的回答描述。因此,在头文件中,您将写P2代替P3,并且对于每个像素,您将编写单个值(范围为0-50),而不是特定颜色的三个组件。

他的方法的优点是,您可以随后使用查找表对图像着色,然后用颜色蘸一下,而无需更改程序或缩放比例。

所以,让我们说你的程序(奇迹)产生这种灰度斜坡其中的值从0到255不等(output.pgm):

enter image description here

现在你要根据以色吧:

  • 0-9 =>红色
  • 10-19 =>黄色
  • 20-29 =>绿
  • 30-39 =>深灰色
  • 40-49 =>浅灰
  • 50+ =>品红

可以使颜色查找表是这样的:

convert -size 10x1 xc:red xc:yellow xc:lime xc:gray40 xc:gray80 +append -background magenta -extent 256x1\! LUT.png 

enter image description here

现在,您可以将该查找表应用到您的结果中:

convert output.pgm LUT.PNG -clut result.png 

enter image description here

+0

感谢这有助于。我需要的是将我的箱子(纬度/经度)映射到像素,但我认为我可以做到这一点。我可能会去第二个选项,因为我的规模不会改变,我会产生许多其他的PNG文件。谢谢! –

+0

非常好!请记住,如果全部为您解决,请接受答案 - 您通过点击投票数旁边的空白勾号/复选标记来接受答案。祝你的项目好运,记住,问题是免费的,所以回来问问出现的新问题! –

5

我还是不明白你的问题,因为你的数据似乎并没有你的图来匹配,但是我可以告诉你如何用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块,I输出的PPM头和设置我的颜色。在END块中,我运行一个循环,为图像的每个像素生成颜色。我使用/dev/null作为文件,以便awk不会挂起,并且它确实到达END块。

因此,(中间)PPM文件看起来像这样在你的情况 - 显示标题和第一行的前3个绿色像素:

P3 
600 500 
255 
0 255 0 
0 255 0 
0 255 0 
... 
... 

之后,我告诉ImageMagick的转换输入PPM文件到PNG文件。

enter image description here

如果你需要计算地球表面上的点之间的距离(我无法从你的问题告诉),您将需要haversine公式,我写了作为一个awk功能的另一答案here

ImageMagick安装在大多数Linux发行版上,可用于OSX和Windows - see here

+0

您可以将代码放在'BEGIN'块内的'END'块中。那么你不需要提供任何输入。 –