All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.osgeo.proj4j.io.Proj4FileReader Maven / Gradle / Ivy

package org.osgeo.proj4j.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.List;

public class Proj4FileReader 
{

  public Proj4FileReader() {
    super();
  }

  public String[] readParametersFromFile( String authorityCode, String name ) 
  throws IOException 
  {
    // TODO: read comment preceding CS string as CS description
    // TODO: use simpler parser than StreamTokenizer for speed and flexibility
    // TODO: parse CSes line-at-a-time (this allows preserving CS param string for later access)
    
  	String filename = "/nad/" + authorityCode.toLowerCase();
  	InputStream inStr = Proj4FileReader.class.getResourceAsStream( filename );
  	if (inStr == null) {
  		throw new IllegalStateException("Unable to access CRS file: " + filename);
  	}
    BufferedReader reader = new BufferedReader( 
          new InputStreamReader(inStr) );
    String[] args;
    try {
      args = readFile(reader, name);
    }
    finally {
      if (reader != null)
        reader.close();
    }
    return args;
  }
  
  private StreamTokenizer createTokenizer(BufferedReader reader)
  {
    StreamTokenizer t = new StreamTokenizer( reader );
    t.commentChar( '#' );
    t.ordinaryChars( '0', '9' );
    t.ordinaryChars( '.', '.' );
    t.ordinaryChars( '-', '-' );
    t.ordinaryChars( '+', '+' );
    t.wordChars( '0', '9' );
    t.wordChars( '\'', '\'' );
    t.wordChars( '"', '"' );
    t.wordChars( '_', '_' );
    t.wordChars( '.', '.' );
    t.wordChars( '-', '-' );
    t.wordChars( '+', '+' );
    t.wordChars( ',', ',' );
    t.wordChars( '@', '@' );
    return t;
  }
  
  private String[] readFile( BufferedReader reader, String name) 
  throws IOException 
  {
    StreamTokenizer t = createTokenizer(reader);
    
    t.nextToken();
    while ( t.ttype == '<' ) {
      t.nextToken();
      if ( t.ttype != StreamTokenizer.TT_WORD ) 
        throw new IOException( t.lineno()+": Word expected after '<'" );
      String crsName = t.sval;
      t.nextToken();
      if ( t.ttype != '>' )
        throw new IOException( t.lineno()+": '>' expected" );
      t.nextToken();
      List v = new ArrayList();

      while ( t.ttype != '<' ) {
        if ( t.ttype == '+' )
          t.nextToken();
        if ( t.ttype != StreamTokenizer.TT_WORD ) 
          throw new IOException( t.lineno()+": Word expected after '+'" );
        String key = t.sval;
        t.nextToken();
        

        // parse =arg, if any
        if ( t.ttype == '=' ) {
          t.nextToken();
          //Removed check to allow for proj4 hack +nadgrids=@null 
          //if ( t.ttype != StreamTokenizer.TT_WORD ) 
          //  throw new IOException( t.lineno()+": Value expected after '='" );
          String value = t.sval;
          t.nextToken();
          addParam(v, key, value);
        }
        else {
          // add param with no value
          addParam(v, key, null);
        }
      }
      t.nextToken();
      if ( t.ttype != '>' )
        throw new IOException( t.lineno()+": '<>' expected" );
      t.nextToken();
      
      // found requested CRS?
      if ( crsName.equals( name ) ) {
        String[] args = (String[]) v.toArray( new String[0] );
        return args;
      }
    }
    return null;
  }
  
  private static void addParam(List v, String key, String value)
  {
    String plusKey = key;
    if ( ! key.startsWith("+") )
      plusKey = "+" + key;
    
    if (value != null)
      v.add( plusKey+"="+value );
    else 
      v.add(plusKey);
  }
  
  /**
   * Gets the list of PROJ.4 parameters which define
   * the coordinate system specified by name.
   * 
   * @param crsName the name of the coordinate system
   * @return the PROJ.4 projection parameters which define the coordinate system
   */
  public String[] getParameters(String crsName) {
    try {
      int p = crsName.indexOf(':');
      if (p >= 0) {
        String auth = crsName.substring(0, p);
        String id = crsName.substring(p + 1);
        return readParametersFromFile(auth, id);
      }
    } 
    catch (IOException e) {
      e.printStackTrace();
    }
    return null;
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy