leaflet.ChineseTmsProviders.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. if (L.Proj) {
  2. L.CRS.Baidu = new L.Proj.CRS('EPSG:900913', '+proj=merc +a=6378206 +b=6356584.314245179 +lat_ts=0.0 +lon_0=0.0 +x_0=0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs', {
  3. resolutions: function () {
  4. var level = 19
  5. var res = [];
  6. res[0] = Math.pow(2, 18);
  7. for (var i = 1; i < level; i++) {
  8. res[i] = Math.pow(2, (18 - i))
  9. }
  10. return res;
  11. }(),
  12. origin: [0, 0],
  13. bounds: L.bounds([20037508.342789244, 0], [0, 20037508.342789244])
  14. });
  15. }
  16. L.TileLayer.ChinaProvider = L.TileLayer.extend({
  17. initialize: function(type, options) { // (type, Object)
  18. var providers = L.TileLayer.ChinaProvider.providers;
  19. options = options || {}
  20. var parts = type.split('.');
  21. var providerName = parts[0];
  22. var mapName = parts[1];
  23. var mapType = parts[2];
  24. var url = providers[providerName][mapName][mapType];
  25. options.subdomains = providers[providerName].Subdomains;
  26. options.key = options.key || providers[providerName].key;
  27. if ('tms' in providers[providerName]) {
  28. options.tms = providers[providerName]['tms']
  29. }
  30. L.TileLayer.prototype.initialize.call(this, url, options);
  31. },
  32. getTileUrl: function (coords) {
  33. var data = {
  34. s: this._getSubdomain(coords),
  35. x: coords.x,
  36. y: coords.y,
  37. z: this._getZoomForUrl(),
  38. };
  39. if (this._map && !this._map.options.crs.infinite) {
  40. var invertedY = this._globalTileRange.max.y - coords.y;
  41. if (this.options.tms) {
  42. data['y'] = invertedY;
  43. }
  44. data['-y'] = invertedY;
  45. }
  46. data.sx = data.x >> 4
  47. data.sy = (( 1 << data.z) - data.y) >> 4
  48. return L.Util.template(this._url, L.Util.extend(data, this.options));
  49. },
  50. });
  51. L.TileLayer.ChinaProvider.providers = {
  52. TianDiTu: {
  53. Normal: {
  54. Map: "//t{s}.tianditu.gov.cn/DataServer?T=vec_w&X={x}&Y={y}&L={z}&tk={key}",
  55. Annotion: "//t{s}.tianditu.gov.cn/DataServer?T=cva_w&X={x}&Y={y}&L={z}&tk={key}"
  56. },
  57. Satellite: {
  58. Map: "//t{s}.tianditu.gov.cn/DataServer?T=img_w&X={x}&Y={y}&L={z}&tk={key}",
  59. Annotion: "//t{s}.tianditu.gov.cn/DataServer?T=cia_w&X={x}&Y={y}&L={z}&tk={key}"
  60. },
  61. Terrain: {
  62. Map: "//t{s}.tianditu.gov.cn/DataServer?T=ter_w&X={x}&Y={y}&L={z}&tk={key}",
  63. Annotion: "//t{s}.tianditu.gov.cn/DataServer?T=cta_w&X={x}&Y={y}&L={z}&tk={key}"
  64. },
  65. Subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
  66. key: "174705aebfe31b79b3587279e211cb9a"
  67. },
  68. GaoDe: {
  69. Normal: {
  70. Map: '//webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}'
  71. },
  72. Satellite: {
  73. Map: '//webst0{s}.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}',
  74. Annotion: '//webst0{s}.is.autonavi.com/appmaptile?style=8&x={x}&y={y}&z={z}'
  75. },
  76. Subdomains: ["1", "2", "3", "4"]
  77. },
  78. Google: {
  79. Normal: {
  80. Map: "//www.google.cn/maps/vt?lyrs=m@189&gl=cn&x={x}&y={y}&z={z}"
  81. },
  82. Satellite: {
  83. Map: "//www.google.cn/maps/vt?lyrs=s@189&gl=cn&x={x}&y={y}&z={z}",
  84. Annotion: "//www.google.cn/maps/vt?lyrs=y@189&gl=cn&x={x}&y={y}&z={z}"
  85. },
  86. Subdomains: []
  87. },
  88. Geoq: {
  89. Normal: {
  90. Map: "//map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer/tile/{z}/{y}/{x}",
  91. PurplishBlue: "//map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}",
  92. Gray: "//map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetGray/MapServer/tile/{z}/{y}/{x}",
  93. Warm: "//map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetWarm/MapServer/tile/{z}/{y}/{x}",
  94. },
  95. Theme: {
  96. Hydro: "//thematic.geoq.cn/arcgis/rest/services/ThematicMaps/WorldHydroMap/MapServer/tile/{z}/{y}/{x}"
  97. },
  98. Subdomains: []
  99. },
  100. OSM: {
  101. Normal: {
  102. Map: "//{s}.tile.osm.org/{z}/{x}/{y}.png",
  103. },
  104. Subdomains: ['a', 'b', 'c']
  105. },
  106. Baidu: {
  107. Normal: {
  108. Map: '//online{s}.map.bdimg.com/onlinelabel/?qt=tile&x={x}&y={y}&z={z}&styles=pl&scaler=1&p=1'
  109. },
  110. Satellite: {
  111. Map: '//shangetu{s}.map.bdimg.com/it/u=x={x};y={y};z={z};v=009;type=sate&fm=46',
  112. Annotion: '//online{s}.map.bdimg.com/tile/?qt=tile&x={x}&y={y}&z={z}&styles=sl&v=020'
  113. },
  114. Subdomains: '0123456789',
  115. tms: true
  116. },
  117. Tencent: {
  118. Normal: {
  119. Map: "//rt{s}.map.gtimg.com/tile?z={z}&x={x}&y={-y}&type=vector&styleid=3",
  120. },
  121. Satellite: {
  122. Map: "//p{s}.map.gtimg.com/sateTiles/{z}/{sx}/{sy}/{x}_{-y}.jpg",
  123. },
  124. Terrain: {
  125. Map: "//p{s}.map.gtimg.com/demTiles/{z}/{sx}/{sy}/{x}_{-y}.jpg"
  126. },
  127. Subdomains: '0123',
  128. }
  129. };
  130. L.tileLayer.chinaProvider = function(type, options) {
  131. return new L.TileLayer.ChinaProvider(type, options);
  132. };
  133. //坐标转换
  134. L.CoordConver = function () {
  135. /**百度转84*/
  136. this.bd09_To_gps84 = function(lng, lat) {
  137. var gcj02 = this.bd09_To_gcj02(lng, lat);
  138. var map84 = this.gcj02_To_gps84(gcj02.lng, gcj02.lat);
  139. return map84;
  140. }
  141. /**84转百度*/
  142. this.gps84_To_bd09 = function (lng, lat) {
  143. var gcj02 = this.gps84_To_gcj02(lng, lat);
  144. var bd09 = this.gcj02_To_bd09(gcj02.lng, gcj02.lat);
  145. return bd09;
  146. }
  147. /**84转火星*/
  148. this.gps84_To_gcj02 = function (lng, lat) {
  149. var dLat = transformLat(lng - 105.0, lat - 35.0);
  150. var dLng = transformLng(lng - 105.0, lat - 35.0);
  151. var radLat = lat / 180.0 * pi;
  152. var magic = Math.sin(radLat);
  153. magic = 1 - ee * magic * magic;
  154. var sqrtMagic = Math.sqrt(magic);
  155. dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
  156. dLng = (dLng * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
  157. var mgLat = lat + dLat;
  158. var mgLng = lng + dLng;
  159. var newCoord = {
  160. lng: mgLng,
  161. lat: mgLat
  162. };
  163. return newCoord;
  164. }
  165. /**火星转84*/
  166. this.gcj02_To_gps84 = function (lng, lat) {
  167. var coord = transform(lng, lat);
  168. var lontitude = lng * 2 - coord.lng;
  169. var latitude = lat * 2 - coord.lat;
  170. var newCoord = {
  171. lng: lontitude,
  172. lat: latitude
  173. };
  174. return newCoord;
  175. }
  176. /**火星转百度*/
  177. this.gcj02_To_bd09 = function (x, y) {
  178. var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
  179. var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
  180. var bd_lng = z * Math.cos(theta) + 0.0065;
  181. var bd_lat = z * Math.sin(theta) + 0.006;
  182. var newCoord = {
  183. lng: bd_lng,
  184. lat: bd_lat
  185. };
  186. return newCoord;
  187. }
  188. /**百度转火星*/
  189. this.bd09_To_gcj02 = function (bd_lng, bd_lat) {
  190. var x = bd_lng - 0.0065;
  191. var y = bd_lat - 0.006;
  192. var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
  193. var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
  194. var gg_lng = z * Math.cos(theta);
  195. var gg_lat = z * Math.sin(theta);
  196. var newCoord = {
  197. lng: gg_lng,
  198. lat: gg_lat
  199. };
  200. return newCoord;
  201. }
  202. var pi = 3.1415926535897932384626;
  203. var a = 6378245.0;
  204. var ee = 0.00669342162296594323;
  205. var x_pi = pi * 3000.0 / 180.0;
  206. var R = 6378137;
  207. function transform(lng, lat) {
  208. var dLat = transformLat(lng - 105.0, lat - 35.0);
  209. var dLng = transformLng(lng - 105.0, lat - 35.0);
  210. var radLat = lat / 180.0 * pi;
  211. var magic = Math.sin(radLat);
  212. magic = 1 - ee * magic * magic;
  213. var sqrtMagic = Math.sqrt(magic);
  214. dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
  215. dLng = (dLng * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
  216. var mgLat = lat + dLat;
  217. var mgLng = lng + dLng;
  218. var newCoord = {
  219. lng: mgLng,
  220. lat: mgLat
  221. };
  222. return newCoord;
  223. }
  224. function transformLat(x, y) {
  225. var ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
  226. ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
  227. ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
  228. ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
  229. return ret;
  230. }
  231. function transformLng(x, y) {
  232. var ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
  233. ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
  234. ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
  235. ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0;
  236. return ret;
  237. }
  238. }
  239. L.coordConver = function () {
  240. return new L.CoordConver()
  241. }
  242. L.tileLayer.chinaProvider = function (type, options) {
  243. options = options || {}
  244. options.corrdType = getCorrdType(type);
  245. return new L.TileLayer.ChinaProvider(type, options);
  246. //获取坐标类型
  247. function getCorrdType(type) {
  248. var parts = type.split('.');
  249. var providerName = parts[0];
  250. var zbName = "wgs84"
  251. switch (providerName) {
  252. case "Tengxun":
  253. case "GaoDe":
  254. case "Pengjiang":
  255. case "GoogleCn": //google中国地图
  256. case "ArcgisCn":
  257. case "BingCn":
  258. case "Test":
  259. zbName = "gcj02";
  260. break;
  261. case "Baidu":
  262. zbName = "bd09";
  263. break;
  264. case "Carto":
  265. case "Thunderforest":
  266. case "OSM":
  267. case "TianDiTu":
  268. case "Jl1":
  269. case "Openrailway":
  270. case "Bing":
  271. case "Jiangmen":
  272. case "Google":
  273. case "mapbox":
  274. zbName = "wgs84";
  275. break;
  276. }
  277. return zbName;
  278. }
  279. };
  280. L.GridLayer.include({
  281. _setZoomTransform: function (level, _center, zoom) {
  282. var center = _center;
  283. if (center != undefined && this.options) {
  284. if (this.options.corrdType == 'gcj02') {
  285. center = L.coordConver().gps84_To_gcj02(_center.lng, _center.lat);
  286. } else if (this.options.corrdType == 'bd09') {
  287. center = L.coordConver().gps84_To_bd09(_center.lng, _center.lat);
  288. }
  289. }
  290. var scale = this._map.getZoomScale(zoom, level.zoom),
  291. translate = level.origin.multiplyBy(scale)
  292. .subtract(this._map._getNewPixelOrigin(center, zoom)).round();
  293. if (L.Browser.any3d) {
  294. L.DomUtil.setTransform(level.el, translate, scale);
  295. } else {
  296. L.DomUtil.setPosition(level.el, translate);
  297. }
  298. },
  299. _getTiledPixelBounds: function (_center) {
  300. var center = _center;
  301. if (center != undefined && this.options) {
  302. if (this.options.corrdType == 'gcj02') {
  303. center = L.coordConver().gps84_To_gcj02(_center.lng, _center.lat);
  304. } else if (this.options.corrdType == 'bd09') {
  305. center = L.coordConver().gps84_To_bd09(_center.lng, _center.lat);
  306. }
  307. }
  308. var map = this._map,
  309. mapZoom = map._animatingZoom ? Math.max(map._animateToZoom, map.getZoom()) : map.getZoom(),
  310. scale = map.getZoomScale(mapZoom, this._tileZoom),
  311. pixelCenter = map.project(center, this._tileZoom).floor(),
  312. halfSize = map.getSize().divideBy(scale * 2);
  313. return new L.Bounds(pixelCenter.subtract(halfSize), pixelCenter.add(halfSize));
  314. }
  315. })