| 16 | | <script type="text/javascript"> |
| 17 | | //<![CDATA[ |
| 18 | | GPoint.prototype.exjp_map_datum = function (datum) { |
| 19 | | if (datum) this._exjp_map_datum = datum; |
| 20 | | return this._exjp_map_datum ? this._exjp_map_datum : GPoint.exjp_judge_tow(this.x,this.y); |
| 21 | | } |
| 22 | | GPoint.prototype.exjp_map_coord = function () { |
| 23 | | return [this.x,this.y]; |
| 24 | | } |
| 25 | | GPoint.prototype.exjp_origin_datum = function (datum) { |
| 26 | | if (datum) this._exjp_origin_datum = datum; |
| 27 | | return this._exjp_origin_datum ? this._exjp_origin_datum : 'wgs84'; |
| 28 | | } |
| 29 | | GPoint.prototype.exjp_origin_coord = function (x,y) { |
| 30 | | if (x && y) this._exjp_origin_coord = [x,y]; |
| 31 | | return this._exjp_origin_coord ? this._exjp_origin_coord : GPoint.exjp_datum_change(this.x,this.y,this.exjp_map_datum,this.exjp_origin_datum); |
| 32 | | } |
| 33 | | GPoint.exjp_create = function(lng,lat,datum,use_simple) { |
| 34 | | var change_method = use_simple ? GPoint.exjp_simple_change : GPoint.exjp_datum_change; |
| 35 | | if (!(datum)) datum = 'wgs84'; |
| 36 | | |
| 37 | | var map_datum = GPoint.exjp_judge_tow(lng,lat); |
| 38 | | var t_coord = change_method(lng,lat,datum,map_datum); |
| 39 | | var ret = new GPoint(t_coord[0],t_coord[1]); |
| 40 | | ret.exjp_map_datum(map_datum); |
| 41 | | ret.exjp_origin_datum(datum); |
| 42 | | return ret; |
| 43 | | } |
| 44 | | |
| 45 | | GPoint.exjp_judge_tow = function (lng,lat) { |
| 46 | | if (lng > 115 && lng < 152 && lat > 30 && lat < 50) { |
| 47 | | return 'tokyo'; |
| 48 | | } else { |
| 49 | | return 'wgs84'; |
| 50 | | } |
| 51 | | } |
| 52 | | |
| 53 | | GPoint.exjp_ellip = new Object; |
| 54 | | GPoint.exjp_ellip['wgs84'] = [6378137,(1 / 298.257223),0,0,0]; |
| 55 | | GPoint.exjp_ellip['tokyo'] = [6377397.155,(1 / 299.152813),148,-507,-681]; |
| 56 | | |
| 57 | | GPoint.exjp_datum_change = function (lng,lat,from_d,to_d) { |
| 58 | | if (from_d == to_d) return [lng,lat]; |
| 59 | | |
| 60 | | var fellip = GPoint.exjp_ellip[from_d]; |
| 61 | | var tellip = GPoint.exjp_ellip[to_d]; |
| 62 | | |
| 63 | | var a_v = [fellip[0],tellip[0]]; // Equatorial Radius |
| 64 | | var f_v = [fellip[1],tellip[1]]; // Flattening |
| 65 | | |
| 66 | | var dx = tellip[2] - fellip[2]; |
| 67 | | var dy = tellip[3] - fellip[3]; |
| 68 | | var dz = tellip[4] - fellip[4]; |
| 69 | | |
| 70 | | return GPoint.exjp_molodensky(lng, lat, a_v[0], f_v[0], a_v[1], f_v[1],dx,dy,dz); |
| 71 | | } |
| 72 | | GPoint.exjp_molodensky = function (l,b,a1,f1,a2,f2,dx,dy,dz) { |
| 73 | | var rd = Math.PI/180; |
| 74 | | |
| 75 | | b *= rd; |
| 76 | | l *= rd; |
| 77 | | |
| 78 | | var e2 = 2*f1 - f1*f1; // Square of Eccentricity |
| 79 | | var bda = 1- f1; // Polar Radius / Equatorial Radius |
| 80 | | var da = a2 - a1; |
| 81 | | var df = f2 - f1; |
| 82 | | var sb = Math.sin(b); |
| 83 | | var cb = Math.cos(b); |
| 84 | | var sl = Math.sin(l); |
| 85 | | var cl = Math.cos(l); |
| 86 | | |
| 87 | | var rn = 1 / Math.sqrt(1 - e2*sb*sb); |
| 88 | | var rm = a1 * (1 - e2) * rn * rn * rn; |
| 89 | | rn *= a1; |
| 90 | | |
| 91 | | // Calcurating Delta Value |
| 92 | | var db = -dx*sb*cl - dy*sb*sl + dz*cb + da*rn*e2*sb*cb/a1 + df*(rm/bda+rn*bda)*sb*cb; |
| 93 | | db /= rm; |
| 94 | | var dl = -dx*sl + dy*cl; |
| 95 | | dl /= rn * cb; |
| 96 | | |
| 97 | | return [(l+dl)/rd,(b+db)/rd]; |
| 98 | | } |
| 99 | | GPoint.exjp_simple_change = function (lng,lat,from_d,to_d) { |
| 100 | | if (from_d == to_d) return [lng,lat]; |
| 101 | | |
| 102 | | if (from_d == 'tokyo') { |
| 103 | | t_lat = lat - 0.00010695*lat + 0.000017464*lng + 0.0046017; |
| 104 | | t_lng = lng - 0.000046038*lat - 0.000083043*lng + 0.010040; |
| 105 | | } else { |
| 106 | | t_lat = lat + 0.00010696*lat - 0.000017467*lng - 0.0046020; |
| 107 | | t_lng = lng + 0.000046047*lat + 0.000083049*lng - 0.010041; |
| 108 | | } |
| 109 | | return [t_lng,t_lat]; |
| 110 | | } |
| 111 | | //]]> |
| 112 | | </script> |