a10a9ab94dcea02cc818912a5a4d4e53f7b1cac6.svn-base 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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 } 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 currErgodicIndex = ergodicIndex
  68. self.postMessage({
  69. incident: 'obsAddGeo'
  70. })
  71. for (let i = 0; i < data.tiles.length; i++) {
  72. if (currErgodicIndex !== ergodicIndex) return;
  73. let tile = data.tiles[i]
  74. let { x, y, z } = tile
  75. management.getFeatures(x, y, z)
  76. .then(features => {
  77. if (currErgodicIndex !== ergodicIndex) return;
  78. let { geoJsonArray, transArray } = featuresGrentAttribute(data.map, features)
  79. self.postMessage({
  80. incident: 'addGeo',
  81. geoJsonArray
  82. }, transArray)
  83. })
  84. }
  85. }
  86. })(),
  87. clearFids: data => {
  88. management.clearGeos(data.fids)
  89. }
  90. }
  91. self.addEventListener('message', event => {
  92. let data = event.data
  93. if (typeof event.data === 'string') {
  94. data = JSON.parse(event.data)
  95. }
  96. _interface[data.thing] && _interface[data.thing](data)
  97. })