#include #include #include "project.h" static struct { double a, x; char *name, *description; } ell_list[] = { /* list stolen from PROJ.4 */ 6378137.0, 1/298.257223563, "wgs84", "WGS 84", 6377563.396, 6356256.910, "airy", "Airy 1830", 6377104.43, 1/300.0, "andrae", "Andrae 1876 (Den., Iclnd.)", 6378137.0, 1/298.25, "apl4.9", "Appl. Physics. 1965", 6378160.0, 1/298.25, "aust_sa", "Australian Natl & S. Amer. 1969", 6377397.155, 1/299.1528128, "bessel", "Bessel 1841", 6377483.865, 1/299.1528128, "bess_nam", "Bessel 1841 (Namibia)", 6378206.4, 6356583.8, "clrk66", "Clarke 1866", 6378249.145, 1/293.4663, "clrk80", "Clarke 1880 mod.", 6375738.7, 1/334.29, "cpm", "Comm. des Poids et Mesures 1799", 6376428.0, 1/311.5, "delmbr", "Delambre 1810 (Belgium)", 6378136.05, 1/298.2566, "engelis", "Engelis 1985", 6377276.345, 1/300.8017, "evrst30", "Everest 1830", 6377304.063, 1/300.8017, "evrst48", "Everest 1948", 6377301.243, 1/300.8017, "evrst56", "Everest 1956", 6377295.664, 1/300.8017, "evrst69", "Everest 1969", 6377298.556, 1/300.8017, "evrstss", "Everest (Sabah & Sarawak)", 6378166.0, 1/298.3, "fschr60", "Fischer (Mercury Datum) 1960", 6378155.0, 1/298.3, "fschr60m", "Modified Fischer 1960", 6378150.0, 1/298.3, "fschr68", "Fischer 1968", 6378160.0, 1/298.2471674270, "grs67", "GRS 67 (IUGG 1967)", 6378137.0, 1/298.257222101, "grs80", "GRS 1980(IUGG 1980)", 6378200.0, 1/298.3, "helmert", "Helmert 1906", 6378270.0, 1/297.0, "hough", "Hough", 6378140.0, 1/298.257, "iau76", "IAU 1976", 6378388.0, 1/297.0, "intl", "International 1909 (Hayford)", 6378163.0, 1/298.24, "kaula", "Kaula 1961", 6378245.0, 1/298.3, "krass", "Krassovsky 1942", 6378139.0, 1/298.257, "lerch", "Lerch 1979", 6378137.0, 1/298.257, "merit", "MERIT 1983", 6377340.189, 6356034.446, "mod_airy", "Modified Airy", 6397300.0, 1/191.0, "mprts", "Maupertius 1738", 6378157.5, 6356772.2, "new_intl", "New International 1967", 6378145.0, 1/298.25, "nwl9d", "Naval Weapons Lab. 1965", 6376523.0, 6355863.0, "plessis", "Plessis 1817 (France)", 6378155.0, 6356773.3205, "seasia", "Southeast Asia", 6378136.0, 1/298.257, "sgs85", "Soviet Geodetic System 85", 6376896.0, 6355834.8467, "walbeck", "Walbeck", 6378165.0, 1/298.3, "wgs60", "WGS 60", 6378145.0, 1/298.25, "wgs66", "WGS 66", 6378135.0, 1/298.26, "wgs72", "WGS 72", }; static void calc_ell(struct elliptic *ell) { if(!ell->f) ell->f = 1. - ell->b/ell->a; if(!ell->b) ell->b = (1 - ell->f)*ell->a; ell->e⁲ = ell->f*(2. - ell->f); ell->E⁲ = ell->e⁲/(1. - ell->e⁲); if(!ell_en_init(ell)) exits("en_init"); } int get_ell(struct elliptic *ell, char *name) { int i, m; if(name==nil) return 0; m = sizeof(ell_list)/sizeof(*ell_list); for(i=0; i < m; i++) if(!strcmp(name, ell_list[i].name)) break; if(i==m) return 0; ell->a = ell_list[i].a; if(ell_list[i].x > 1){ ell->b = ell_list[i].x; ell->f = 0; }else{ ell->f = ell_list[i].x; ell->b = 0; } calc_ell(ell); return 1; } void list_ell(void){ int i, m; print("Valid Ellipsoids:\n"); m=sizeof(ell_list)/sizeof(*ell_list); for(i=0;i