2d22d656d2a8e031c0e6993c410734c5b27ca991.svn-base 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import * as maptalks from 'maptalks'
  2. import { ThreeLayer } from 'maptalks.three'
  3. import { unMeshAll, meshStatus } from './meshStaus'
  4. import initAmbient from './initAmbient'
  5. import { addGeo } from '../core/dyWoker'
  6. import { referText } from './addText'
  7. import { singleDelay } from '../core/util'
  8. import config from './config'
  9. // 高层数据获取
  10. const canvasTile = new maptalks.CanvasTileLayer('tile', {
  11. urlTemplate: 'https://{s}.data.osmbuildings.org/0.2/anonymous/tile/{z}/{x}/{y}.json',
  12. subdomains: ['a', 'b', 'c', 'd'],
  13. forceRenderOnMoving: true,
  14. forceRenderOnZooming: true,
  15. forceRenderOnRotating: true,
  16. repeatWorld: false,
  17. maxAvailableZoom: 15
  18. })
  19. // 3DThree与map结合
  20. const threeLayer = new ThreeLayer('t', {
  21. forceRenderOnMoving: true,
  22. forceRenderOnZooming: true,
  23. forceRenderOnRotating: true
  24. })
  25. threeLayer.prepareToDraw = initAmbient
  26. global.threeLayer = threeLayer
  27. // Maker承载容器
  28. let vector = new maptalks.VectorLayer('vector', {
  29. enableAltitude: true, // enable altitude
  30. altitudeProperty: 'altitude', // altitude property in properties, default by 'altitude',
  31. forceRenderOnMoving: true,
  32. forceRenderOnZooming: true,
  33. forceRenderOnRotating: true
  34. })
  35. // 获取高层数据
  36. function getCurrTiles() {
  37. let tileGrids = canvasTile.getTiles().tileGrids
  38. for (var i = 0; i < tileGrids.length; i++) {
  39. if (tileGrids[i].zoom >= 15) break
  40. }
  41. let zoom = tileGrids[i].zoom
  42. let tiles = tileGrids[i].tiles
  43. let maxX = tiles[0].x
  44. let minX = tiles[0].x
  45. let maxY = tiles[0].y
  46. let minY = tiles[0].y
  47. tiles.forEach(tile => {
  48. tile.x > maxX && (maxX = tile.x)
  49. tile.y > maxY && (maxY = tile.y)
  50. tile.x < minX && (minX = tile.x)
  51. tile.y < minY && (minY = tile.y)
  52. })
  53. for (let i = 1; i <= config.manyOffset; i++) {
  54. let largeX = maxX + i
  55. let smallX = minX - i
  56. for (let i = 1; i <= config.manyOffset; i++) {
  57. let largeY = maxY + i
  58. let smallY = minY - i
  59. tiles.push({ x: largeX, y: largeY, z: zoom })
  60. tiles.push({ x: largeX, y: smallY, z: zoom })
  61. tiles.push({ x: smallX, y: smallY, z: zoom })
  62. tiles.push({ x: smallX, y: largeY, z: zoom })
  63. }
  64. }
  65. return tiles
  66. }
  67. let gAddGeo = singleDelay(() => addGeo(getCurrTiles()), 100)
  68. let isUninstall = false
  69. // 动态添加删除建筑
  70. let dyAddGeo = singleDelay(() => {
  71. if (!isUninstall) {
  72. meshStatus()
  73. addGeo(getCurrTiles())
  74. }
  75. }, 500);
  76. map.addLayer([canvasTile, threeLayer, vector])
  77. bus.on('install3D', () => {
  78. isUninstall = false
  79. gAddGeo()
  80. map.on('moveend zoomend dragrotateend', referText)
  81. map.on('moving zoomend dragrotating', dyAddGeo)
  82. })
  83. bus.on('uninstall3D', () => {
  84. isUninstall = true
  85. map.off('moveend zoomend dragrotateend', referText)
  86. map.off('moving zoomend dragrotating', dyAddGeo)
  87. unMeshAll()
  88. })
  89. export {
  90. vector,
  91. threeLayer
  92. }