# ******************************************************************************
#  $Id: lookup.py d7e898f6034a9c6c0f83cfbff921434dfc2082be 2018-04-18 23:07:52 +1000 Ben Elliston $
#
#  Project:  GDAL ECW Driver
#  Purpose:  Script to lookup ECW (GDT) coordinate systems and translate
#            into OGC WKT for storage in $GDAL_HOME/data/ecw_cs.wkt.
#  Author:   Frank Warmerdam, warmerdam@pobox.com
#
# ******************************************************************************
#  Copyright (c) 2003, Frank Warmerdam
#
#  Permission is hereby granted, free of charge, to any person obtaining a
#  copy of this software and associated documentation files (the "Software"),
#  to deal in the Software without restriction, including without limitation
#  the rights to use, copy, modify, merge, publish, distribute, sublicense,
#  and/or sell copies of the Software, and to permit persons to whom the
#  Software is furnished to do so, subject to the following conditions:
#
#  The above copyright notice and this permission notice shall be included
#  in all copies or substantial portions of the Software.
#
#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
#  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
#  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#  DEALINGS IN THE SOFTWARE.
# ******************************************************************************

import string
import osr

##############################################################################
# rtod(): radians to degrees.


def r2d(rad):
    return float(rad) / 0.0174532925199433

##############################################################################
# load_dict()


def load_dict(filename):
    lines = open(filename).readlines()

    this_dict = {}
    for line in lines:
        if line[:8] != 'proj_name':
            tokens = string.split(line, ',')
            for i in range(len(tokens)):
                tokens[i] = string.strip(tokens[i])

            this_dict[tokens[0]] = tokens

    return this_dict

##############################################################################
# Mainline


# dir = 'M:/software/ER Viewer 2.0c/GDT_Data/'
dir = '/u/data/ecw/gdt/'

dict_list = ['tranmerc', 'lambert1', 'lamcon2', 'utm', 'albersea', 'mercator',
             'obmerc_b', 'grinten', 'cassini', 'lambazea', 'datum_sp']

dict_dict = {}

for item in dict_list:
    dict_dict[item] = load_dict(dir + item + '.dat')
    # print 'loaded: %s' % item

pfile = open(dir + 'project.dat')
pfile.readline()

for line in pfile.readlines():
    try:
        tokens = string.split(string.strip(line), ',')
        if len(tokens) < 3:
            continue

        for i in range(len(tokens)):
            tokens[i] = string.strip(tokens[i])

        id = tokens[0]
        type = tokens[1]

        lsize = float(tokens[2])
        lsize_str = tokens[2]

        dline = dict_dict[type][id]

        srs = osr.SpatialReference()

        # Handle translation of the projection parameters.

        if type != 'utm':
            fn = float(dline[1])
            fe = float(dline[2])

        if type == 'tranmerc':
            srs.SetTM(r2d(dline[5]), r2d(dline[4]), float(dline[3]), fe, fn)

        elif type == 'mercator':
            srs.SetMercator(r2d(dline[5]), r2d(dline[4]), float(dline[3]), fe, fn)

        elif type == 'grinten':
            srs.SetVDG(r2d(dline[3]), fe, fn)

        elif type == 'cassini':
            srs.SetCS(r2d(dline[4]), r2d(dline[3]), fe, fn)

        elif type == 'lambazea':
            srs.SetLAEA(r2d(dline[5]), r2d(dline[4]),
                        fe, fn)

        elif type == 'lambert1':
            srs.SetLCC1SP(r2d(dline[5]), r2d(dline[4]),
                          float(dline[3]), fe, fn)

        elif type == 'lamcon2':
            srs.SetLCC(r2d(dline[7]), r2d(dline[8]),
                       r2d(dline[9]), r2d(dline[6]), fe, fn)

# elif type == 'lambert2':
#   false_en = '+y_0=%.2f +x_0=%.2f' \
#   % (float(dline[12])*lsize, float(dline[13])*lsize)
#     result = '+proj=lcc %s +lat_0=%s +lon_0=%s +lat_1=%s +lat_2=%s' \
#           % (false_en, r2d(dline[3]), r2d(dline[4]),
#           r2d(dline[7]), r2d(dline[8]))

        elif type == 'albersea':
            srs.SetACEA(r2d(dline[3]), r2d(dline[4]),
                        r2d(dline[5]), r2d(dline[6]), fe, fn)

# elif type == 'obmerc_b':
#     result = '+proj=omerc %s +lat_0=%s +lonc=%s +alpha=%s +k=%s' \
#              % (false_en, r2d(dline[5]), r2d(dline[6]), r2d(dline[4]), dline[3])

        elif type == 'utm':
            srs.SetUTM(int(dline[1]), dline[2] != 'S')

        # Handle Units from projects.dat file.
        if srs.IsProjected():
            srs.SetAttrValue('PROJCS', id)
            if lsize_str == '0.30480061':
                srs.SetLinearUnits('US Foot', float(lsize_str))
            elif lsize_str != '1.0':
                srs.SetLinearUnits('unnamed', float(lsize_str))

        wkt = srs.ExportToWkt()
        if len(wkt) > 0:
            print('%s,%s' % (id, srs.ExportToWkt()))
        else:
            print('%s,LOCAL_CS["%s - (unsupported)"]' % (id, id))

    except KeyError:
        print('%s,LOCAL_CS["%s - (unsupported)"]' % (id, id))

    except:
        print('cant translate: ', line)
        raise

# Translate datums to their underlying spheroid information.

pfile = open(dir + 'datum.dat')
pfile.readline()

for line in pfile.readlines():
    tokens = string.split(string.strip(line), ',')
    for i in range(len(tokens)):
        tokens[i] = string.strip(tokens[i])

    id = tokens[0]

    sp_name = tokens[2]
    dline = dict_dict['datum_sp'][id]
    srs = osr.SpatialReference()

    if id == 'WGS84':
        srs.SetWellKnownGeogCS('WGS84')
    elif id == 'NAD27':
        srs.SetWellKnownGeogCS('NAD27')
    elif id == 'NAD83':
        srs.SetWellKnownGeogCS('NAD83')
    else:
        srs.SetGeogCS(tokens[1], id, sp_name, float(dline[2]), float(dline[4]))

    print('%s,%s' % (id, srs.ExportToWkt()))
