Index: /trunk/data_nodist/projection-regression-test-data.csv
===================================================================
--- /trunk/data_nodist/projection-regression-test-data.csv	(revision 9111)
+++ /trunk/data_nodist/projection-regression-test-data.csv	(revision 9112)
@@ -3,42 +3,42 @@
 EPSG:2017
   ll  41.91261175251477 -74.89278047335935
-  en  189256.4602437003 4642190.984738664
-  ll2 41.91261175251276 -74.89278047336005
+  en  189256.46024370025 4642190.984739115
+  ll2 41.912611752514195 -74.89278047336009
 EPSG:2018
   ll  59.44382107698691 -75.69994294027252
-  en  350186.8769538684 6591516.123763522
-  ll2 59.44382107698858 -75.69994294027248
+  en  350186.8769538684 6591516.123766931
+  ll2 59.44382107698689 -75.6999429402725
 EPSG:2019
   ll  59.57974571574399 -77.62068644735783
-  en  410977.0432181668 6607886.358465634
-  ll2 59.57974571574385 -77.62068644735734
+  en  410977.0432181668 6607886.358469073
+  ll2 59.579745715740216 -77.62068644735744
 EPSG:2020
   ll  48.70994767392709 -80.98151833777705
-  en  416544.4938169358 5397725.736308142
-  ll2 48.70994767392482 -80.98151833777635
+  en  416544.49381693586 5397725.73630937
+  ll2 48.70994767392592 -80.98151833777631
 EPSG:2021
   ll  44.32069045402543 -82.35101240098113
-  en  197033.18890380082 4909636.245298124
-  ll2 44.32069045402312 -82.35101240098165
+  en  197033.18890380085 4909636.245298789
+  ll2 44.32069045402493 -82.3510124009817
 EPSG:2022
   ll  52.974406405116596 -82.60706276272059
-  en  398364.5940485396 5871875.610649286
-  ll2 52.97440640511583 -82.60706276272029
+  en  398364.5940485396 5871875.610651281
+  ll2 52.97440640511588 -82.60706276272028
 EPSG:2023
   ll  48.878498193945305 -87.13823590455254
-  en  294661.1404832435 5415364.121539741
-  ll2 48.87849819394364 -87.13823590455254
+  en  294661.1404832435 5415364.121540996
+  ll2 48.87849819394531 -87.13823590455254
 EPSG:2024
   ll  51.35687523407061 -90.17997605532246
-  en  292264.10025309975 5691016.364589303
-  ll2 51.35687523406965 -90.17997605532246
+  en  292264.10025309975 5691016.364590984
+  ll2 51.35687523407062 -90.17997605532246
 EPSG:2025
   ll  43.959735984270985 -93.91753949513763
-  en  231163.02116838144 4869054.712592315
-  ll2 43.95973598426891 -93.91753949513767
+  en  231163.02116838144 4869054.712592943
+  ll2 43.95973598427093 -93.91753949513772
 EPSG:2026
   ll  48.06438094907365 -94.45119612154907
-  en  420226.7693776111 5325995.335761351
-  ll2 48.06438094907121 -94.45119612154826
+  en  420226.7693776111 5325995.33576248
+  ll2 48.06438094907235 -94.45119612154821
 EPSG:2154
   ll  50.02689509732728 -4.49984483215602
@@ -47,14 +47,14 @@
 EPSG:2176
   ll  49.64490220491846 16.279713636209475
-  en  5592415.690627584 5501713.997399415
-  ll2 49.64490220491687 16.279713636209717
+  en  5592415.690627584 5501713.997400717
+  ll2 49.64490220491803 16.279713636209753
 EPSG:2177
   ll  53.90237086111341 17.70353103400919
-  en  6480514.884490048 5974630.160067949
-  ll2 53.90237086111333 17.703531034009195
+  en  6480514.884490048 5974630.160070014
+  ll2 53.90237086111341 17.703531034009192
 EPSG:2178
   ll  51.28025609515727 21.516295219859636
-  en  7536021.072707665 5682953.495859991
-  ll2 51.28025609515634 21.51629521985963
+  en  7536021.072707665 5682953.495861567
+  ll2 51.28025609515728 21.51629521985964
 EPSG:21781
   ll  46.582471410091934 8.159223152110604
@@ -63,10 +63,10 @@
 EPSG:2179
   ll  51.812974050704796 24.579389794413864
-  en  8539953.715775384 5742250.607422158
-  ll2 51.812974050704014 24.57938979441386
+  en  8539953.715775384 5742250.607423828
+  ll2 51.81297405070478 24.57938979441387
 EPSG:2180
   ll  49.52724731520737 18.27654136015328
-  en  447661.13055637287 184674.94547026977
-  ll2 49.527247315205926 18.276541360153285
+  en  447661.13055637287 184674.94547155313
+  ll2 49.52724731520734 18.276541360153264
 EPSG:23700
   ll  46.46561041539386 21.520339346245464
@@ -75,46 +75,46 @@
 EPSG:25828
   ll  47.117782320935554 -16.503525409604464
-  en  385946.0034092715 5219349.635451921
-  ll2 47.11778232093319 -16.5035254096052
+  en  385946.00340927154 5219349.635452863
+  ll2 47.1177823209345 -16.503525409605253
 EPSG:25829
   ll  65.82806470287636 -9.554928597345642
-  en  474644.50820229325 7300857.887810782
-  ll2 65.82806470287812 -9.55492859734568
+  en  474644.50820229325 7300857.887815192
+  ll2 65.82806470287636 -9.554928597345642
 EPSG:25830
   ll  37.25171140290211 -2.8211874597155333
-  en  515857.4448277882 4122811.106932232
-  ll2 37.25171140290173 -2.821187459715534
+  en  515857.4448277882 4122811.106932426
+  ll2 37.25171140290212 -2.8211874597155333
 EPSG:25831
   ll  15.703714685419541 1.9029805492944067
-  en  382450.5936273647 1736467.0083671734
-  ll2 15.703714685418815 1.9029805492946246
+  en  382450.59362736467 1736467.0083671543
+  ll2 15.70371468541952 1.90298054929462
 EPSG:25832
   ll  43.42381791085779 9.690565246887022
-  en  555898.5039359011 4808112.365172946
-  ll2 43.42381791085591 9.69056524688702
+  en  555898.5039359011 4808112.36517349
+  ll2 43.42381791085778 9.690565246887042
 EPSG:25833
   ll  75.7892704557877 11.207180641450057
-  en  396131.7404880665 8415005.737873647
-  ll2 75.7892704557614 11.207180641594613
+  en  396131.7404880665 8415005.737878373
+  ll2 75.78927045573678 11.207180641594293
 EPSG:25834
   ll  46.44885204974395 22.405231854156536
-  en  607926.6287454234 5144879.313368673
-  ll2 46.448852049741696 22.405231854157073
+  en  607926.6287454234 5144879.313369531
+  ll2 46.44885204974325 22.405231854157122
 EPSG:25835
   ll  42.57574419494572 31.562543802846626
-  en  874467.6530367588 4723802.227199246
-  ll2 42.57574419459534 31.562543803062233
+  en  874467.6530367588 4723802.227199722
+  ll2 42.575744194251115 31.56254380306236
 EPSG:25836
   ll  28.15042601064217 29.551501695152517
-  en  161292.70745459147 3118678.701691007
-  ll2 28.150426010621363 29.551501695058164
+  en  161292.70745459135 3118678.7016910748
+  ll2 28.150426010596412 29.551501695058228
 EPSG:25837
   ll  36.3487499992021 40.79948792586663
-  en  661474.4463378746 4024134.2543947804
-  ll2 36.34874999920129 40.799487925869784
+  en  661474.4463378746 4024134.254394948
+  ll2 36.348749999200265 40.79948792586979
 EPSG:25838
   ll  31.188113573425966 46.337070725825676
-  en  627399.0197288111 3451219.8221930494
-  ll2 31.18811357342744 46.33707072582629
+  en  627399.0197288111 3451219.8221931364
+  ll2 31.18811357342576 46.33707072582627
 EPSG:27561
   ll  48.687023294540744 9.13470536591202
@@ -139,38 +139,38 @@
 EPSG:2969
   ll  18.09195682909748 -62.90557198327498
-  en  509756.870848181 2000799.1724028364
+  en  509756.870848181 2000799.1724028382
   ll2 18.0919568043076 -62.90557196864032
 EPSG:2970
   ll  16.041843969107557 -61.20853416213802
-  en  692080.8032091985 1774695.5238623084
-  ll2 16.0418439524898 -61.20853418759283
+  en  692080.8032091986 1774695.523862292
+  ll2 16.041843952489902 -61.20853418759284
 EPSG:2972
   ll  8.207268629853019 -50.21680809669106
-  en  586265.5532873704 907296.005720186
-  ll2 8.207268629851077 -50.216808096691146
+  en  586265.5532873704 907296.0057201401
+  ll2 8.207268629853017 -50.216808096691146
 EPSG:2973
   ll  14.407542336386097 -60.935843452421075
