zoukankan      html  css  js  c++  java
  • 读取Fits数据及画图显示JAVA版

    初学JAVA,没想到读取Fits,尤其是在MATLAB中一条命令搞定的显示数据,显得比较麻烦。这里用了两个包,分别完成读取及显示的功能。
    读取Fits的头文件以及获取Table的数据: Java Library for access to FITS files
    对于读取出来的波长和流量进行绘图: Plot Package,jahuwaldt.plot 
    在他们类的基础上,参考他们给出的Demo,我稍微封装了一点,以方便以后的调用。

    对jfits的封装,因为我主要读取文件只是获取其波长和流量的值,所以自己在那个基础上做了一个类

    package org.eso.fits;
    
    import java.io.IOException;
    import java.util.ListIterator;
    
    import org.eso.fits.FitsException;
    import org.eso.fits.FitsFile;
    import org.eso.fits.FitsHDUnit;
    import org.eso.fits.FitsHeader;
    import org.eso.fits.FitsKeyword;
    import org.eso.fits.FitsMatrix;
    
    public class LamostFits {
    	public LamostFits() {
    		// TODO Auto-generated constructor stub
    	}
    
    	public FitsFile GetFitsFile(String filePathString) {
    		FitsFile file = null;
    
    		try {
    			System.out.println("new fits file");
    			file = new FitsFile(filePathString);
    		} catch (FitsException e) {
    			System.out.println("Error: is not a FITS file >" + filePathString
    					+ "<");
    		} catch (IOException e) {
    			System.out.println("Error: cannot open file >" + filePathString
    					+ "<");
    		}
    		return file;
    
    	}
    
    	public int GetDataLength(FitsFile file) {
    		FitsHDUnit hdu = file.getHDUnit(0);
    		FitsMatrix dataMatrix = (FitsMatrix) hdu.getData();
    		int[] dimSize = dataMatrix.getNaxis();
    		return dimSize[0];
    	}
    
    	public int GetFlux(FitsFile file, float[] flux) {
    
    		FitsHDUnit hdu = file.getHDUnit(0);
    		FitsMatrix dataMatrix = (FitsMatrix) hdu.getData();
    		int len = dataMatrix.getNaxis()[0];
    		try {
    			dataMatrix.getFloatValues(0, len, flux);
    		} catch (FitsException e) {
    			e.printStackTrace();
    			return -1;
    		}
    		return len;
    	}
    
    	public void GetLambda(FitsFile file, float[] lambda) {
    		FitsHDUnit hdu = file.getHDUnit(0);
    		FitsHeader hdr = hdu.getHeader();
    		ListIterator itr = hdr.getKeywords();
    
    		double lambda_start = 0;
    		double lambda_deta = 0;
    
    		while (itr.hasNext()) {
    			FitsKeyword kw = (FitsKeyword) itr.next();
    			if (kw.getName().equals("CRVAL1")) {
    				/*
    				 * CRVAL1(R)= 3.5682 / Central wavelength (log10) of first pixel
    				 * CD1_1(R)= 1.0E-4 / Log10 dispersion per pixel
    				 */
    				lambda_start = kw.getReal();
    			} else if (kw.getName().equals("CD1_1")) {
    				lambda_deta = kw.getReal();
    			}
    		}
    		for (int i = 0; i < lambda.length; i++) {
    			lambda[i] = (float) Math.pow(10, lambda_start + lambda_deta * i);
    		}
    	}
    
    }


    而对于数据的显示这块,同样,我想要有matlab那样,直接给出x,y的值,显示其曲线即可,重新定义了一个可以传递x,y参数的函数进行绘图。

    package jahuwaldt.plot;
    
    import java.awt.*;
    import javax.swing.*;
    
    public class PlotXY extends JFrame {
    
    public static void PlotFits(float[] lambda, float[] flux, String title) {
    
    		double[] xArr = new double[lambda.length];
    		double[] yArr = new double[lambda.length];
    
    		for (int i = 0; i < lambda.length; i++) {
    			xArr[i] = (double) (lambda[i]);
    			yArr[i] = (double) flux[i];
    
    		}
    
    		Plot2D aPlot = new SimplePlotXY(xArr, yArr, title, "Wavelength",
    				"Flux", null, null, null);
    
    		PlotPanel panel = new PlotPanel(aPlot);
    		panel.setBackground(Color.white);
    
    		PlotXY window = new PlotXY("SimplePlotXY Plot Window", panel);
    		window.setSize(1000, 600);
    		window.setLocation(100, 100);
    		window.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    		window.show();
    
    	}
    
    }
    

    具体的调用过程:

    package org.eso.fits;
    
    import jahuwaldt.plot.PlotXY;
    import java.io.FileNotFoundException;
    
    public class SpectraFits{
    
    	public static void main(String[] argv) throws FileNotFoundException, FitsException {
    		
        	LamostFits lamFits = new LamostFits();
        	String fitsname = "xxx";
        	String filenameString = "fitFiles/" + fitsname + ".fits";
        	FitsFile file = lamFits.GetFitsFile(filenameString);
        	int len = lamFits.GetDataLength(file);
        	float[] lambda = new float[len];
        	lamFits.GetLambda(file, lambda);
        	float[] flux = new float[len];
        	lamFits.GetFlux(file, flux);
        	
        	PlotXY.PlotFits(lambda, flux, fitsname);    
        }
    }

    显示结果:



  • 相关阅读:
    Fix the Package System is Broken error in Ubuntu
    linux源镜像网站
    VS2010快捷键大全
    自定义函数与存储过程的比较
    vbcr,vblf和 vbcrlf之间的区别?
    GridView序号问题
    Outlook2007设置备份账号、联系人和个性签名的方法
    c#.net4.0利用odac连接oracle取数
    无法打开登录所请求的数据库DbName 。登录失败。 用户 'IIS APPPOOL\DefaultAppPool' 登录失败。 的解决方案
    C#开发和调用Web Service
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3119924.html
Copyright © 2011-2022 走看看