4f62549d62997f19e1d259e71b3ed9d405d080ae.svn-base 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import 'babel-core/register'
  2. import 'babel-polyfill'
  3. import featuresToPolygon from './featuresToPolygon'
  4. import config from '../business/config'
  5. import * as management from './dataManagement'
  6. import grentText from './grentText'
  7. import { mergeBigData, getMaxHeight, grentAnimationArray, extractType, fromGeometry } from './util'
  8. import { toExtrudeGeometry, reductive, LatLngToPoint } from './PolygonToGeom'
  9. function featureToAttribute(map, features, stepTotal) {
  10. let polygons = featuresToPolygon(features)
  11. let verticesArray = []
  12. let normalsArray = []
  13. polygons.forEach((polygon, index) => {
  14. let height = features[index].properties.height
  15. || features[index].properties.levels * config.levelHeight
  16. || config.defaultHeight
  17. let geo = toExtrudeGeometry(polygon, map, height)
  18. if (!geo) return;
  19. features[index].height = height
  20. let { vertices, normals } = fromGeometry(geo)
  21. verticesArray.push(vertices)
  22. normalsArray.push(normals)
  23. })
  24. verticesArray = mergeBigData(verticesArray)
  25. normalsArray = mergeBigData(normalsArray)
  26. let maxHeight = getMaxHeight(verticesArray)
  27. let animateBuffArrays = grentAnimationArray(verticesArray, stepTotal, maxHeight)
  28. return {
  29. verticesBuffArrays: verticesArray,
  30. normalsBuffArrays: normalsArray,
  31. maxHeight,
  32. animateBuffArrays
  33. }
  34. }
  35. function featuresGrentAttribute(map, features) {
  36. let { typeFeatures, types } = extractType(features)
  37. let geoJsonArray = []
  38. reductive(map)
  39. typeFeatures.forEach((features, index) => {
  40. if (features.length) {
  41. geoJsonArray.push({
  42. ...featureToAttribute(map, features, config.stepTotal),
  43. texts: grentText(features),
  44. fids: features.map(f => f.id),
  45. type: index === 0 ? 'unknown' : types[index - 1]
  46. })
  47. }
  48. })
  49. let transArray = []
  50. geoJsonArray.forEach(geo => {
  51. transArray.push(
  52. geo.verticesBuffArrays.buffer,
  53. geo.normalsBuffArrays.buffer,
  54. geo.animateBuffArrays.buffer
  55. )
  56. })
  57. return {
  58. geoJsonArray,
  59. transArray
  60. }
  61. }
  62. let _interface = {
  63. getGeo: (function () {
  64. let ergodicIndex = 0
  65. return data => {
  66. ergodicIndex++
  67. let runing = 0
  68. let currErgodicIndex = ergodicIndex
  69. self.postMessage({
  70. incident: 'obsAddGeo'
  71. })
  72. for (let i = 0; i < data.tiles.length; i++) {
  73. if (currErgodicIndex !== ergodicIndex) return;
  74. let tile = data.tiles[i]
  75. let { x, y, z } = tile
  76. management.getFeatures(x, y, z)
  77. .then(features => {
  78. if (currErgodicIndex !== ergodicIndex) return;
  79. let { geoJsonArray, transArray } = featuresGrentAttribute(data.map, features)
  80. self.postMessage({
  81. incident: 'addGeo',
  82. geoJsonArray
  83. }, transArray)
  84. if (++runing === data.tiles.length) {
  85. self.postMessage({
  86. incident: 'addSuccess'
  87. })
  88. }
  89. })
  90. }
  91. console.log('----?', LatLngToPoint({ lat: 113.583891, lng: 22.255409}, data.map))
  92. }
  93. })(),
  94. clearFids: data => {
  95. management.clearGeos(data.fids)
  96. }
  97. }
  98. self.addEventListener('message', event => {
  99. let data = event.data
  100. if (typeof event.data === 'string') {
  101. data = JSON.parse(event.data)
  102. }
  103. _interface[data.thing] && _interface[data.thing](data)
  104. })