-  en  722168.211389498 1593628.3260067657
-  ll2 14.407542351752163 -60.93584343336168
+  en  722168.2113894979 1593628.3260067375
+  ll2 14.407542351752355 -60.9358434333617
 EPSG:2975
   ll  -16.18983230787581 40.123852994258414
-  en  -1326413.3757486297 8133460.392475484
-  ll2 -16.189831743778907 40.12386116380699
+  en  -1326413.3757486297 8133460.392475499
+  ll2 -16.18983190766203 40.12386116380695
 EPSG:3003
   ll  38.09725651416973 7.4345625019044315
-  en  1362730.2218375676 4217833.144081871
-  ll2 38.09725651416867 7.434562501902945
+  en  1362730.2218375676 4217833.144082101
+  ll2 38.09725651416882 7.434562501902931
 EPSG:3004
   ll  46.42503928302209 18.74399103983138
-  en  2807681.5235197735 5148186.206927572
-  ll2 46.425039282897764 18.743991039891302
+  en  2807681.5235197735 5148186.206928445
+  ll2 46.42503928277661 18.74399103989143
 EPSG:3008
   ll  61.864054488897295 13.084399903079879
-  en  128126.42078859449 6861850.502124558
-  ll2 61.86405448889923 13.084399903079852
+  en  128126.42078859449 6861850.502128279
+  ll2 61.86405448889729 13.084399903079879
 EPSG:3059
   ll  49.23525189671949 -54.40128360306443
-  en  -4263130.034442673 2917092.5518719126
-  ll2 50178.76820064746 246510.82413604847
+  en  -4263130.034442673 2917092.5518731494
+  ll2 50156.3548390288 246510.82413196223
 EPSG:31370
   ll  49.91513996934379 3.0892264075922404
@@ -179,498 +179,498 @@
 EPSG:31466
   ll  7.0210401440287065 6.5142293675331056
-  en  2556811.486749014 776341.9609297712
-  ll2 7.021040144026878 6.5142293675330905
+  en  2556811.486749014 776341.9609297286
+  ll2 7.021040144028706 6.514229367533092
 EPSG:31467
   ll  49.4988750014639 7.261117510799364
-  en  3374117.1277635116 5486123.243966412
-  ll2 49.498875001461215 7.261117510798085
+  en  3374117.1277635116 5486123.243967674
+  ll2 49.49887500146128 7.2611175107980355
 EPSG:31468
   ll  48.209523046432196 13.141810876019548
-  en  4584969.350196248 5341912.844584694
-  ll2 48.20952304643043 13.14181087601969
+  en  4584969.350196248 5341912.844585768
+  ll2 48.20952304643198 13.141810876019727
 EPSG:31469
   ll  75.71474879775388 16.230800026412393
-  en  5533907.888998117 8406162.271952605
-  ll2 75.7147487977527 16.230800026412293
+  en  5533907.888998117 8406162.27195727
+  ll2 75.71474879775381 16.23080002641239
 EPSG:32601
   ll  35.30468974675124 -181.75048187801644
-  en  67958.20646357589 3917197.812559492
-  ll2 35.304689746452496 -181.75048187860767
+  en  67958.20646357589 3917197.8125596363
+  ll2 35.30468974617765 -181.75048187860764
 EPSG:32602
   ll  -0.35895685791257925 -175.75420623162898
-  en  -29625.972570086014 -39813.425707889146
-  ll2 -0.3589568579093727 -175.75420623022703
+  en  -29625.972570085898 -39813.425707886265
+  ll2 -0.3589568579084667 -175.75420623022703
 EPSG:32603
   ll  69.06942592353653 -164.25619547568132
-  en  529653.423074742 7662283.255640146
-  ll2 69.06942592353752 -164.2561954756813
+  en  529653.423074742 7662283.255644933
+  ll2 69.06942592353653 -164.25619547568132
 EPSG:32604
   ll  68.49291330851102 -162.96491579603722
-  en  337874.41252150084 7603043.066426898
-  ll2 68.49291330842262 -162.96491579584512
+  en  337874.4125215008 7603043.066431634
+  ll2 68.49291330833023 -162.96491579584492
 EPSG:32605
   ll  70.45567827510386 -154.8711613318192
-  en  430146.7851750106 7817765.523685955
-  ll2 70.45567827510365 -154.87116133181905
+  en  430146.7851750106 7817765.523690824
+  ll2 70.45567827510223 -154.871161331819
 EPSG:32606
   ll  45.0472445968384 -147.48643385071935
-  en  461693.09169689566 4988313.776961381
-  ll2 45.04724459683641 -147.48643385071935
+  en  461693.09169689566 4988313.776962079
+  ll2 45.04724459683838 -147.48643385071935
 EPSG:32607
   ll  17.160888392541953 -136.88735017825638
-  en  937701.0944171889 1901994.1783050983
-  ll2 17.1608883925055 -136.88735017834057
+  en  937701.0944171889 1901994.178305092
+  ll2 17.160888392484225 -136.88735017834057
 EPSG:32608
   ll  17.082700048931713 -138.83952009347482
-  en  91233.83062316518 1892731.362054299
-  ll2 17.082700048910105 -138.8395200934112
+  en  91233.83062316518 1892731.3620542919
+  ll2 17.08270004889456 -138.8395200934112
 EPSG:32609
   ll  32.88791124498886 -124.7743273825516
-  en  895391.2108967202 3646786.763057612
-  ll2 32.88791124486649 -124.7743273822095
+  en  895391.21089672 3646786.7630577153
+  ll2 32.88791124475305 -124.77432738220956
 EPSG:32610
   ll  15.621043862710906 -127.89205445312605
-  en  -24932.886804628302 1733063.1626414557
-  ll2 15.621043862587436 -127.89205445274152
+  en  -24932.886804628302 1733063.162641437
+  ll2 15.621043862547943 -127.89205445274153
 EPSG:32611
   ll  10.73641510533119 -112.16478744764923
-  en  1029269.7699246185 1191002.7127373696
-  ll2 10.73641510524071 -112.16478744856084
+  en  1029269.7699246187 1191002.7127373253
+  ll2 10.736415105215261 -112.16478744856082
 EPSG:32612
   ll  61.77560053459669 -114.5125390548194
-  en  314735.1980824949 6854188.166002769
-  ll2 61.77560053452742 -114.51253905477127
+  en  314735.1980824949 6854188.16600647
+  ll2 61.77560053445347 -114.51253905477104
 EPSG:32613
   ll  4.7583779488046805 -107.92602632992818
-  en  175381.12258364592 526643.9142125123
-  ll2 4.758377948802733 -107.92602632984342
+  en  175381.1225836458 526643.9142124782
+  ll2 4.758377948802402 -107.92602632984344
 EPSG:32614
   ll  14.263757165950743 -100.80954124472483
-  en  304782.4591083076 1577656.5830076581
-  ll2 14.26375716594981 -100.80954124472157
+  en  304782.4591083076 1577656.5830076297
+  ll2 14.26375716595045 -100.80954124472159
 EPSG:32615
   ll  84.67761930424092 -95.31735150114109
-  en  476007.39052546234 9404225.272890447
-  ll2 84.67761930423927 -95.31735150113857
+  en  476007.39052546234 9404225.272893205
+  ll2 84.67761930424076 -95.31735150113927
 EPSG:32616
   ll  72.583548496096 -84.95707014904738
-  en  568238.7416437431 8055185.317495109
-  ll2 72.58354849609479 -84.95707014904791
+  en  568238.7416437431 8055185.317500017
+  ll2 72.58354849609388 -84.9570701490479
 EPSG:32617
   ll  58.773416508274885 -79.23342848764487
-  en  602152.1264258481 6516169.07728455
-  ll2 58.77341650827502 -79.23342848764443
+  en  602152.126425848 6516169.077287629
+  ll2 58.77341650827223 -79.2334284876445
 EPSG:32618
   ll  0.8542824171250176 -70.60589399441409
-  en  989382.9848638991 94704.1521896124
-  ll2 0.854282417120703 -70.6058939952968
+  en  989382.9848638988 94704.15218960555
+  ll2 0.8542824171192103 -70.6058939952968
 EPSG:32619
   ll  9.928164458825613 -66.53356619660251
-  en  770448.3262748269 1098474.206981794
-  ll2 9.928164458823826 -66.533566196628
+  en  770448.3262748267 1098474.2069817486
+  ll2 9.928164458824138 -66.533566196628
 EPSG:32620
   ll  -2.6787491025025547 -66.88079230367741
-  en  68302.71810571582 -296768.5025927464
-  ll2 -2.678749102496994 -66.88079230325388
+  en  68302.71810571593 -296768.5025927257
+  ll2 -2.6787491024945553 -66.88079230325388
 EPSG:32621
   ll  69.83911306601517 -54.4569378254068
-  en  597795.3401803295 7749969.356378063
-  ll2 69.83911306601044 -54.4569378254102
+  en  597795.3401803295 7749969.356382903
+  ll2 69.83911306600419 -54.45693782541029
 EPSG:32622
   ll  14.524484069634685 -53.96374810803576
