GCJ-02锛堥珮寰凤級BD-09锛堢櫨搴︼級WGS-84锛堣胺姝岋級鍧愭爣绯讳箣闂寸殑杞崲02.BD-09鍧愭爣绯绘槸浠€涔圵GS84锛圵orldGeodeticSystem1984锛夛細鏄疓PS寤虹珛鐨勫潗鏍囩郴鍏ㄧ悆瀹氫綅绯荤粺锛屼互鍙婇€氳繃GPS瀹氫綅寰楀埌鐨勫師濮嬬粡绾害銆侴CJ-02锛堝浗瀹舵祴缁樺眬鏍囧噯绗?2鍙凤級锛欸CJ-02鏄腑鍥藉浗瀹舵祴缁樺眬鍒跺畾鐨勫湴鐞嗕俊鎭郴缁熷潗鏍囩郴锛圙琛ㄧず鍥藉槈鍥斤紝C琛ㄧず娴嬬粯娴嬬粯锛塵apping,J琛ㄧず鑱氬眬锛夈€傚畠鏄湪WGS84缁忕含搴﹀姞瀵嗙畻娉曠殑鍩虹涓婂疄鐜扮殑銆傚洜涓篏PS鑾峰彇鐨勭粡绾害浼氱洿鎺ュ湪GCJ-02鍧愭爣绯讳腑瀹氫綅閿欒鐨勫湴鏂癸紝鎰熻灏卞儚鍦ㄧ伀鏄熶笂涓€鏍凤紝鎵€浠CJ-02鍦ㄥ競鍦轰笂涔熻鎴忕О涓虹伀鏄熷潗鏍囩郴銆傚浗鍐呴珮寰峰湴鍥句娇鐢℅CJ-02鍧愭爣绯籅D-09锛堢櫨搴︼紝BD锛夛細鏄櫨搴﹀湴鍥句娇鐢ㄧ殑鍦扮悊鍧愭爣绯伙紝鍦℅CJ-02涓婂鍔犱簡涓€涓澶栫殑鍙樻崲锛屼繚鎶ょ敤鎴烽殣绉併€備粠鐧惧害浜у搧涓幏鍙栫殑鍧愭爣閮芥槸BD-09鍧愭爣绯汇€俉GS-84銆丟CJ-02銆丅D-09鍧愭爣绯讳箣闂寸殑杞崲鏂板缓涓€涓猨s鏂囦欢锛岀洿鎺ュ皢浠ヤ笅浠g爜澶嶅埗杩涘幓銆傞渶瑕佷娇鐢ㄧ殑鍦版柟鍙互閫氳繃瀵煎叆璋冪敤浠ヤ笅杞崲鏂规硶鈥斺€?鈥斺€?***鍒ゆ柇缁忕含搴︽槸鍚﹀湪涓浗澧冨*/functionisLocationOutOfChina(latitude,longitude){if(longitude<72.004||缁忓害>137.8347||绾害<0.8293||绾害>55.8271)杩斿洖鐪燂紱returnfalse;}/***灏哤GS-84锛堝浗闄呮爣鍑嗭級杞崲涓篏CJ-02锛堢伀鏄熷潗鏍囷級锛?/functiontransformFromWGSToGCJ(latitude,longitude){varlat="";varlon="";varee=0.00669342162296594323;vara=6378245.0;varpi=3.14159265358979324;if(isLocationOutOfChina(latitude,longitude)){lat=latitude;lon=缁忓害锛泒else{varadjustLat=transformLatWithXY(longitude-105.0,latitude-35.0);varadjustLon=transformLonWithXY(缁忓害-105.0,绾害-35.0);varradLat=绾害/180.0*pi;varmagic=Math.sin(radLat);榄旀硶=1-ee*榄旀硶*榄旀硶锛泇arsqrtMagic=鏁板銆傚紑鏂癸紙榄旀硶锛夛紱adjustLat=(adjustLat*180.0)/((a*(1-ee))/(magic*sqrtMagic)*pi);adjustLon=(涓€涓猘djustLon*180.0)/(a/sqrtMagic*Math.cos(radLat)*pi);绾害=绾害+璋冩暣绾害锛涚粡搴?缁忓害+adjustLon锛泒return{latitude:latitude,longitude:longitude};}/***灏咷CJ-02锛堢伀鏄熷潗鏍囷級杞负鐧惧害鍧愭爣锛圖B-09锛?*/functiontransformFromGCJToBaidu(latitude,longitude){varpi=3.14159265358979324*3000.0/180.0;varz=Math.sqrt(缁忓害*缁忓害+绾害*绾害)+0.00002*Math.sin(绾害*pi);vartheta=Math.atan2(latitude,longitude)+0.000003*Math.cos(longitude*pi);vara_latitude=(z*Math.sin(theta)+0.006);vara_longitude=(z*Math.cos(theta)+0.0065);return{latitude:a_latitude,longitude:a_longitude};}/***灏嗙櫨搴﹀潗鏍囷紙DB-09锛夎浆鎹负GCJ-02锛堢伀鏄熷潗鏍囷級锛?/functiontransformFromBaiduToGCJ(latitude,longitude){varxPi=3.14159265358979323846264338327950288*3000.0/180.0;varx=缁忓害-0.0065锛涘彉閲弝=绾害-0.006锛泇arz=Math.sqrt(x*x+y*y)-0.00002*鏁板銆傜姜鎭讹紙y*xPi锛夛紱vartheta=Math.atan2(y,x)-0.000003*Math.cos(x*xPi);vara_latitude=z*Math.sin(theta);vara_longitude=z*Math.cos(theta);return{latitude:a_latitude,longitude:a_longitude};}/***灏咷CJ-02(鐏槦鍧愭爣)杞负WGS-84(鍥介檯鏍囧噯):*/functiontransformFromGCJToWGS(latitude,longitude){varthreshold=0.00001;//杈圭晫varminLat=latitude-0.5;varmaxLat=绾害+0.5;varminLng=缁忓害-0.5;varmaxLng=缁忓害+0.5;鍙橀噺澧為噺=1;鍙樼鏈€澶ц凯浠?30;while(true){varleftBottom=transformFromWGSToGCJ(minLat,minLng);varrightBottom=transformFromWGSToGCJ(minLat,maxLng);varleftUp=transformFromWGSToGCJ(maxLat,minLng);varmidPoint=transformFromWGSToGCJ((minLat+maxLat)/2,(minLng+maxLng)/2);delta=Math.abs(midPoint.latitude-绾害)+Math.abs(midPoint.longitude-缁忓害);濡傛灉锛坢axIteration--<=0||delta<=threshold锛墈return{绾害锛氾紙minLat+maxLat)/2,缁忓害:(minLng+maxLng)/2};}if(isContains({latitude:latitude,longitude:longitude},leftBottom,midPoint)){maxLat=(minLat+maxLat)/2;鏈€澶ч暱搴?(鏈€灏忛暱搴?鏈€澶ч暱搴?/2;}elseif(isContains({latitude:latitude,longitude:longitude},rightBottom,midPoint)){maxLat=(minLat+maxLat)/2;minLng=(minLng+maxLng)/2;}elseif(isContains({latitude:latitude,longitude:longitude},leftUp,midPoint)){minLat=(minLat+maxLat)/2;鏈€澶ч暱搴?(鏈€灏忛暱搴?鏈€澶ч暱搴?/2;}else{minLat=(minLat+maxLat)/2;minLng=(minLng+maxLng)/2;}}}functionisContains(point,p1,p2){return(point.latitude>=Math.min(p1.latitude,p2.latitude)&&point.latitude<=Math.max(p1.latitude,p2.latitude))&&(point.longitude>=Math.min(p1.longitude,p2.longitude)&&point.longitude<=Math.max(p1.longitude,p2.longitude));}functiontransformLatWithXY(x,y){varpi=3.14159265358979324;varlat=-100.0+2.0*x+3.0*y+0.2*y*y+0.1*x*y+0.2*Math.sqrt(Math.abs(x));lat+=(20.0*Math.sin(6.0*x*pi)+20.0*Math.sin(2.0*x*pi))*2.0/3.0;lat+=(20.0*Math.sin(y*pi)+40.0*Math.sin(y/3.0*pi))*2.0/3.0锛沴at+=(160.0*Math.sin(y/12.0*pi)+320*Math.sin(y*pi/30.0))*2.0/3.0锛況eturnlat;}functiontransformLonWithXY(x,y){varpi=3.14159265358979324;varlon=300.0+x+2.0*y+0.1*x*x+0.1*x*y+0.1*Math.sqrt(Math.abs(x));lon+=(20.0*Math.sin(6.0*x*pi)+20.0*Math.sin(2.0*x*pi))*2.0/3.0;lon+=(20.0*Math.sin(x*pi)+40.0*Math.sin(x/3.0*pi))*2.0/3.0;lon+=(150.0*Math.sin(x/12.0*pi)+300.0*Math.sin(x/30.0*pi))*2.0/3.0锛況eturnlon;}module.exports={isLocationOutOfChina:isLocationOutOfChina,transformFromWGSToGCJ:transformFromWGSToGCJ,transformFromGCJToBaidu:transformFromGCJToBaidu,transformFromBaiduToGCJ:transformFromBaiduToGCJ,transformFromGCJToWGS:transformFromGCJToWGS}鎬荤粨涓轰簡闃呰鏂逛究锛屾垜灏嗚繖浜涘潗鏍囩郴鎹㈡垚浜嗙櫨搴﹀湴鍥俱€侀珮寰峰湴鍥俱€佽胺姝屽湴鍥俱€佽胺姝屽潗鏍囩郴锛圵GS-84锛夌瓑浜у搧鍚嶇О锛岄珮寰峰潗鏍囩郴锛圙CJ-02锛夊拰鐧惧害鍧愭爣绯伙紙BD-09锛夐儴鍒嗛」鐩彲鑳戒細浣跨敤绗笁鏂笰PI鑾峰彇鏁版嵁銆傚鏋滆繖涓涓夋柟鐨勬暟鎹槸楂樺痉鍦板浘鍧愭爣绯荤殑鏁版嵁锛岃€屼娇鐢ㄧ殑鏄櫨搴﹀潗鏍囩郴鐨勬暟鎹€傝繖鏃跺€欏氨闇€瑕佸皢楂樺痉鍧愭爣绯昏浆鎹㈡垚鐧惧害鍧愭爣绯荤殑鏁版嵁銆傝€屼笖鍥犱负涓氬姟闇€瑕侊紝濡傛灉浣犺皟鏁村彟澶栦竴涓涓夋柟鎺ュ彛鑾峰彇璋锋瓕鍦板浘鐨勫潗鏍囩郴锛岃繖鏃跺€欎綘灏卞緱鎶婅胺姝屽潗鏍囩郴杞崲鎴愰珮寰峰潗鏍囩郴鐨勬暟鎹紝鍐嶈浆鎹㈡垚楂樺痉鍦板浘鐨勬暟鎹€傞珮寰峰潗鏍囩郴杞崲鎴愪綘椤圭洰涓殑鐧惧害鍧愭爣绯绘暟鎹紝鍧愭爣绯昏浆鎹㈡垚杩欐牱璋锋瓕鍧愭爣绯伙紙WGS-84锛?>楂樺痉鍧愭爣绯伙紙GCJ-02锛?>鐧惧害鍧愭爣绯伙紙BD-09锛夛紝鎵€浠ユ瘮杈冮夯鐑︺€傛垜鐨勫缓璁細鍥犱负璋锋瓕鍧愭爣绯昏浆鎹㈡垚鐧惧害鍧愭爣绯伙紝闇€瑕佸厛杞崲鎴愰珮寰峰潗鏍囩郴锛屾墠鑳借繘涓€姝ヨ浆鎹㈡垚鐧惧害鍧愭爣绯汇€備负浜嗗噺灏戣浆鎹㈡鏁帮紝鎴戠洿鎺ョ粺涓€灏嗗嚑涓潗鏍囩郴杞崲鎴愪腑闂撮珮寰峰潗鏍囩郴銆傛渶鍚庯紝鎴戞槸AndyHu锛岀洰鍓嶆殏鏃舵槸涓€鍚嶅墠绔惉鐮栧伐绋嬪笀銆傛枃绔犲鏈夐敊璇紝娆㈣繋鍦ㄨ瘎璁哄尯鎸囨銆傚鏋滄湰鏂囧鎮ㄦ湁甯姪锛岃鐐硅禐鍏虫敞銆傛湭缁忚鍙姝㈣浆杞姐€傪煉屽皯璇达紝澶氬仛銆?/p>