-  en  180556.3469154662 1607806.3026925516
-  ll2 14.52448406963183 -53.96374810799876
+  en  180556.3469154662 1607806.302692525
+  ll2 14.524484069628397 -53.963748107998775
 EPSG:32623
   ll  16.394157590092313 -42.12374249522621
-  en  807234.0075202532 1814713.5629615434
-  ll2 16.3941575900903 -42.123742495247065
+  en  807234.0075202533 1814713.5629615306
+  ll2 16.394157590086483 -42.12374249524706
 EPSG:32624
   ll  5.131580338571972 -39.26307503457069
-  en  470842.78426743025 567215.00374571
-  ll2 5.131580338570435 -39.26307503457069
+  en  470842.78426743025 567215.0037456739
+  ll2 5.131580338571973 -39.26307503457069
 EPSG:32625
   ll  -0.7883094164596285 -30.122300530621676
-  en  820321.3553729916 -87242.6746455976
-  ll2 -0.7883094164592921 -30.12230053070564
+  en  820321.3553729916 -87242.67464559128
+  ll2 -0.7883094164592764 -30.12230053070564
 EPSG:32626
   ll  58.43458636013028 -29.168484112078048
-  en  373392.93024697975 6479137.419357916
-  ll2 58.43458636012712 -29.168484112078875
+  en  373392.9302469797 6479137.4193609245
+  ll2 58.434586360121145 -29.168484112078794
 EPSG:32627
   ll  8.344532201175449 -23.182089463285656
-  en  259685.6891659215 923051.0956246062
-  ll2 8.344532201173756 -23.182089463270486
+  en  259685.68916592153 923051.0956245605
+  ll2 8.344532201174848 -23.182089463270497
 EPSG:32628
   ll  22.510955722354655 -11.39208694243174
-  en  871237.6024480207 2493863.447968263
-  ll2 22.51095572233715 -11.392086942377526
+  en  871237.6024480207 2493863.4479682995
+  ll2 22.510955722318098 -11.392086942377562
 EPSG:32629
   ll  21.147897974547682 -10.932715320979701
-  en  299305.3797185818 2339737.5836034226
-  ll2 21.147897974548883 -10.932715320979792
+  en  299305.3797185818 2339737.5836034482
+  ll2 21.147897974546964 -10.93271532097978
 EPSG:32630
   ll  7.0485574964722595 -2.895336653090574
-  en  511558.9813362481 779118.0296877392
-  ll2 7.048557496470399 -2.8953366530905744
+  en  511558.9813362481 779118.0296876958
+  ll2 7.0485574964722595 -2.895336653090574
 EPSG:32631
   ll  62.31144897764639 -1.7488227034434083
-  en  253972.6113974089 6917912.226969319
-  ll2 62.31144897723166 -1.7488227026127516
+  en  253972.6113974089 6917912.226973126
+  ll2 62.31144897680178 -1.748822702612415
 EPSG:32632
   ll  11.834748738967427 11.598093592769366
-  en  783086.673635305 1309597.582045318
-  ll2 11.834748738965645 11.598093592741604
+  en  783086.673635305 1309597.582045277
+  ll2 11.834748738965084 11.59809359274162
 EPSG:32633
   ll  42.05539689126687 15.319058068358773
-  en  526400.7140049142 4655976.147280654
-  ll2 42.05539689126517 15.319058068358764
+  en  526400.7140049142 4655976.147281091
+  ll2 42.05539689126688 15.319058068358773
 EPSG:32634
   ll  75.90951295643045 25.503495199048984
-  en  622276.0812525111 8429752.16628064
-  ll2 75.90951295636204 25.503495198369787
+  en  622276.0812525111 8429752.166285353
+  ll2 75.90951295629242 25.503495198370185
 EPSG:32635
   ll  47.49067536542698 25.527726208112252
-  en  389099.4234549984 5260743.8958150195
-  ll2 47.49067536542474 25.527726208111613
+  en  389099.4234549984 5260743.895816009
+  ll2 47.49067536542605 25.527726208111563
 EPSG:32636
   ll  2.3826611804187845 35.69036984079036
-  en  799224.052045565 263649.3963221862
-  ll2 2.3826611804179456 35.69036984073283
+  en  799224.0520455651 263649.3963221676
+  ll2 2.382661180418093 35.69036984073283
 EPSG:32637
   ll  52.14316359823634 35.33858849767755
-  en  249486.75996839185 5783285.072364062
-  ll2 52.14316359812051 35.33858849768192
+  en  249486.75996839185 5783285.072365791
+  ll2 52.143163598004776 35.33858849768187
 EPSG:32638
   ll  53.91509364067411 42.2117397712837
-  en  316881.19957743154 5977677.047491307
-  ll2 53.915093640651726 42.21173977127907
+  en  316881.19957743154 5977677.047493373
+  ll2 53.91509364062914 42.21173977127907
 EPSG:32639
   ll  78.6419869416514 46.228999725737076
-  en  395220.30455138447 8734297.00471091
-  ll2 78.64198694159873 46.22899972691323
+  en  395220.30455138447 8734297.004715223
+  ll2 78.64198694154439 46.228999726912456
 EPSG:32640
   ll  53.864121366142705 57.44751774032813
-  en  529429.9386809022 5968496.735426065
-  ll2 53.86412136614262 57.44751774032813
+  en  529429.9386809022 5968496.735428121
+  ll2 53.8641213661427 57.44751774032813
 EPSG:32641
   ll  49.571868382578565 60.41766515903435
-  en  313303.34799034183 5494234.471211336
-  ll2 49.57186838256323 60.41766515902558
+  en  313303.34799034183 5494234.471212627
+  ll2 49.57186838255045 60.41766515902551
 EPSG:32642
   ll  -1.9071382046033127 69.6619425586165
-  en  573618.7511049965 -210811.0083199154
-  ll2 -1.9071382046026717 69.66194255861646
+  en  573618.7511049965 -210811.00831990028
+  ll2 -1.9071382046033127 69.66194255861646
 EPSG:32643
   ll  1.4895490042363466 73.50410601478126
-  en  333581.31480363844 164696.77435250996
-  ll2 1.4895490042358657 73.50410601478401
+  en  333581.31480363844 164696.77435249812
+  ll2 1.4895490042363353 73.50410601478401
 EPSG:32644
   ll  62.44367553939567 85.9750751673437
-  en  756598.954905078 6933493.141721524
-  ll2 62.44367553885303 85.97507516606653
+  en  756598.954905078 6933493.141725358
+  ll2 62.44367553828925 85.97507516606618
 EPSG:32645
   ll  77.10426871059683 89.0221872636809
-  en  550370.2039676631 8559275.344482148
-  ll2 77.10426871059488 89.02218726368017
+  en  550370.2039676631 8559275.344486712
+  ll2 77.10426871059592 89.0221872636804
 EPSG:32646
   ll  50.87569190579864 89.74835752271836
-  en  271249.3586776806 5641039.535640001
-  ll2 50.87569190574126 89.74835752270417
+  en  271249.3586776806 5641039.535641504
+  ll2 50.87569190568538 89.7483575227041
 EPSG:32647
   ll  70.62231324887725 99.90770843411856
-  en  533612.0813866678 7835525.490742478
-  ll2 70.62231324887772 99.90770843411859
+  en  533612.0813866678 7835525.490747357
+  ll2 70.6223132488772 99.90770843411856
 EPSG:32648
   ll  39.26637557561634 107.38423392284906
-  en  705690.5819331672 4349046.83007862
-  ll2 39.26637557560961 107.38423392286235
+  en  705690.5819331672 4349046.830078893
+  ll2 39.26637557560433 107.38423392286239
 EPSG:32649
   ll  11.255609425170523 111.88005555487531
-  en  596060.37945682 1244386.5306496648
-  ll2 11.255609425168716 111.88005555487518
+  en  596060.37945682 1244386.530649622
+  ll2 11.255609425170519 111.88005555487518
 EPSG:32650
   ll  9.877161924846341 119.53983649063838
-  en  778545.0254093792 1092890.6707807586
-  ll2 9.877161924844472 119.53983649060855
+  en  778545.0254093793 1092890.670780713
+  ll2 9.877161924844575 119.53983649060856
 EPSG:32651
   ll  29.894404052484198 123.73791699307937
-  en  571246.6122429472 3307313.233021797
-  ll2 29.894404052485946 123.73791699307941
+  en  571246.6122429472 3307313.233021876
+  ll2 29.894404052484198 123.7379169930794
 EPSG:32652
   ll  51.483168367165725 131.7547299698076
-  en  691267.2942592341 5707156.079357853
-  ll2 51.48316836714398 131.75472996981594
+  en  691267.2942592341 5707156.0793594625
+  ll2 51.48316836712365 131.75472996981597
 EPSG:32653
   ll  3.9439937741275237 139.56906177178473
-  en  1007763.0974047978 437331.50269813027
-  ll2 3.9439937741018105 139.5690617707412
+  en  1007763.0974047978 437331.50269810087
+  ll2 3.9439937740936983 139.5690617707412
 EPSG:32654
   ll  0.16694081399375094 139.49272157099904
-  en  332258.8768147535 18458.406171513318
-  ll2 0.16694081399369648 139.49272157100194
+  en  332258.8768147535 18458.406171511975
+  ll2 0.16694081399374955 139.49272157100194
 EPSG:32655
   ll  15.325514479625792 147.8741788025552
-  en  593840.2220569488 1694519.0743215398
-  ll2 15.325514479624909 147.87417880255512
+  en  593840.2220569488 1694519.0743215194
+  ll2 15.325514479625788 147.87417880255512
 EPSG:32656
   ll  5.776293589970747 152.597733111241
-  en  455463.1790096139 638491.4093867843
-  ll2 5.776293589969082 152.597733111241
+  en  455463.1790096139 638491.4093867452
+  ll2 5.776293589970748 152.597733111241
 EPSG:32657
   ll  46.64079768923685 162.60478038581513
-  en  775876.5142921583 5171562.354304005
-  ll2 46.6407976891373 162.60478038586604
+  en  775876.5142921584 5171562.354304886
+  ll2 46.6407976890409 162.60478038586615
 EPSG:32658
   ll  -0.9538168752974308 164.16373403116563
-  en  406954.01883056597 -105436.825076515
-  ll2 -0.9538168752971059 164.16373403116577
+  en  406954.018830566 -105436.8250765074
+  ll2 -0.9538168752974306 164.16373403116577
 EPSG:32659
   ll  40.50129189541295 171.1151678182983
-  en  509758.4272200559 4483404.501649895
-  ll2 40.501291895411576 171.1151678182983
+  en  509758.4272200559 4483404.501650231
+  ll2 40.501291895412955 171.1151678182983
 EPSG:32660
   ll  84.38466705329412 178.8187390897748
-  en  519865.4438068825 9371350.999824923
-  ll2 84.38466705329245 178.81873908977406
+  en  519865.4438068824 9371350.999827776
+  ll2 84.38466705329408 178.8187390897746
 EPSG:32701
   ll  -29.00158099669585 -176.06257492764095
-  en  591305.9239689747 6791477.062909814
-  ll2 -29.001580996697747 -176.06257492764087
+  en  591305.9239689746 6791477.062909741
+  ll2 -29.001580996695832 -176.06257492764087
 EPSG:32702
   ll  -83.61115414945169 -167.84722307361665
-  en  539148.6502865502 714244.7350888532
-  ll2 -83.61115414944909 -167.84722307364663
+  en  539148.6502865502 714244.735085763
+  ll2 -83.61115414944996 -167.84722307364575
 EPSG:32703
   ll  -59.67977504854512 -165.75611289241155
-  en  457419.4744487591 3384008.1251201406
-  ll2 -59.67977504854674 -165.75611289241158
+  en  457419.4744487591 3384008.125116867
+  ll2 -59.67977504854512 -165.75611289241155
 EPSG:32704
   ll  -44.74896637041389 -154.13571225132324
-  en  885055.000033729 5033414.625188409
-  ll2 -44.74896636985849 -154.13571225126154
+  en  885055.000033729 5033414.6251877425
+  ll2 -44.74896636930496 -154.1357122512614
 EPSG:32705
   ll  -4.570782032538887 -155.6804518141318
-  en  202567.24068296672 9494225.759775288
-  ll2 -4.570782032537401 -155.68045181407837
+  en  202567.24068296677 9494225.75977532
+  ll2 -4.570782032537629 -155.6804518140784
 EPSG:32706
   ll  -55.61672629832347 -144.3508810047789
-  en  666829.6102985529 3833392.573244692
-  ll2 -55.61672629830789 -144.35088100477645
+  en  666829.610298553 3833392.5732422806
+  ll2 -55.616726298291056 -144.35088100477648
 EPSG:32707
   ll  -0.22277876804946573 -136.6505910806773
-  en  984445.3083006871 9975304.651945615
-  ll2 -0.22277876804841829 -136.65059108151155
+  en  984445.3083006871 9975304.651945617
+  ll2 -0.22277876804804692 -136.65059108151155
 EPSG:32708
   ll  -2.768962687806777 -135.91033889187207
-  en  398815.28724407975 9693905.200367318
-  ll2 -2.768962687805876 -135.91033889187185
+  en  398815.2872440797 9693905.20036734
+  ll2 -2.7689626878067735 -135.91033889187185
 EPSG:32709
   ll  -32.79190171964473 -131.727811570545
-  en  244542.49842715668 6368487.503688801
-  ll2 -32.79190171963808 -131.7278115705747
+  en  244542.4984271567 6368487.503688699
+  ll2 -32.79190171962786 -131.72781157057466
 EPSG:32710
   ll  1.5712020890239131 -124.21146729170505
-  en  365234.2722858875 1.0173704546361338E7
-  ll2 1.5712020890233884 -124.21146729170411
+  en  365234.2722858875 1.0173704546361327E7
+  ll2 1.571202089023917 -124.21146729170411
 EPSG:32711
   ll  -41.091261924884776 -120.17689123197003
-  en  233168.6164003252 5446247.135223156
-  ll2 -41.09126192484649 -120.17689123202507
+  en  233168.6164003252 5446247.135222786
+  ll2 -41.09126192481057 -120.17689123202514
 EPSG:32712
   ll  -79.76744100986106 -115.94410343190378
-  en  402063.9138540749 1140210.1029349882
-  ll2 -79.76744100981378 -115.94410343026465
+  en  402063.9138540749 1140210.1029308978
+  ll2 -79.76744100976357 -115.94410343026561
 EPSG:32713
   ll  -10.850887170003276 -108.88425627320359
-  en  75152.58517323522 8797793.856423587
-  ll2 -10.85088716998492 -108.88425627294212
+  en  75152.58517323533 8797793.85642363
+  ll2 -10.850887169975316 -108.88425627294215
 EPSG:32714
   ll  -56.89459290929925 -97.364159691813
-  en  599649.1533353492 3693155.667478282
-  ll2 -56.89459290929932 -97.36415969181257
+  en  599649.1533353492 3693155.6674756007
+  ll2 -56.89459290929749 -97.36415969181262
 EPSG:32715
   ll  -15.188620247220271 -96.23707027363224
-  en  152136.94772601099 8318235.034911122
-  ll2 -15.188620247214823 -96.23707027358184
+  en  152136.94772601104 8318235.034911144
+  ll2 -15.188620247208913 -96.23707027358185
 EPSG:32716
   ll  -4.559807376181936 -82.52818257741919
-  en  996538.1905094216 9494450.775022857
-  ll2 -4.559807376156723 -82.52818257832048
+  en  996538.1905094216 9494450.775022889
+  ll2 -4.559807376148307 -82.52818257832048
 EPSG:32717
   ll  -66.29192836668584 -83.46326129024452
-  en  389503.5113214161 2645374.949496709
-  ll2 -66.2919283666812 -83.46326129024257
+  en  389503.5113214161 2645374.949492232
+  ll2 -66.2919283666731 -83.46326129024241
 EPSG:32718
   ll  -2.5647882790401297 -76.48884831326323
-  en  334474.62998039776 9716415.67820614
-  ll2 -2.5647882790393166 -76.48884831326058
+  en  334474.6299803979 9716415.67820616
+  ll2 -2.5647882790401026 -76.48884831326058
 EPSG:32719
   ll  -3.3106740144730935 -68.43248658691562
-  en  563046.3761068006 9634048.929625366
-  ll2 -3.3106740144720264 -68.43248658691563
+  en  563046.3761068006 9634048.929625392
+  ll2 -3.3106740144730917 -68.43248658691563
 EPSG:32720
   ll  -69.88660504305992 -58.451395274860495
-  en  674428.974179743 2240266.5274605397
-  ll2 -69.88660504288639 -58.451395275542424
+  en  674428.974179743 2240266.527455697
+  ll2 -69.88660504270575 -58.451395275542595
 EPSG:32721
   ll  -1.460807694037996 -56.918034017934815
-  en  509117.82030811213 9838536.34068649
-  ll2 -1.460807694037499 -56.918034017934815
+  en  509117.82030811213 9838536.340686502
+  ll2 -1.460807694037999 -56.918034017934815
 EPSG:32722
   ll  -67.51187256863244 -49.8909954222962
-  en  547334.5777219022 2511132.649487271
-  ll2 -67.5118725686338 -49.89099542229613
+  en  547334.5777219022 2511132.6494826376
+  ll2 -67.51187256863231 -49.89099542229619
 EPSG:32723
   ll  -37.33901138489274 -46.319661481385886
-  en  383102.3012525303 5866702.311873849
-  ll2 -37.33901138489222 -46.3196614813865
+  en  383102.30125253036 5866702.31187365
+  ll2 -37.339011384892444 -46.319661481386504
 EPSG:32724
   ll  -64.98185873306474 -42.631062127293355
-  en  328728.8038014539 2788647.117090909
-  ll2 -64.98185873299518 -42.631062127215536
+  en  328728.803801454 2788647.1170866266
+  ll2 -64.98185873292093 -42.631062127215266
 EPSG:32725
   ll  -65.44826790805924 -36.847373771828195
-  en  321704.4754237144 2736137.6100584166
-  ll2 -65.44826790796357 -36.847373771693476
+  en  321704.4754237144 2736137.6100540617
+  ll2 -65.44826790786279 -36.847373771693206
 EPSG:32726
   ll  -45.64851344048113 -31.882495362328466
-  en  119560.58075143833 4933398.9237327585
-  ll2 -45.64851343989748 -31.88249536231209
+  en  119560.58075143828 4933398.923731995
+  ll2 -45.648513439313405 -31.88249536231225
 EPSG:32727
   ll  -50.934366256586614 -25.166137353819305
-  en  207304.56798461726 4349205.018263729
-  ll2 -50.93436625633735 -25.166137353769805
+  en  207304.56798461737 4349205.018262214
+  ll2 -50.93436625608718 -25.166137353769884
 EPSG:32728
   ll  -75.6414574413936 -19.243865220370584
-  en  382615.2732716046 1600607.7105868515
-  ll2 -75.64145744134245 -19.24386521997399
+  en  382615.2732716046 1600607.7105821092
+  ll2 -75.64145744129156 -19.243865219974342
 EPSG:32729
   ll  -83.5333650193571 -5.501531193633692
-  en  543962.835055189 722665.361454945
-  ll2 -83.53336501935372 -5.501531193708958
+  en  543962.835055189 722665.3614518307
+  ll2 -83.53336501935377 -5.501531193707987
 EPSG:32730
   ll  -81.54589940598518 -0.6625327966681755
-  en  538355.0358692394 945086.5607411675
-  ll2 -81.5458994059829 -0.6625327966706558
+  en  538355.0358692394 945086.5607374981
+  ll2 -81.54589940598454 -0.6625327966701109
 EPSG:32731
   ll  -77.7299649478657 6.793662551026102
-  en  589941.1445311456 1368855.4457779005
-  ll2 -77.72996494784715 6.793662550878116
+  en  589941.1445311456 1368855.4457734264
+  ll2 -77.72996494783142 6.793662550878642
 EPSG:32732
   ll  -1.791491309390267 5.643292386980017
-  en  126449.06323080737 9801643.353370322
-  ll2 -1.7914913093887788 5.643292387171931
+  en  126449.06323080743 9801643.353370337
+  ll2 -1.7914913093881504 5.643292387171929
 EPSG:32733
   ll  -4.126836934079179 14.21193297521501
-  en  412530.97644885455 9543809.318915792
-  ll2 -4.126836934077884 14.211932975215113
+  en  412530.9764488546 9543809.318915822
+  ll2 -4.126836934079182 14.211932975215113
 EPSG:32734
   ll  3.2478852471029853 16.30155670183659
-  en  -22571.106634815456 1.0360208764095124E7
-  ll2 3.247885247076826 16.301556703090707
+  en  -22571.10663481534 1.03602087640951E7
+  ll2 3.247885247069191 16.301556703090707
 EPSG:32735
   ll  -67.02488461225471 23.602574863927025
-  en  352075.73642084474 2561806.4975045808
-  ll2 -67.02488461221535 23.602574863972343
+  en  352075.73642084474 2561806.4975000024
+  ll2 -67.0248846121725 23.60257486397256
 EPSG:32736
   ll  -42.55662303150512 29.942428252202173
-  en  248987.61723446447 5283887.580592804
-  ll2 -42.55662303147199 29.942428252161324
+  en  248987.61723446447 5283887.58059233
+  ll2 -42.55662303144185 29.94242825216124
 EPSG:32737
   ll  -63.21444761968792 35.222287816138596
-  en  310135.9849165189 2984926.8570488933
-  ll2 -63.214447619588334 35.22228781624288
+  en  310135.9849165189 2984926.8570449185
+  ll2 -63.21444761948333 35.22228781624316
 EPSG:32738
   ll  -33.61049536194267 49.3934280355533
-  en  907721.7528865209 6272366.919585204
-  ll2 -33.61049536177813 49.39342803597181
+  en  907721.7528865209 6272366.919585092
+  ll2 -33.61049536162698 49.393428035971766
 EPSG:32739
   ll  -36.97742607037574 49.32483640492937
-  en  350900.55360484595 5906320.568081439
-  ll2 -36.97742607037497 49.324836404927225
+  en  350900.55360484595 5906320.568081254
+  ll2 -36.977426070374484 49.32483640492722
 EPSG:32740
   ll  -78.828450880352 53.91362023885953
-  en  433274.5310192385 1247408.597646758
-  ll2 -78.82845088034634 53.913620238883254
+  en  433274.5310192385 1247408.5976424795
+  ll2 -78.82845088034429 53.91362023888275
 EPSG:32741
   ll  -26.30036312196733 65.289773385337
-  en  728606.5155660608 7089027.454681892
-  ll2 -26.300363121968427 65.28977338534429
+  en  728606.5155660608 7089027.454681832
+  ll2 -26.300363121964097 65.28977338534425
 EPSG:32742
   ll  -46.57798418816586 66.46686755703854
-  en  305909.44786115893 4838613.998469358
-  ll2 -46.577984188152286 66.46686755702721
+  en  305909.447861159 4838613.998468486
+  ll2 -46.577984188142224 66.46686755702713
 EPSG:32743
   ll  -25.298456802256545 78.290225577417
-  en  831325.5755857098 7197935.587045648
-  ll2 -25.298456802245934 78.29022557747085
+  en  831325.5755857098 7197935.587045593
+  ll2 -25.29845680223009 78.29022557747079
 EPSG:32744
   ll  -23.333853962130412 81.03414728671824
-  en  503490.800754981 7419521.505624639
-  ll2 -23.33385396213198 81.03414728671824
+  en  503490.800754981 7419521.505624598
+  ll2 -23.333853962130405 81.03414728671824
 EPSG:32745
   ll  -27.850501765768136 88.49974130692067
-  en  647670.9268986753 6918455.120880485
-  ll2 -27.85050176577014 88.49974130692154
+  en  647670.9268986753 6918455.1208804175
+  ll2 -27.850501765767852 88.4997413069215
 EPSG:32746
   ll  -21.043491771413862 94.96493214411353
-  en  704183.7578679286 7671781.457049133
-  ll2 -21.04349177141502 94.96493214411359
+  en  704183.7578679285 7671781.457049107
+  ll2 -21.043491771413077 94.96493214411358
 EPSG:32747
   ll  -17.444781767557416 97.838202011294
-  en  376622.8914274465 8070864.873775644
-  ll2 -17.444781767557274 97.8382020112942
+  en  376622.8914274465 8070864.873775648
+  ll2 -17.44478176755739 97.8382020112942
 EPSG:32748
   ll  -58.2033639588618 101.36763036809408
-  en  286575.74435410445 3542895.423578527
-  ll2 -58.203363958762644 101.36763036814246
+  en  286575.74435410445 3542895.423575569
+  ll2 -58.203363958659644 101.3676303681426
 EPSG:32749
   ll  -38.23589206710369 109.25679480724837
-  en  347437.22738472256 5766575.122088731
-  ll2 -38.23589206710225 109.25679480724578
+  en  347437.2273847225 5766575.122088502
+  ll2 -38.23589206710197 109.25679480724575
 EPSG:32750
   ll  -29.646256411547412 116.5390917394596
-  en  455389.40541231557 6720322.495279071
-  ll2 -29.64625641154921 116.53909173945958
+  en  455389.40541231557 6720322.4952789955
+  ll2 -29.64625641154741 116.5390917394596
 EPSG:32751
   ll  -32.31249913837224 123.5620478825476
-  en  552907.9443416377 6424786.563103266
-  ll2 -32.31249913837346 123.56204788254762
+  en  552907.9443416377 6424786.563103167
+  ll2 -32.312499138372246 123.56204788254762
 EPSG:32752
   ll  -40.03951775988635 127.43317318342925
-  en  366330.3564929392 5566680.742924484
-  ll2 -40.03951775988467 127.43317318342785
+  en  366330.3564929392 5566680.742924173
+  ll2 -40.03951775988534 127.43317318342783
 EPSG:32753
   ll  -28.176037015492348 138.7789296805875
-  en  871098.4449456041 6877512.944383415
-  ll2 -28.176037015452554 138.77892968074894
+  en  871098.4449456041 6877512.944383347
+  ll2 -28.17603701541255 138.7789296807489
 EPSG:32754
   ll  -76.09420937279235 144.16836879822267
-  en  584959.5966797009 1552021.5295583569
-  ll2 -76.09420937278291 144.16836879819374
+  en  584959.5966797009 1552021.5295536648
+  ll2 -76.09420937277592 144.16836879819402
 EPSG:32755
   ll  -5.430354355649115 147.0530080779711
-  en  505872.17624536785 9399764.410398081
-  ll2 -5.430354355647516 147.0530080779711
+  en  505872.17624536785 9399764.410398118
+  ll2 -5.430354355649118 147.0530080779711
 EPSG:32756
   ll  -52.48522451023355 152.57450200005235
-  en  471106.27600235335 4184906.4029197395
-  ll2 -52.48522451023299 152.57450200005235
+  en  471106.2760023533 4184906.4029179476
+  ll2 -52.48522451023355 152.57450200005235
 EPSG:32757
   ll  -20.68227265660569 154.09167529202733
-  en  -11660.993969266012 7705261.8022987265
-  ll2 -20.682272656454828 154.09167529182264
+  en  -11660.993969265954 7705261.802298705
+  ll2 -20.682272656387454 154.09167529182267
 EPSG:32758
   ll  -6.482322318456696 161.77847911397538
-  en  143617.7405419257 9282345.981167397
-  ll2 -6.48232231845288 161.77847911410754
+  en  143617.7405419257 9282345.981167438
+  ll2 -6.482322318451158 161.77847911410754
 EPSG:32759
   ll  -9.653111284693267 166.1444317382442
-  en  -33309.996839536005 8929144.290482178
-  ll2 -9.653111284606696 166.1444317392922
+  en  -33309.99683953577 8929144.290482225
+  ll2 -9.653111284583055 166.14443173929217
 EPSG:32760
   ll  -36.29211488935783 181.82910716731914
-  en  933779.944968744 5972815.905636307
-  ll2 -36.29211488900613 181.82910716792168
+  en  933779.944968744 5972815.905636139
+  ll2 -36.29211488867873 181.82910716792168
 EPSG:3301
   ll  59.493759099912154 27.525338967200614
Index: /trunk/src/org/openstreetmap/josm/data/projection/proj/AbstractProj.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/proj/AbstractProj.java	(revision 9112)
+++ /trunk/src/org/openstreetmap/josm/data/projection/proj/AbstractProj.java	(revision 9112)
@@ -0,0 +1,123 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.projection.proj;
+
+import org.openstreetmap.josm.data.projection.ProjectionConfigurationException;
+
+/**
+ * Abstract base class providing utilities for implementations of the Proj
+ * interface.
+ *
+ * This class has been derived from the implementation of the Geotools project;
+ * git 8cbf52d, org.geotools.referencing.operation.projection.MapProjection
+ * at the time of migration.
+ * <p>
+ *
+ * @author André Gosselin
+ * @author Martin Desruisseaux (PMO, IRD)
+ * @author Rueben Schulz
+*/
+public abstract class AbstractProj implements Proj {
+
+    /**
+     * Maximum number of iterations for iterative computations.
+     */
+    private static final int MAXIMUM_ITERATIONS = 15;
+
+    /**
+     * Relative iteration precision used in the <code>mlfn<code> method
+     */
+    private static final double MLFN_TOL = 1E-11;
+
+    /**
+     * Constants used to calculate {@link #en0}, {@link #en1},
+     * {@link #en2}, {@link #en3}, {@link #en4}.
+     */
+    private static final double C00= 1.0,
+                                C02= 0.25,
+                                C04= 0.046875,
+                                C06= 0.01953125,
+                                C08= 0.01068115234375,
+                                C22= 0.75,
+                                C44= 0.46875,
+                                C46= 0.01302083333333333333,
+                                C48= 0.00712076822916666666,
+                                C66= 0.36458333333333333333,
+                                C68= 0.00569661458333333333,
+                                C88= 0.3076171875;
+
+    /**
+     * Constant needed for the <code>mlfn<code> method.
+     * Setup at construction time.
+     */
+    protected double en0,en1,en2,en3,en4;
+
+    /**
+     * The square of excentricity: e² = (a²-b²)/a² where
+     * <var>e</var> is the {@linkplain #excentricity excentricity},
+     * <var>a</var> is the {@linkplain #semiMajor semi major} axis length and
+     * <var>b</var> is the {@linkplain #semiMinor semi minor} axis length.
+     */
+    protected double e2;
+
+    @Override
+    public void initialize(ProjParameters params) throws ProjectionConfigurationException {
+        e2 = params.ellps.e2;
+        //  Compute constants for the mlfn
+        double t;
+        en0 = C00 - e2  *  (C02 + e2  *
+             (C04 + e2  *  (C06 + e2  * C08)));
+        en1 =       e2  *  (C22 - e2  *
+             (C04 + e2  *  (C06 + e2  * C08)));
+        en2 =  (t = e2  *         e2) *
+             (C44 - e2  *  (C46 + e2  * C48));
+        en3 = (t *= e2) *  (C66 - e2  * C68);
+        en4 =   t * e2  *  C88;
+    }
+
+    /**
+     * Calculates the meridian distance. This is the distance along the central
+     * meridian from the equator to {@code phi}. Accurate to < 1e-5 meters
+     * when used in conjuction with typical major axis values.
+     *
+     * @param phi latitude to calculate meridian distance for.
+     * @param sphi sin(phi).
+     * @param cphi cos(phi).
+     * @return meridian distance for the given latitude.
+     */
+    protected final double mlfn(final double phi, double sphi, double cphi) {
+        cphi *= sphi;
+        sphi *= sphi;
+        return en0 * phi - cphi *
+              (en1 + sphi *
+              (en2 + sphi *
+              (en3 + sphi *
+              (en4))));
+    }
+
+    /**
+     * Calculates the latitude ({@code phi}) from a meridian distance.
+     * Determines phi to TOL (1e-11) radians, about 1e-6 seconds.
+     *
+     * @param arg meridian distance to calulate latitude for.
+     * @return the latitude of the meridian distance.
+     * @throws RuntimeException if the itteration does not converge.
+     */
+    protected final double inv_mlfn(double arg) {
+        double s, t, phi, k = 1.0/(1.0 - e2);
+        int i;
+        phi = arg;
+        for (i=MAXIMUM_ITERATIONS; true;) { // rarely goes over 5 iterations
+            if (--i < 0) {
+                throw new RuntimeException("Too many iterations");
+            }
+            s = Math.sin(phi);
+            t = 1.0 - e2 * s * s;
+            t = (mlfn(phi, s, Math.cos(phi)) - arg) * (t * Math.sqrt(t)) * k;
+            phi -= t;
+            if (Math.abs(t) < MLFN_TOL) {
+                return phi;
+            }
+        }
+    }
+
+}
Index: /trunk/src/org/openstreetmap/josm/data/projection/proj/TransverseMercator.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/proj/TransverseMercator.java	(revision 9111)
+++ /trunk/src/org/openstreetmap/josm/data/projection/proj/TransverseMercator.java	(revision 9112)
@@ -2,9 +2,4 @@
 package org.openstreetmap.josm.data.projection.proj;
 
-import static java.lang.Math.cos;
-import static java.lang.Math.pow;
-import static java.lang.Math.sin;
-import static java.lang.Math.sqrt;
-import static java.lang.Math.tan;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
@@ -12,13 +7,101 @@
 
 /**
- * Transverse Mercator projection.
+ * Transverse Mercator Projection (EPSG code 9807). This
+ * is a cylindrical projection, in which the cylinder has been rotated 90°.
+ * Instead of being tangent to the equator (or to an other standard latitude),
+ * it is tangent to a central meridian. Deformation are more important as we
+ * are going futher from the central meridian. The Transverse Mercator
+ * projection is appropriate for region wich have a greater extent north-south
+ * than east-west.
+ * <p>
  *
- * @author Dirk Stöcker
- * code based on JavaScript from Chuck Taylor
+ * The elliptical equations used here are series approximations, and their accuracy
+ * decreases as points move farther from the central meridian of the projection.
+ * The forward equations here are accurate to a less than a mm &plusmn;10 degrees from
+ * the central meridian, a few mm &plusmn;15 degrees from the
+ * central meridian and a few cm &plusmn;20 degrees from the central meridian.
+ * The spherical equations are not approximations and should always give the
+ * correct values.
+ * <p>
  *
+ * There are a number of versions of the transverse mercator projection
+ * including the Universal (UTM) and Modified (MTM) Transverses Mercator
+ * projections. In these cases the earth is divided into zones. For the UTM
+ * the zones are 6 degrees wide, numbered from 1 to 60 proceeding east from
+ * 180 degrees longitude, and between lats 84 degrees North and 80
+ * degrees South. The central meridian is taken as the center of the zone
+ * and the latitude of origin is the equator. A scale factor of 0.9996 and
+ * false easting of 500000m is used for all zones and a false northing of 10000000m
+ * is used for zones in the southern hemisphere.
+ * <p>
+ *
+ * NOTE: formulas used below are not those of Snyder, but rather those
+ *       from the {@code proj4} package of the USGS survey, which
+ *       have been reproduced verbatim. USGS work is acknowledged here.
+ * <p>
+ *
+ * This class has been derived from the implementation of the Geotools project;
+ * git 8cbf52d, org.geotools.referencing.operation.projection.TransverseMercator
+ * at the time of migration.
+ * <p>
+ *
+ * <b>References:</b>
+ * <ul>
+ *   <li> Proj-4.4.6 available at <A HREF="http://www.remotesensing.org/proj">www.remotesensing.org/proj</A><br>
+ *        Relevent files are: {@code PJ_tmerc.c}, {@code pj_mlfn.c}, {@code pj_fwd.c} and {@code pj_inv.c}.</li>
+ *   <li> John P. Snyder (Map Projections - A Working Manual,
+ *        U.S. Geological Survey Professional Paper 1395, 1987).</li>
+ *   <li> "Coordinate Conversions and Transformations including Formulas",
+ *        EPSG Guidence Note Number 7, Version 19.</li>
+ * </ul>
+ *
+ * @see <A HREF="http://mathworld.wolfram.com/MercatorProjection.html">Transverse Mercator projection on MathWorld</A>
+ * @see <A HREF="http://www.remotesensing.org/geotiff/proj_list/transverse_mercator.html">"Transverse_Mercator" on RemoteSensing.org</A>
+ *
+ * @author André Gosselin
+ * @author Martin Desruisseaux (PMO, IRD)
+ * @author Rueben Schulz
  */
-public class TransverseMercator implements Proj {
+public class TransverseMercator extends AbstractProj {
 
-    protected double a, b;
+    /**
+     * Contants used for the forward and inverse transform for the eliptical
+     * case of the Transverse Mercator.
+     */
+    private static final double FC1= 1.00000000000000000000000,  // 1/1
+                                FC2= 0.50000000000000000000000,  // 1/2
+                                FC3= 0.16666666666666666666666,  // 1/6
+                                FC4= 0.08333333333333333333333,  // 1/12
+                                FC5= 0.05000000000000000000000,  // 1/20
+                                FC6= 0.03333333333333333333333,  // 1/30
+                                FC7= 0.02380952380952380952380,  // 1/42
+                                FC8= 0.01785714285714285714285;  // 1/56
+
+    /**
+     * Maximum difference allowed when comparing real numbers.
+     */
+    private static final double EPSILON = 1E-6;
+
+    /**
+     * A derived quantity of excentricity, computed by <code>e'² = (a²-b²)/b² = es/(1-es)</code>
+     * where <var>a</var> is the semi-major axis length and <var>b</bar> is the semi-minor axis
+     * length.
+     */
+    private double eb2;
+
+    /**
+     * Latitude of origin in <u>radians</u>. Default value is 0, the equator.
+     * This is called '<var>phi0</var>' in Snyder.
+     * <p>
+     * <strong>Consider this field as final</strong>. It is not final only
+     * because some classes need to modify it at construction time.
+     */
+    protected double latitudeOfOrigin;
+
+    /**
+     * Meridian distance at the {@code latitudeOfOrigin}.
+     * Used for calculations for the ellipsoid.
+     */
+    private double ml0;
 
     @Override
@@ -34,253 +117,66 @@
     @Override
     public void initialize(ProjParameters params) throws ProjectionConfigurationException {
-        this.a = params.ellps.a;
-        this.b = params.ellps.b;
+        super.initialize(params);
+        eb2 = params.ellps.eb2;
+        latitudeOfOrigin = params.lat0 == null ? 0 : Math.toRadians(params.lat0);
+        ml0 = mlfn(latitudeOfOrigin, Math.sin(latitudeOfOrigin), Math.cos(latitudeOfOrigin));
     }
 
-    /**
-     * Converts a latitude/longitude pair to x and y coordinates in the
-     * Transverse Mercator projection.  Note that Transverse Mercator is not
-     * the same as UTM; a scale factor is required to convert between them.
-     *
-     * Reference: Hoffmann-Wellenhof, B., Lichtenegger, H., and Collins, J.,
-     * GPS: Theory and Practice, 3rd ed.  New York: Springer-Verlag Wien, 1994.
-     *
-     * @param phi Latitude of the point, in radians
-     * @param lambda Longitude of the point, in radians
-     * @return A 2-element array containing the x and y coordinates
-     *         of the computed point
-     */
     @Override
-    public double[] project(double phi, double lambda) {
+    public double[] project(double y, double x) {
+        double sinphi = Math.sin(y);
+        double cosphi = Math.cos(y);
 
-        /* Precalculate ep2 */
-        double ep2 = (pow(a, 2.0) - pow(b, 2.0)) / pow(b, 2.0);
+        double t = (Math.abs(cosphi) > EPSILON) ? sinphi/cosphi : 0;
+        t *= t;
+        double al = cosphi*x;
+        double als = al*al;
+        al /= Math.sqrt(1.0 - e2 * sinphi*sinphi);
+        double n = eb2 * cosphi*cosphi;
 
-        /* Precalculate nu2 */
-        double nu2 = ep2 * pow(cos(phi), 2.0);
+        /* NOTE: meridinal distance at latitudeOfOrigin is always 0 */
+        y = (mlfn(y, sinphi, cosphi) - ml0 +
+            sinphi * al * x *
+            FC2 * ( 1.0 +
+            FC4 * als * (5.0 - t + n*(9.0 + 4.0*n) +
+            FC6 * als * (61.0 + t * (t - 58.0) + n*(270.0 - 330.0*t) +
+            FC8 * als * (1385.0 + t * ( t*(543.0 - t) - 3111.0))))));
 
-        /* Precalculate N / a */
-        double N_a = a / (b * sqrt(1 + nu2));
+        x = al*(FC1 + FC3 * als*(1.0 - t + n +
+            FC5 * als * (5.0 + t*(t - 18.0) + n*(14.0 - 58.0*t) +
+            FC7 * als * (61.0+ t*(t*(179.0 - t) - 479.0 )))));
 
-        /* Precalculate t */
-        double t = tan(phi);
-        double t2 = t * t;
-
-        /* Precalculate l */
-        double l = lambda;
-
-        /* Precalculate coefficients for l**n in the equations below
-           so a normal human being can read the expressions for easting
-           and northing
-           -- l**1 and l**2 have coefficients of 1.0 */
-        double l3coef = 1.0 - t2 + nu2;
-
-        double l4coef = 5.0 - t2 + 9 * nu2 + 4.0 * (nu2 * nu2);
-
-        double l5coef = 5.0 - 18.0 * t2 + (t2 * t2) + 14.0 * nu2
-        - 58.0 * t2 * nu2;
-
-        double l6coef = 61.0 - 58.0 * t2 + (t2 * t2) + 270.0 * nu2
-        - 330.0 * t2 * nu2;
-
-        double l7coef = 61.0 - 479.0 * t2 + 179.0 * (t2 * t2) - (t2 * t2 * t2);
-
-        double l8coef = 1385.0 - 3111.0 * t2 + 543.0 * (t2 * t2) - (t2 * t2 * t2);
-
-        return new double[] {
-                /* Calculate easting (x) */
-                N_a * cos(phi) * l
-                + (N_a / 6.0 * pow(cos(phi), 3.0) * l3coef * pow(l, 3.0))
-                + (N_a / 120.0 * pow(cos(phi), 5.0) * l5coef * pow(l, 5.0))
-                + (N_a / 5040.0 * pow(cos(phi), 7.0) * l7coef * pow(l, 7.0)),
-                /* Calculate northing (y) */
-                ArcLengthOfMeridian(phi) / a
-                + (t / 2.0 * N_a * pow(cos(phi), 2.0) * pow(l, 2.0))
-                + (t / 24.0 * N_a * pow(cos(phi), 4.0) * l4coef * pow(l, 4.0))
-                + (t / 720.0 * N_a * pow(cos(phi), 6.0) * l6coef * pow(l, 6.0))
-                + (t / 40320.0 * N_a * pow(cos(phi), 8.0) * l8coef * pow(l, 8.0)) };
+        return new double[] { x, y };
     }
 
-    /**
-     * Converts x and y coordinates in the Transverse Mercator projection to
-     * a latitude/longitude pair.  Note that Transverse Mercator is not
-     * the same as UTM; a scale factor is required to convert between them.
-     *
-     * Reference: Hoffmann-Wellenhof, B., Lichtenegger, H., and Collins, J.,
-     *   GPS: Theory and Practice, 3rd ed.  New York: Springer-Verlag Wien, 1994.
-     *
-     * Remarks:
-     *   The local variables Nf, nuf2, tf, and tf2 serve the same purpose as
-     *   N, nu2, t, and t2 in MapLatLonToXY, but they are computed with respect
-     *   to the footpoint latitude phif.
-     *
-     *   x1frac, x2frac, x2poly, x3poly, etc. are to enhance readability and
-     *   to optimize computations.
-     *
-     * @param x The easting of the point, in meters, divided by the semi major axis of the ellipsoid
-     * @param y The northing of the point, in meters, divided by the semi major axis of the ellipsoid
-     * @return A 2-element containing the latitude and longitude
-     *               in radians
-     */
     @Override
     public double[] invproject(double x, double y) {
-        /* Get the value of phif, the footpoint latitude. */
-        double phif = footpointLatitude(y);
+        double phi = inv_mlfn(ml0 + y);
 
-        /* Precalculate ep2 */
-        double ep2 = (a*a - b*b)
-        / (b*b);
+        if (Math.abs(phi) >= Math.PI/2) {
+            y = y<0.0 ? -(Math.PI/2) : (Math.PI/2);
+            x = 0.0;
+        } else {
+            double sinphi = Math.sin(phi);
+            double cosphi = Math.cos(phi);
+            double t = (Math.abs(cosphi) > EPSILON) ? sinphi/cosphi : 0.0;
+            double n = eb2 * cosphi*cosphi;
+            double con = 1.0 - e2 * sinphi*sinphi;
+            double d = x * Math.sqrt(con);
+            con *= t;
+            t *= t;
+            double ds = d*d;
 
-        /* Precalculate cos(phif) */
-        double cf = cos(phif);
+            y = phi - (con*ds / (1.0 - e2)) *
+                FC2 * (1.0 - ds *
+                FC4 * (5.0 + t*(3.0 - 9.0*n) + n*(1.0 - 4*n) - ds *
+                FC6 * (61.0 + t*(90.0 - 252.0*n + 45.0*t) + 46.0*n - ds *
+                FC8 * (1385.0 + t*(3633.0 + t*(4095.0 + 1574.0*t))))));
 
-        /* Precalculate nuf2 */
-        double nuf2 = ep2 * pow(cf, 2.0);
-
-        /* Precalculate Nf / a and initialize Nfpow */
-        double Nf_a = a / (b * sqrt(1 + nuf2));
-        double Nfpow = Nf_a;
-
-        /* Precalculate tf */
-        double tf = tan(phif);
-        double tf2 = tf * tf;
-        double tf4 = tf2 * tf2;
-
-        /* Precalculate fractional coefficients for x**n in the equations
-           below to simplify the expressions for latitude and longitude. */
-        double x1frac = 1.0 / (Nfpow * cf);
-
-        Nfpow *= Nf_a;   /* now equals Nf**2) */
-        double x2frac = tf / (2.0 * Nfpow);
-
-        Nfpow *= Nf_a;   /* now equals Nf**3) */
-        double x3frac = 1.0 / (6.0 * Nfpow * cf);
-
-        Nfpow *= Nf_a;   /* now equals Nf**4) */
-        double x4frac = tf / (24.0 * Nfpow);
-
-        Nfpow *= Nf_a;   /* now equals Nf**5) */
-        double x5frac = 1.0 / (120.0 * Nfpow * cf);
-
-        Nfpow *= Nf_a;   /* now equals Nf**6) */
-        double x6frac = tf / (720.0 * Nfpow);
-
-        Nfpow *= Nf_a;   /* now equals Nf**7) */
-        double x7frac = 1.0 / (5040.0 * Nfpow * cf);
-
-        Nfpow *= Nf_a;   /* now equals Nf**8) */
-        double x8frac = tf / (40320.0 * Nfpow);
-
-        /* Precalculate polynomial coefficients for x**n.
-           -- x**1 does not have a polynomial coefficient. */
-        double x2poly = -1.0 - nuf2;
-        double x3poly = -1.0 - 2 * tf2 - nuf2;
-        double x4poly = 5.0 + 3.0 * tf2 + 6.0 * nuf2 - 6.0 * tf2 * nuf2 - 3.0 * (nuf2 *nuf2) - 9.0 * tf2 * (nuf2 * nuf2);
-        double x5poly = 5.0 + 28.0 * tf2 + 24.0 * tf4 + 6.0 * nuf2 + 8.0 * tf2 * nuf2;
-        double x6poly = -61.0 - 90.0 * tf2 - 45.0 * tf4 - 107.0 * nuf2 + 162.0 * tf2 * nuf2;
-        double x7poly = -61.0 - 662.0 * tf2 - 1320.0 * tf4 - 720.0 * (tf4 * tf2);
-        double x8poly = 1385.0 + 3633.0 * tf2 + 4095.0 * tf4 + 1575 * (tf4 * tf2);
-
-        return new double[] {
-                        /* Calculate latitude */
-                        phif + x2frac * x2poly * (x * x)
-                        + x4frac * x4poly * pow(x, 4.0)
-                        + x6frac * x6poly * pow(x, 6.0)
-                        + x8frac * x8poly * pow(x, 8.0),
-                        /* Calculate longitude */
-                        x1frac * x
-                        + x3frac * x3poly * pow(x, 3.0)
-                        + x5frac * x5poly * pow(x, 5.0)
-                        + x7frac * x7poly * pow(x, 7.0) };
-    }
-
-    /**
-     * ArcLengthOfMeridian
-     *
-     * Computes the ellipsoidal distance from the equator to a point at a
-     * given latitude.
-     *
-     * Reference: Hoffmann-Wellenhof, B., Lichtenegger, H., and Collins, J.,
-     * GPS: Theory and Practice, 3rd ed.  New York: Springer-Verlag Wien, 1994.
-     *
-     * @param phi Latitude of the point, in radians
-     * @return The ellipsoidal distance of the point from the equator
-     *         (in meters, divided by the semi major axis of the ellipsoid)
-     */
-    private double ArcLengthOfMeridian(double phi) {
-        /* Precalculate n */
-        double n = (a - b) / (a + b);
-
-        /* Precalculate alpha */
-        double alpha = ((a + b) / 2.0)
-            * (1.0 + (pow(n, 2.0) / 4.0) + (pow(n, 4.0) / 64.0));
-
-        /* Precalculate beta */
-        double beta = (-3.0 * n / 2.0) + (9.0 * pow(n, 3.0) / 16.0)
-            + (-3.0 * pow(n, 5.0) / 32.0);
-
-        /* Precalculate gamma */
-        double gamma = (15.0 * pow(n, 2.0) / 16.0)
-            + (-15.0 * pow(n, 4.0) / 32.0);
-
-        /* Precalculate delta */
-        double delta = (-35.0 * pow(n, 3.0) / 48.0)
-            + (105.0 * pow(n, 5.0) / 256.0);
-
-        /* Precalculate epsilon */
-        double epsilon = 315.0 * pow(n, 4.0) / 512.0;
-
-        /* Now calculate the sum of the series and return */
-        return alpha
-            * (phi + (beta * sin(2.0 * phi))
-                    + (gamma * sin(4.0 * phi))
-                    + (delta * sin(6.0 * phi))
-                    + (epsilon * sin(8.0 * phi)));
-    }
-
-    /**
-     * FootpointLatitude
-     *
-     * Computes the footpoint latitude for use in converting transverse
-     * Mercator coordinates to ellipsoidal coordinates.
-     *
-     * Reference: Hoffmann-Wellenhof, B., Lichtenegger, H., and Collins, J.,
-     *   GPS: Theory and Practice, 3rd ed.  New York: Springer-Verlag Wien, 1994.
-     *
-     * @param y northing coordinate, in meters, divided by the semi major axis of the ellipsoid
-     * @return The footpoint latitude, in radians
-     */
-    private double footpointLatitude(double y) {
-        /* Precalculate n (Eq. 10.18) */
-        double n = (a - b) / (a + b);
-
-        /* Precalculate alpha_ (Eq. 10.22) */
-        /* (Same as alpha in Eq. 10.17) */
-        double alpha_ = ((a + b) / 2.0)
-            * (1 + (pow(n, 2.0) / 4) + (pow(n, 4.0) / 64));
-
-        /* Precalculate y_ (Eq. 10.23) */
-        double y_ = y / alpha_ * a;
-
-        /* Precalculate beta_ (Eq. 10.22) */
-        double beta_ = (3.0 * n / 2.0) + (-27.0 * pow(n, 3.0) / 32.0)
-            + (269.0 * pow(n, 5.0) / 512.0);
-
-        /* Precalculate gamma_ (Eq. 10.22) */
-        double gamma_ = (21.0 * pow(n, 2.0) / 16.0)
-            + (-55.0 * pow(n, 4.0) / 32.0);
-
-        /* Precalculate delta_ (Eq. 10.22) */
-        double delta_ = (151.0 * pow(n, 3.0) / 96.0)
-            + (-417.0 * pow(n, 5.0) / 128.0);
-
-        /* Precalculate epsilon_ (Eq. 10.22) */
-        double epsilon_ = 1097.0 * pow(n, 4.0) / 512.0;
-
-        /* Now calculate the sum of the series (Eq. 10.21) */
-        return y_ + (beta_ * sin(2.0 * y_))
-            + (gamma_ * sin(4.0 * y_))
-            + (delta_ * sin(6.0 * y_))
-            + (epsilon_ * sin(8.0 * y_));
+            x = d*(FC1 - ds * FC3 * (1.0 + 2.0*t + n -
+                ds*FC5*(5.0 + t*(28.0 + 24* t + 8.0*n) + 6.0*n -
+                ds*FC7*(61.0 + t*(662.0 + t*(1320.0 + 720.0*t))))))/cosphi;
+        }
+        return new double[] { y, x };
     }
 }
