@kalisio/kdk 1.5.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/.nyc_output/02a7a308-a8d7-4cc6-8e61-6066a0055a96.json +1 -0
  2. package/.nyc_output/1900d596-5e87-433a-8fd6-fb7f7ded35ec.json +1 -0
  3. package/.nyc_output/{058fc679-d60a-4501-ac04-71171e5200b8.json → 27401f21-8ccf-42fa-8230-4232189d86b3.json} +0 -0
  4. package/.nyc_output/{8b1830fa-932e-4a61-9837-4a5b18f83ea9.json → 52278ef5-c337-4724-97be-e2e4416847c5.json} +0 -0
  5. package/.nyc_output/{afd2d144-3570-4858-b94a-b523dbd023dd.json → 5dd49b8a-4c84-42f9-a3d5-712247a84775.json} +0 -0
  6. package/.nyc_output/612b4859-9645-45c1-a41e-1fae420518c4.json +1 -0
  7. package/.nyc_output/bab87fe9-d99a-4759-99e6-3fc4622eeca0.json +1 -0
  8. package/.nyc_output/processinfo/02a7a308-a8d7-4cc6-8e61-6066a0055a96.json +1 -0
  9. package/.nyc_output/processinfo/1900d596-5e87-433a-8fd6-fb7f7ded35ec.json +1 -0
  10. package/.nyc_output/processinfo/27401f21-8ccf-42fa-8230-4232189d86b3.json +1 -0
  11. package/.nyc_output/processinfo/52278ef5-c337-4724-97be-e2e4416847c5.json +1 -0
  12. package/.nyc_output/processinfo/5dd49b8a-4c84-42f9-a3d5-712247a84775.json +1 -0
  13. package/.nyc_output/processinfo/612b4859-9645-45c1-a41e-1fae420518c4.json +1 -0
  14. package/.nyc_output/processinfo/bab87fe9-d99a-4759-99e6-3fc4622eeca0.json +1 -0
  15. package/.nyc_output/processinfo/index.json +1 -1
  16. package/.travis.test.sh +1 -1
  17. package/CHANGELOG.md +107 -11
  18. package/coverage/core/api/application.js.html +323 -245
  19. package/coverage/core/api/authentication.js.html +1 -1
  20. package/coverage/core/api/db.js.html +108 -108
  21. package/coverage/core/api/hooks/hooks.account.js.html +1 -1
  22. package/coverage/core/api/hooks/hooks.authentication.js.html +1 -1
  23. package/coverage/core/api/hooks/hooks.authorisations.js.html +21 -6
  24. package/coverage/core/api/hooks/hooks.devices.js.html +1 -1
  25. package/coverage/core/api/hooks/hooks.groups.js.html +1 -1
  26. package/coverage/core/api/hooks/hooks.logger.js.html +1 -1
  27. package/coverage/core/api/hooks/hooks.model.js.html +1 -1
  28. package/coverage/core/api/hooks/hooks.organisations.js.html +1 -1
  29. package/coverage/core/api/hooks/hooks.pusher.js.html +1 -1
  30. package/coverage/core/api/hooks/hooks.query.js.html +114 -48
  31. package/coverage/core/api/hooks/hooks.service.js.html +1 -1
  32. package/coverage/core/api/hooks/hooks.storage.js.html +1 -1
  33. package/coverage/core/api/hooks/hooks.tags.js.html +1 -1
  34. package/coverage/core/api/hooks/hooks.users.js.html +1 -1
  35. package/coverage/core/api/hooks/index.html +12 -12
  36. package/coverage/core/api/hooks/index.js.html +1 -1
  37. package/coverage/core/api/index.html +34 -34
  38. package/coverage/core/api/index.js.html +26 -26
  39. package/coverage/core/api/marshall.js.html +1 -1
  40. package/coverage/core/api/models/groups.model.mongodb.js.html +1 -1
  41. package/coverage/core/api/models/index.html +1 -1
  42. package/coverage/core/api/models/organisations.model.mongodb.js.html +1 -1
  43. package/coverage/core/api/models/tags.model.mongodb.js.html +1 -1
  44. package/coverage/core/api/models/users.model.mongodb.js.html +1 -1
  45. package/coverage/core/api/oauth2-handler.js.html +1 -1
  46. package/coverage/core/api/oauth2-verifier.js.html +1 -1
  47. package/coverage/core/api/services/account/account.hooks.js.html +1 -1
  48. package/coverage/core/api/services/account/account.service.js.html +1 -1
  49. package/coverage/core/api/services/account/index.html +1 -1
  50. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  51. package/coverage/core/api/services/authorisations/authorisations.service.js.html +31 -7
  52. package/coverage/core/api/services/authorisations/index.html +9 -9
  53. package/coverage/core/api/services/databases/databases.hooks.js.html +1 -1
  54. package/coverage/core/api/services/databases/databases.service.js.html +1 -1
  55. package/coverage/core/api/services/databases/index.html +1 -1
  56. package/coverage/core/api/services/devices/devices.hooks.js.html +1 -1
  57. package/coverage/core/api/services/devices/devices.service.js.html +1 -1
  58. package/coverage/core/api/services/devices/index.html +1 -1
  59. package/coverage/core/api/services/groups/groups.hooks.js.html +1 -1
  60. package/coverage/core/api/services/groups/index.html +1 -1
  61. package/coverage/core/api/services/index.html +11 -11
  62. package/coverage/core/api/services/index.js.html +66 -66
  63. package/coverage/core/api/services/mailer/index.html +1 -1
  64. package/coverage/core/api/services/mailer/mailer.hooks.js.html +1 -1
  65. package/coverage/core/api/services/mailer/mailer.service.js.html +1 -1
  66. package/coverage/core/api/services/organisations/index.html +1 -1
  67. package/coverage/core/api/services/organisations/organisations.hooks.js.html +1 -1
  68. package/coverage/core/api/services/organisations/organisations.service.js.html +1 -1
  69. package/coverage/core/api/services/pusher/index.html +1 -1
  70. package/coverage/core/api/services/pusher/pusher.channels.js.html +1 -1
  71. package/coverage/core/api/services/pusher/pusher.hooks.js.html +1 -1
  72. package/coverage/core/api/services/pusher/pusher.service.js.html +1 -1
  73. package/coverage/core/api/services/storage/index.html +1 -1
  74. package/coverage/core/api/services/storage/storage.hooks.js.html +1 -1
  75. package/coverage/core/api/services/tags/index.html +1 -1
  76. package/coverage/core/api/services/tags/tags.hooks.js.html +1 -1
  77. package/coverage/core/api/services/users/index.html +1 -1
  78. package/coverage/core/api/services/users/users.hooks.js.html +1 -1
  79. package/coverage/core/common/errors.js.html +1 -1
  80. package/coverage/core/common/index.html +7 -7
  81. package/coverage/core/common/index.js.html +1 -1
  82. package/coverage/core/common/permissions.js.html +81 -51
  83. package/coverage/index.html +39 -39
  84. package/coverage/lcov-report/core/api/application.js.html +323 -245
  85. package/coverage/lcov-report/core/api/authentication.js.html +1 -1
  86. package/coverage/lcov-report/core/api/db.js.html +108 -108
  87. package/coverage/lcov-report/core/api/hooks/hooks.account.js.html +1 -1
  88. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +1 -1
  89. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +21 -6
  90. package/coverage/lcov-report/core/api/hooks/hooks.devices.js.html +1 -1
  91. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +1 -1
  92. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +1 -1
  93. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +1 -1
  94. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +1 -1
  95. package/coverage/lcov-report/core/api/hooks/hooks.pusher.js.html +1 -1
  96. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +114 -48
  97. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +1 -1
  98. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +1 -1
  99. package/coverage/lcov-report/core/api/hooks/hooks.tags.js.html +1 -1
  100. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +1 -1
  101. package/coverage/lcov-report/core/api/hooks/index.html +12 -12
  102. package/coverage/lcov-report/core/api/hooks/index.js.html +1 -1
  103. package/coverage/lcov-report/core/api/index.html +34 -34
  104. package/coverage/lcov-report/core/api/index.js.html +26 -26
  105. package/coverage/lcov-report/core/api/marshall.js.html +1 -1
  106. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +1 -1
  107. package/coverage/lcov-report/core/api/models/index.html +1 -1
  108. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +1 -1
  109. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +1 -1
  110. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +1 -1
  111. package/coverage/lcov-report/core/api/oauth2-handler.js.html +1 -1
  112. package/coverage/lcov-report/core/api/oauth2-verifier.js.html +1 -1
  113. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +1 -1
  114. package/coverage/lcov-report/core/api/services/account/account.service.js.html +1 -1
  115. package/coverage/lcov-report/core/api/services/account/index.html +1 -1
  116. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  117. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +31 -7
  118. package/coverage/lcov-report/core/api/services/authorisations/index.html +9 -9
  119. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +1 -1
  120. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +1 -1
  121. package/coverage/lcov-report/core/api/services/databases/index.html +1 -1
  122. package/coverage/lcov-report/core/api/services/devices/devices.hooks.js.html +1 -1
  123. package/coverage/lcov-report/core/api/services/devices/devices.service.js.html +1 -1
  124. package/coverage/lcov-report/core/api/services/devices/index.html +1 -1
  125. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +1 -1
  126. package/coverage/lcov-report/core/api/services/groups/index.html +1 -1
  127. package/coverage/lcov-report/core/api/services/index.html +11 -11
  128. package/coverage/lcov-report/core/api/services/index.js.html +66 -66
  129. package/coverage/lcov-report/core/api/services/mailer/index.html +1 -1
  130. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +1 -1
  131. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +1 -1
  132. package/coverage/lcov-report/core/api/services/organisations/index.html +1 -1
  133. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +1 -1
  134. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +1 -1
  135. package/coverage/lcov-report/core/api/services/pusher/index.html +1 -1
  136. package/coverage/lcov-report/core/api/services/pusher/pusher.channels.js.html +1 -1
  137. package/coverage/lcov-report/core/api/services/pusher/pusher.hooks.js.html +1 -1
  138. package/coverage/lcov-report/core/api/services/pusher/pusher.service.js.html +1 -1
  139. package/coverage/lcov-report/core/api/services/storage/index.html +1 -1
  140. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +1 -1
  141. package/coverage/lcov-report/core/api/services/tags/index.html +1 -1
  142. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +1 -1
  143. package/coverage/lcov-report/core/api/services/users/index.html +1 -1
  144. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +1 -1
  145. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  146. package/coverage/lcov-report/core/common/index.html +7 -7
  147. package/coverage/lcov-report/core/common/index.js.html +1 -1
  148. package/coverage/lcov-report/core/common/permissions.js.html +81 -51
  149. package/coverage/lcov-report/index.html +39 -39
  150. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +1 -1
  151. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +1 -1
  152. package/coverage/lcov-report/map/api/hooks/index.html +1 -1
  153. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  154. package/coverage/lcov-report/map/api/index.html +1 -1
  155. package/coverage/lcov-report/map/api/index.js.html +1 -1
  156. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  157. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  158. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +1 -1
  159. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +14 -5
  160. package/coverage/lcov-report/map/api/models/index.html +7 -7
  161. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  162. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  163. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  164. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +1 -1
  165. package/coverage/lcov-report/map/api/services/catalog/index.html +1 -1
  166. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  167. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  168. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +1 -1
  169. package/coverage/lcov-report/map/api/services/features/index.html +1 -1
  170. package/coverage/lcov-report/map/api/services/geocoder/geocoder.hooks.js.html +1 -1
  171. package/coverage/lcov-report/map/api/services/geocoder/geocoder.service.js.html +1 -1
  172. package/coverage/lcov-report/map/api/services/geocoder/index.html +1 -1
  173. package/coverage/lcov-report/map/api/services/index.html +1 -1
  174. package/coverage/lcov-report/map/api/services/index.js.html +1 -1
  175. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  176. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  177. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +1 -1
  178. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  179. package/coverage/lcov-report/map/common/index.html +1 -1
  180. package/coverage/lcov-report/map/common/index.js.html +1 -1
  181. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  182. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  183. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  184. package/coverage/lcov-report/map/common/opendap-utils.js.html +1 -1
  185. package/coverage/lcov-report/map/common/permissions.js.html +1 -1
  186. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  187. package/coverage/lcov-report/map/common/tms-utils.js.html +1 -1
  188. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +1 -1
  189. package/coverage/lcov-report/map/common/wcs-utils.js.html +1 -1
  190. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1 -1
  191. package/coverage/lcov-report/map/common/wfs-utils.js.html +1 -1
  192. package/coverage/lcov-report/map/common/wms-utils.js.html +1 -1
  193. package/coverage/lcov-report/map/common/wmts-utils.js.html +1 -1
  194. package/coverage/lcov.info +948 -769
  195. package/coverage/map/api/hooks/hooks.catalog.js.html +1 -1
  196. package/coverage/map/api/hooks/hooks.query.js.html +1 -1
  197. package/coverage/map/api/hooks/index.html +1 -1
  198. package/coverage/map/api/hooks/index.js.html +1 -1
  199. package/coverage/map/api/index.html +1 -1
  200. package/coverage/map/api/index.js.html +1 -1
  201. package/coverage/map/api/marshall.js.html +1 -1
  202. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  203. package/coverage/map/api/models/catalog.model.mongodb.js.html +1 -1
  204. package/coverage/map/api/models/features.model.mongodb.js.html +14 -5
  205. package/coverage/map/api/models/index.html +7 -7
  206. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  207. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  208. package/coverage/map/api/services/alerts/index.html +1 -1
  209. package/coverage/map/api/services/catalog/catalog.hooks.js.html +1 -1
  210. package/coverage/map/api/services/catalog/index.html +1 -1
  211. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  212. package/coverage/map/api/services/daptiles/index.html +1 -1
  213. package/coverage/map/api/services/features/features.hooks.js.html +1 -1
  214. package/coverage/map/api/services/features/index.html +1 -1
  215. package/coverage/map/api/services/geocoder/geocoder.hooks.js.html +1 -1
  216. package/coverage/map/api/services/geocoder/geocoder.service.js.html +1 -1
  217. package/coverage/map/api/services/geocoder/index.html +1 -1
  218. package/coverage/map/api/services/index.html +1 -1
  219. package/coverage/map/api/services/index.js.html +1 -1
  220. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  221. package/coverage/map/common/errors.js.html +1 -1
  222. package/coverage/map/common/geotiff-grid-source.js.html +1 -1
  223. package/coverage/map/common/grid.js.html +1 -1
  224. package/coverage/map/common/index.html +1 -1
  225. package/coverage/map/common/index.js.html +1 -1
  226. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  227. package/coverage/map/common/moment-utils.js.html +1 -1
  228. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  229. package/coverage/map/common/opendap-utils.js.html +1 -1
  230. package/coverage/map/common/permissions.js.html +1 -1
  231. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  232. package/coverage/map/common/tms-utils.js.html +1 -1
  233. package/coverage/map/common/wcs-grid-source.js.html +1 -1
  234. package/coverage/map/common/wcs-utils.js.html +1 -1
  235. package/coverage/map/common/weacast-grid-source.js.html +1 -1
  236. package/coverage/map/common/wfs-utils.js.html +1 -1
  237. package/coverage/map/common/wms-utils.js.html +1 -1
  238. package/coverage/map/common/wmts-utils.js.html +1 -1
  239. package/extras/tours/map/catalog-panel.js +61 -10
  240. package/extras/tours/map/create-view.js +25 -0
  241. package/extras/tours/map/fab.js +10 -1
  242. package/extras/tours/map/navigation-bar.js +56 -10
  243. package/lib/core/api/application.js +44 -10
  244. package/lib/core/api/application.js.map +1 -1
  245. package/lib/core/api/hooks/hooks.authorisations.js +8 -1
  246. package/lib/core/api/hooks/hooks.authorisations.js.map +1 -1
  247. package/lib/core/api/hooks/hooks.query.js +135 -100
  248. package/lib/core/api/hooks/hooks.query.js.map +1 -1
  249. package/lib/core/api/services/authorisations/authorisations.service.js +13 -1
  250. package/lib/core/api/services/authorisations/authorisations.service.js.map +1 -1
  251. package/lib/core/api/services/pusher/pusher.service.js +40 -16
  252. package/lib/core/api/services/pusher/pusher.service.js.map +1 -1
  253. package/lib/core/client/components/chart/KChart.vue +115 -0
  254. package/lib/core/client/components/chart/KStatsChart.vue +76 -0
  255. package/lib/core/client/components/chart/index.js +20 -0
  256. package/lib/core/client/components/chart/index.js.map +1 -0
  257. package/lib/core/client/components/collection/KColumn.vue +29 -28
  258. package/lib/core/client/components/collection/KFilter.vue +103 -72
  259. package/lib/core/client/components/collection/KHistoryEntry.vue +1 -1
  260. package/lib/core/client/components/collection/KItem.vue +4 -4
  261. package/lib/core/client/components/editor/KModalEditor.vue +3 -4
  262. package/lib/core/client/components/editor/KSettingsEditor.vue +6 -2
  263. package/lib/core/client/components/form/KChipsField.vue +4 -4
  264. package/lib/core/client/components/form/KFileField.vue +13 -6
  265. package/lib/core/client/components/form/KRoleField.vue +5 -2
  266. package/lib/core/client/components/form/KTextField.vue +12 -2
  267. package/lib/core/client/components/form/KUnitField.vue +57 -0
  268. package/lib/core/client/components/form/KUrlField.vue +1 -1
  269. package/lib/core/client/components/form/KView.vue +1 -1
  270. package/lib/core/client/components/frame/KAction.vue +41 -7
  271. package/lib/core/client/components/frame/KBlock.vue +7 -7
  272. package/lib/core/client/components/frame/KContent.vue +1 -1
  273. package/lib/core/client/components/frame/KModal.vue +66 -20
  274. package/lib/core/client/components/frame/KOpener.vue +1 -1
  275. package/lib/core/client/components/frame/KPanel.vue +8 -7
  276. package/lib/core/client/components/frame/KPopupAction.vue +6 -0
  277. package/lib/core/client/components/frame/KScreen.vue +1 -1
  278. package/lib/core/client/components/frame/KScrollArea.vue +65 -0
  279. package/lib/core/client/components/frame/KStamp.vue +4 -2
  280. package/lib/core/client/components/frame/index.js +6 -6
  281. package/lib/core/client/components/frame/index.js.map +1 -1
  282. package/lib/core/client/components/input/KColorChooser.vue +3 -5
  283. package/lib/core/client/components/input/KIconChooser.vue +41 -40
  284. package/lib/core/client/components/input/KPalette.vue +1 -1
  285. package/lib/core/client/components/input/index.js +14 -4
  286. package/lib/core/client/components/input/index.js.map +1 -1
  287. package/lib/core/client/components/layout/KAbout.vue +47 -49
  288. package/lib/core/client/components/layout/KFab.vue +1 -1
  289. package/lib/core/client/components/layout/KLayout.vue +10 -2
  290. package/lib/core/client/components/layout/KPage.vue +19 -18
  291. package/lib/core/client/components/layout/KTour.vue +5 -3
  292. package/lib/core/client/components/layout/KWindow.vue +211 -59
  293. package/lib/core/client/components/media/KMediaBrowser.vue +6 -6
  294. package/lib/core/client/components/menu/KMenu.vue +13 -5
  295. package/lib/core/client/components/menu/KRadialFab.vue +22 -24
  296. package/lib/core/client/components/menu/KRadialFabItem.vue +17 -18
  297. package/lib/core/client/components/team/KAddMember.vue +1 -1
  298. package/lib/core/client/components/team/KChangeRole.vue +11 -14
  299. package/lib/core/client/components/team/KGroupCard.vue +12 -5
  300. package/lib/core/client/components/team/KJoinGroup.vue +22 -22
  301. package/lib/core/client/components/team/KMemberCard.vue +19 -4
  302. package/lib/core/client/components/time/KAbsoluteTimeRange.vue +190 -0
  303. package/lib/core/client/components/time/KRelativeTimeRanges.vue +192 -0
  304. package/lib/core/client/components/time/index.js +20 -0
  305. package/lib/core/client/components/time/index.js.map +1 -0
  306. package/lib/core/client/components/viewer/KModalViewer.vue +10 -9
  307. package/lib/core/client/i18n/core_en.json +99 -17
  308. package/lib/core/client/i18n/core_fr.json +94 -18
  309. package/lib/core/client/index.js +16 -3
  310. package/lib/core/client/index.js.map +1 -1
  311. package/lib/core/client/mixins/mixin.base-collection.js +11 -1
  312. package/lib/core/client/mixins/mixin.base-collection.js.map +1 -1
  313. package/lib/core/client/mixins/mixin.base-widget.js +26 -12
  314. package/lib/core/client/mixins/mixin.base-widget.js.map +1 -1
  315. package/lib/core/client/reader.js +46 -15
  316. package/lib/core/client/reader.js.map +1 -1
  317. package/lib/core/client/readers/reader.csv.js +33 -22
  318. package/lib/core/client/readers/reader.csv.js.map +1 -1
  319. package/lib/core/client/readers/reader.json.js +31 -20
  320. package/lib/core/client/readers/reader.json.js.map +1 -1
  321. package/lib/core/client/services/index.js +16 -4
  322. package/lib/core/client/services/index.js.map +1 -1
  323. package/lib/core/client/services/local-settings.service.js +10 -4
  324. package/lib/core/client/services/local-settings.service.js.map +1 -1
  325. package/lib/core/client/time.js +29 -18
  326. package/lib/core/client/time.js.map +1 -1
  327. package/lib/core/client/units.js +207 -0
  328. package/lib/core/client/units.js.map +1 -0
  329. package/lib/core/client/utils.js +11 -0
  330. package/lib/core/client/utils.js.map +1 -1
  331. package/lib/core/common/permissions.js +44 -34
  332. package/lib/core/common/permissions.js.map +1 -1
  333. package/lib/core/common/schemas/settings.update.json +86 -4
  334. package/lib/map/api/hooks/hooks.catalog.js +20 -0
  335. package/lib/map/api/hooks/hooks.catalog.js.map +1 -1
  336. package/lib/map/api/models/catalog.model.mongodb.js +6 -1
  337. package/lib/map/api/models/catalog.model.mongodb.js.map +1 -1
  338. package/lib/map/api/models/features.model.mongodb.js +8 -0
  339. package/lib/map/api/models/features.model.mongodb.js.map +1 -1
  340. package/lib/map/api/services/catalog/catalog.hooks.js +3 -1
  341. package/lib/map/api/services/catalog/catalog.hooks.js.map +1 -1
  342. package/lib/map/client/components/KCaptureToolbar.vue +2 -7
  343. package/lib/map/client/components/KColorLegend.vue +38 -25
  344. package/lib/map/client/components/KFeaturesChart.vue +84 -114
  345. package/lib/map/client/components/KFeaturesFilter.vue +37 -38
  346. package/lib/map/client/components/KFeaturesTable.vue +15 -16
  347. package/lib/map/client/components/KLayerStyleEditor.vue +1 -1
  348. package/lib/map/client/components/KLayerStyleForm.vue +123 -51
  349. package/lib/map/client/components/KLevelSlider.vue +30 -29
  350. package/lib/map/client/components/KLocationMap.vue +2 -2
  351. package/lib/map/client/components/KMeasureTool.vue +49 -28
  352. package/lib/map/client/components/KPositionIndicator.vue +4 -4
  353. package/lib/map/client/components/KTimeline.vue +30 -35
  354. package/lib/map/client/components/KTimezoneMap.vue +156 -0
  355. package/lib/map/client/components/KUrlLegend.vue +11 -10
  356. package/lib/map/client/components/catalog/KAddLayer.vue +3 -2
  357. package/lib/map/client/components/catalog/KBaseLayersSelector.vue +1 -1
  358. package/lib/map/client/components/catalog/KCatalogLayersPanel.vue +56 -0
  359. package/lib/map/client/components/catalog/KCreateView.vue +91 -0
  360. package/lib/map/client/components/catalog/KLayerCategories.vue +5 -3
  361. package/lib/map/client/components/catalog/{KCatalog.vue → KLayersPanel.vue} +23 -22
  362. package/lib/map/client/components/catalog/KLayersSelector.vue +3 -3
  363. package/lib/map/client/components/catalog/KUserLayersPanel.vue +40 -0
  364. package/lib/map/client/components/catalog/KViewSelector.vue +46 -0
  365. package/lib/map/client/components/catalog/KViewsPanel.vue +110 -0
  366. package/lib/map/client/components/catalog/KWeatherLayersSelector.vue +5 -14
  367. package/lib/map/client/components/form/KTimezoneField.vue +135 -0
  368. package/lib/map/client/components/widget/KElevationProfile.vue +488 -0
  369. package/lib/map/client/components/widget/KInformationBox.vue +53 -37
  370. package/lib/map/client/components/widget/KMapillaryViewer.vue +26 -16
  371. package/lib/map/client/components/widget/KTimeSeries.vue +283 -358
  372. package/lib/map/client/i18n/map_en.json +73 -56
  373. package/lib/map/client/i18n/map_fr.json +75 -58
  374. package/lib/map/client/init.js +4 -3
  375. package/lib/map/client/init.js.map +1 -1
  376. package/lib/map/client/leaflet/GradientPath.js +40 -19
  377. package/lib/map/client/leaflet/GradientPath.js.map +1 -1
  378. package/lib/map/client/leaflet/TiledFeatureLayer.js +527 -93
  379. package/lib/map/client/leaflet/TiledFeatureLayer.js.map +1 -1
  380. package/lib/map/client/leaflet/TiledMeshLayer.js +58 -35
  381. package/lib/map/client/leaflet/TiledMeshLayer.js.map +1 -1
  382. package/lib/map/client/leaflet/utils.js +44 -3
  383. package/lib/map/client/leaflet/utils.js.map +1 -1
  384. package/lib/map/client/mixins/globe/mixin.base-globe.js +16 -1
  385. package/lib/map/client/mixins/globe/mixin.base-globe.js.map +1 -1
  386. package/lib/map/client/mixins/globe/mixin.file-layers.js +12 -2
  387. package/lib/map/client/mixins/globe/mixin.file-layers.js.map +1 -1
  388. package/lib/map/client/mixins/globe/mixin.geojson-layers.js +23 -27
  389. package/lib/map/client/mixins/globe/mixin.geojson-layers.js.map +1 -1
  390. package/lib/map/client/mixins/globe/mixin.popup.js +7 -3
  391. package/lib/map/client/mixins/globe/mixin.popup.js.map +1 -1
  392. package/lib/map/client/mixins/globe/mixin.style.js +8 -4
  393. package/lib/map/client/mixins/globe/mixin.style.js.map +1 -1
  394. package/lib/map/client/mixins/globe/mixin.tooltip.js +7 -3
  395. package/lib/map/client/mixins/globe/mixin.tooltip.js.map +1 -1
  396. package/lib/map/client/mixins/index.js +23 -18
  397. package/lib/map/client/mixins/index.js.map +1 -1
  398. package/lib/map/client/mixins/map/mixin.base-map.js +32 -8
  399. package/lib/map/client/mixins/map/mixin.base-map.js.map +1 -1
  400. package/lib/map/client/mixins/map/mixin.edit-layers.js +8 -4
  401. package/lib/map/client/mixins/map/mixin.edit-layers.js.map +1 -1
  402. package/lib/map/client/mixins/map/mixin.file-layers.js +13 -5
  403. package/lib/map/client/mixins/map/mixin.file-layers.js.map +1 -1
  404. package/lib/map/client/mixins/map/mixin.geojson-layers.js +65 -14
  405. package/lib/map/client/mixins/map/mixin.geojson-layers.js.map +1 -1
  406. package/lib/map/client/mixins/map/mixin.heatmap-layers.js +6 -1
  407. package/lib/map/client/mixins/map/mixin.heatmap-layers.js.map +1 -1
  408. package/lib/map/client/mixins/map/mixin.popup.js +4 -2
  409. package/lib/map/client/mixins/map/mixin.popup.js.map +1 -1
  410. package/lib/map/client/mixins/map/mixin.style.js +9 -5
  411. package/lib/map/client/mixins/map/mixin.style.js.map +1 -1
  412. package/lib/map/client/mixins/map/mixin.tiled-mesh-layers.js +4 -11
  413. package/lib/map/client/mixins/map/mixin.tiled-mesh-layers.js.map +1 -1
  414. package/lib/map/client/mixins/map/mixin.tiled-wind-layers.js +0 -11
  415. package/lib/map/client/mixins/map/mixin.tiled-wind-layers.js.map +1 -1
  416. package/lib/map/client/mixins/map/mixin.tooltip.js +4 -2
  417. package/lib/map/client/mixins/map/mixin.tooltip.js.map +1 -1
  418. package/lib/map/client/mixins/mixin.activity.js +150 -150
  419. package/lib/map/client/mixins/mixin.activity.js.map +1 -1
  420. package/lib/map/client/mixins/mixin.catalog-panel.js +36 -0
  421. package/lib/map/client/mixins/mixin.catalog-panel.js.map +1 -0
  422. package/lib/map/client/mixins/mixin.feature-selection.js +17 -8
  423. package/lib/map/client/mixins/mixin.feature-selection.js.map +1 -1
  424. package/lib/map/client/mixins/mixin.feature-service.js +36 -16
  425. package/lib/map/client/mixins/mixin.feature-service.js.map +1 -1
  426. package/lib/map/client/mixins/mixin.infobox.js +1 -1
  427. package/lib/map/client/mixins/mixin.infobox.js.map +1 -1
  428. package/lib/map/client/mixins/mixin.levels.js +26 -12
  429. package/lib/map/client/mixins/mixin.levels.js.map +1 -1
  430. package/lib/map/client/mixins/mixin.style.js +1 -0
  431. package/lib/map/client/mixins/mixin.style.js.map +1 -1
  432. package/lib/map/client/mixins/mixin.weacast.js +22 -28
  433. package/lib/map/client/mixins/mixin.weacast.js.map +1 -1
  434. package/lib/map/client/pixi-utils.js +8 -177
  435. package/lib/map/client/pixi-utils.js.map +1 -1
  436. package/lib/map/client/readers/index.js +12 -0
  437. package/lib/map/client/readers/index.js.map +1 -1
  438. package/lib/map/client/readers/reader.geojson.js +62 -34
  439. package/lib/map/client/readers/reader.geojson.js.map +1 -1
  440. package/lib/map/client/readers/reader.gpx.js +32 -21
  441. package/lib/map/client/readers/reader.gpx.js.map +1 -1
  442. package/lib/map/client/readers/reader.kml.js +32 -21
  443. package/lib/map/client/readers/reader.kml.js.map +1 -1
  444. package/lib/map/client/readers/reader.shp.js +116 -0
  445. package/lib/map/client/readers/reader.shp.js.map +1 -0
  446. package/lib/map/client/utils.js +1 -8
  447. package/lib/map/client/utils.js.map +1 -1
  448. package/lib/map/common/grid.js +131 -0
  449. package/lib/map/common/grid.js.map +1 -1
  450. package/lib/map/common/index.js +22 -11
  451. package/lib/map/common/index.js.map +1 -1
  452. package/lib/map/common/meteo-model-grid-source.js +5 -2
  453. package/lib/map/common/meteo-model-grid-source.js.map +1 -1
  454. package/lib/map/common/time-based-grid-source.js +5 -2
  455. package/lib/map/common/time-based-grid-source.js.map +1 -1
  456. package/lib/test/client/core/account.js +1 -1
  457. package/lib/test/client/core/account.js.map +1 -1
  458. package/lib/test/client/core/collection.js +31 -13
  459. package/lib/test/client/core/collection.js.map +1 -1
  460. package/lib/test/client/core/layout.js +137 -49
  461. package/lib/test/client/core/layout.js.map +1 -1
  462. package/lib/test/client/core/screens.js +1 -1
  463. package/lib/test/client/core/screens.js.map +1 -1
  464. package/lib/test/client/core/utils.js +89 -22
  465. package/lib/test/client/core/utils.js.map +1 -1
  466. package/lib/test/client/map/catalog.js +134 -41
  467. package/lib/test/client/map/catalog.js.map +1 -1
  468. package/lib/test/client/map/controls.js +7 -4
  469. package/lib/test/client/map/controls.js.map +1 -1
  470. package/lib/test/client/map/index.js +12 -0
  471. package/lib/test/client/map/index.js.map +1 -1
  472. package/lib/test/client/map/utils.js +67 -0
  473. package/lib/test/client/map/utils.js.map +1 -0
  474. package/package.json +5 -6
  475. package/.nyc_output/2226bcce-9d22-4dad-b9fa-46564b5565c7.json +0 -1
  476. package/.nyc_output/6dc4b140-1a8a-4d69-b91c-89c557883d6e.json +0 -1
  477. package/.nyc_output/processinfo/058fc679-d60a-4501-ac04-71171e5200b8.json +0 -1
  478. package/.nyc_output/processinfo/2226bcce-9d22-4dad-b9fa-46564b5565c7.json +0 -1
  479. package/.nyc_output/processinfo/6dc4b140-1a8a-4d69-b91c-89c557883d6e.json +0 -1
  480. package/.nyc_output/processinfo/8b1830fa-932e-4a61-9837-4a5b18f83ea9.json +0 -1
  481. package/.nyc_output/processinfo/afd2d144-3570-4858-b94a-b523dbd023dd.json +0 -1
  482. package/extras/tours/map/favorite-views.js +0 -53
  483. package/lib/core/client/components/frame/KChart.vue +0 -60
  484. package/lib/core/client/components/input/KCodeInput.vue +0 -50
  485. package/lib/core/client/components/input/KTimeRangeChooser.vue +0 -109
  486. package/lib/core/client/components/time/KTimeRange.vue +0 -144
  487. package/lib/map/client/components/KFavoriteViews.vue +0 -217
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../map/client/leaflet/TiledFeatureLayer.js"],"names":["TiledFeatureLayer","L","GridLayer","extend","initialize","options","prototype","call","on","event","onTileUnload","featureRefCount","Map","getFeatureKey","feature","id","_","get","layer","featureSource","setup","activity","onAdd","map","clear","onRemove","createTile","coords","tile","document","createElement","tileSize","getTileSize","bounds","_tileCoordsToBounds","baseQuery","south","getSouth","north","getNorth","west","getWest","east","getEast","style","outline","innerHTML","y","x","toFixed","promises","probeService","push","getProbeFeatures","merge","Promise","all","then","data","tileUnloaded","probes","features","length","updateLayer","name","filter","key","find","probe","index","refCount","undefined","set","catch","error","remove","delete","collection","redraw","_map","_removeAllTiles"],"mappings":"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","file":"TiledFeatureLayer.js","sourcesContent":["import L from 'leaflet'\r\nimport _ from 'lodash'\r\nimport { featureEach } from '@turf/meta'\r\nimport { featureCollection } from '@turf/helpers'\r\n\r\nconst TiledFeatureLayer = L.GridLayer.extend({\r\n initialize (options) {\r\n L.GridLayer.prototype.initialize.call(this, options)\r\n\r\n this.on('tileunload', (event) => { this.onTileUnload(event) })\r\n\r\n this.featureRefCount = new Map()\r\n this.getFeatureKey = (feature) => {\r\n const id = _.get(this.layer, 'featureId', '_id')\r\n return _.get(feature, 'properties.' + id, _.get(feature, id))\r\n }\r\n\r\n this.featureSource = options.featureSource\r\n },\r\n\r\n setup (activity, layer) {\r\n this.activity = activity\r\n this.layer = layer\r\n },\r\n\r\n onAdd (map) {\r\n this.featureRefCount.clear()\r\n L.GridLayer.prototype.onAdd.call(this, map)\r\n },\r\n\r\n onRemove (map) {\r\n this.featureRefCount.clear()\r\n L.GridLayer.prototype.onRemove.call(this, map)\r\n },\r\n\r\n createTile (coords) {\r\n const tile = document.createElement('div')\r\n const tileSize = this.getTileSize()\r\n const bounds = this._tileCoordsToBounds(coords)\r\n const baseQuery = {\r\n south: bounds.getSouth(),\r\n north: bounds.getNorth(),\r\n west: bounds.getWest(),\r\n east: bounds.getEast()\r\n }\r\n if (_.get(this.options, 'debug.showTileInfos')) {\r\n tile.style.outline = '1px solid green'\r\n tile.innerHTML = `leaflet tile is ${tileSize.y} x ${tileSize.x} pixels</br>\r\n covering ${bounds.getSouth().toFixed(2)}, ${bounds.getNorth().toFixed(2)},\r\n ${bounds.getWest().toFixed(2)}, ${bounds.getEast().toFixed(2)}</br>`\r\n }\r\n // Using async/await seems to cause problems in Leaflet, we use promises instead\r\n const promises = []\r\n // Request probes first if any\r\n if (this.layer.probeService) {\r\n promises.push(this.activity.getProbeFeatures(_.merge({ baseQuery }, this.layer)))\r\n }\r\n promises.push(this.featureSource(baseQuery))\r\n Promise.all(promises).then(data => {\r\n if (tile.tileUnloaded) {\r\n // tile was unloaded before fetch completed\r\n if (_.get(this.options, 'debug.showTileInfos')) {\r\n tile.innerHTML += 'Data discarded as tile has been unloaded'\r\n }\r\n return\r\n }\r\n\r\n if (this.layer.probeService) {\r\n tile.probes = (data[0].features.length ? data[0] : null)\r\n // Can't have measures without probes\r\n if (!tile.probes) tile.features = null\r\n else tile.features = (data[1].features.length ? data[1] : null)\r\n } else {\r\n tile.features = (data[0].features.length ? data[0] : null)\r\n }\r\n\r\n if (tile.probes || tile.features) {\r\n if (tile.probes) {\r\n this.activity.updateLayer(this.layer.name, tile.probes)\r\n }\r\n if (tile.features) {\r\n // If probe are given we should have a perfect match with measures\r\n // Filter any measure without a corresponding probe\r\n if (tile.probes) {\r\n tile.features.features = tile.features.features.filter(feature => {\r\n const key = this.getFeatureKey(feature)\r\n return _.find(tile.probes.features, probe => key === this.getFeatureKey(probe))\r\n })\r\n }\r\n this.activity.updateLayer(this.layer.name, tile.features)\r\n }\r\n // ref each feature\r\n // TODO: we could only add features with refcount = 1\r\n // but in case of probes we need to find corresponding features\r\n featureEach(tile.probes || tile.features, (feature, index) => {\r\n const key = this.getFeatureKey(feature)\r\n let refCount = this.featureRefCount.get(key)\r\n refCount = refCount === undefined ? 1 : refCount + 1\r\n this.featureRefCount.set(key, refCount)\r\n })\r\n\r\n if (_.get(this.options, 'debug.showTileInfos')) {\r\n if (tile.probes) tile.innerHTML += `fetched ${tile.probes.features.length} probes</br>`\r\n if (tile.features) tile.innerHTML += `fetched ${tile.features.features.length} features`\r\n }\r\n } else {\r\n if (_.get(this.options, 'debug.showTileInfos')) {\r\n tile.innerHTML += 'No data fetched'\r\n }\r\n }\r\n }).catch(error => {\r\n throw error\r\n })\r\n\r\n return tile\r\n },\r\n\r\n onTileUnload (event) {\r\n // flag tile as unloaded (useful when tile hasn't loaded completely yet)\r\n event.tile.tileUnloaded = true\r\n\r\n const probes = event.tile.probes\r\n const features = event.tile.features\r\n if (!probes && !features) return\r\n\r\n const remove = []\r\n // unref each feature, those with refCount = 0 => we can remove\r\n featureEach(probes || features, (feature, index) => {\r\n const key = this.getFeatureKey(feature)\r\n let refCount = this.featureRefCount.get(key)\r\n refCount = refCount - 1\r\n if (refCount === 0) {\r\n this.featureRefCount.delete(key)\r\n remove.push(feature)\r\n } else {\r\n this.featureRefCount.set(key, refCount)\r\n }\r\n })\r\n\r\n if (remove.length) {\r\n const collection = featureCollection(remove)\r\n this.activity.updateLayer(this.layer.name, collection, true)\r\n }\r\n },\r\n\r\n redraw () {\r\n // remove tiles manually first\r\n if (this._map) this._removeAllTiles()\r\n // clear feature ref counts since there's no tile anymore\r\n this.featureRefCount.clear()\r\n // request grid layer redraw\r\n L.GridLayer.prototype.redraw.call(this)\r\n }\r\n})\r\n\r\nexport { TiledFeatureLayer }\r\n"]}
1
+ {"version":3,"sources":["../../../../map/client/leaflet/TiledFeatureLayer.js"],"names":["TiledFeatureLayer","L","GridLayer","extend","initialize","options","enableDebug","_","get","prototype","call","on","event","onTileUnload","userIsDragging","userIsZooming","pendingStationUpdates","getFeatureKey","feature","id","layer","featureSource","flyingTiles","Map","modifiedTiles","Set","allFeatures","setup","activity","onAdd","map","zoomStartLevel","zoomEndLevel","_map","getZoom","clear","onRemove","getEvents","events","onDragStart","dragstart","onDragEnd","dragend","onZoomStart","zoomstart","onZoomEnd","zoomend","probeService","minFeatureZoom","getMinZoom","maxFeatureZoom","getMaxZoom","collection","internalFeature","values","push","cloneDeep","geojson","updateLayer","name","length","known","has","createTile","coords","key","tile","undefined","div","document","createElement","bbox","_tileCoordsToBounds","featuresRequest","featuresChildren","features","measuresRequest","measuresChildren","unload","set","style","outline","innerHTML","add","mergeRequests","tiles","requests","sortedTiles","sort","a","b","x","y","z","vrequests","forEach","newRequest","r","maxy","miny","v","h","maxx","minx","concat","minp","point","maxp","bounds","query","south","getSouth","north","getNorth","west","getWest","east","getEast","numTilesR","logger","debug","_update","center","tilesToRemove","tilesWithFeaturesRequest","tilesWithMeasuresRequest","tileWithMeasures","parentTileCoords","parentTile","featureId","intersects","refCount","featureRequests","promise","getProbeFeatures","merge","baseQuery","then","data","allTiles","flat","addCollection","unknownFeature","turfBbox","corner1","latLng","corner2","latLngBounds","size","catch","err","delete","measureRequests","stationPromises","Promise","all","flaggedStations","properties","measureRequestIssued","updateStations","okMeasures","removeCollection","redraw","Array","from","feat"],"mappings":"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","file":"TiledFeatureLayer.js","sourcesContent":["import L from 'leaflet'\r\nimport _ from 'lodash'\r\nimport logger from 'loglevel'\r\nimport bbox from '@turf/bbox'\r\nimport { featureEach } from '@turf/meta'\r\nimport { featureCollection } from '@turf/helpers'\r\nimport { tile2key, getParentTileInTileSet } from './utils'\r\n\r\nconst TiledFeatureLayer = L.GridLayer.extend({\r\n initialize (options) {\r\n this.enableDebug = _.get(options, 'enableDebug', false)\r\n // this.enableDebug = true\r\n L.GridLayer.prototype.initialize.call(this, options)\r\n\r\n this.on('tileunload', (event) => { this.onTileUnload(event) })\r\n\r\n this.userIsDragging = false\r\n this.userIsZooming = false\r\n this.pendingStationUpdates = []\r\n\r\n this.getFeatureKey = (feature) => {\r\n const id = _.get(this.layer, 'featureId', '_id')\r\n return _.get(feature, 'properties.' + id, _.get(feature, id))\r\n }\r\n\r\n this.featureSource = options.featureSource\r\n\r\n this.flyingTiles = new Map()\r\n this.modifiedTiles = new Set()\r\n this.allFeatures = new Map()\r\n },\r\n\r\n setup (activity, layer) {\r\n this.activity = activity\r\n this.layer = layer\r\n },\r\n\r\n onAdd (map) {\r\n this.userIsDragging = false\r\n this.userIsZooming = false\r\n this.pendingStationUpdates = []\r\n\r\n this.zoomStartLevel = this.zoomEndLevel = this._map.getZoom()\r\n\r\n this.flyingTiles.clear()\r\n this.modifiedTiles.clear()\r\n this.allFeatures.clear()\r\n\r\n L.GridLayer.prototype.onAdd.call(this, map)\r\n },\r\n\r\n onRemove (map) {\r\n this.flyingTiles.clear()\r\n this.modifiedTiles.clear()\r\n this.allFeatures.clear()\r\n\r\n L.GridLayer.prototype.onRemove.call(this, map)\r\n },\r\n\r\n getEvents () {\r\n const events = L.GridLayer.prototype.getEvents.call(this)\r\n\r\n // dragstart sets userIsDragging flag\r\n const onDragStart = events.dragstart\r\n events.dragstart = (event) => {\r\n this.userIsDragging = true\r\n if (onDragStart) onDragStart.call(this, event)\r\n }\r\n\r\n // dragstart clears userIsDragging flag\r\n const onDragEnd = events.dragend\r\n events.dragend = (event) => {\r\n this.userIsDragging = false\r\n if (onDragEnd) onDragEnd.call(this, event)\r\n }\r\n\r\n // zoomstart records zoomStartLevel\r\n const onZoomStart = events.zoomstart\r\n events.zoomstart = (event) => {\r\n if (onZoomStart) onZoomStart.call(this, event)\r\n this.zoomStartLevel = this._map.getZoom()\r\n this.userIsZooming = true\r\n }\r\n\r\n // zoomend records zoomEndLevel\r\n const onZoomEnd = events.zoomend\r\n events.zoomend = (event) => {\r\n if (onZoomEnd) onZoomEnd.call(this, event)\r\n this.zoomEndLevel = this._map.getZoom()\r\n this.userIsZooming = false\r\n\r\n // Handle stations with measures, we may reset the stations to their\r\n // 'station state' when crossing the minFeatureZoom/maxFeatureZoom values\r\n // We also delay stations updates to prevent them from happening during a zoom animation\r\n if (this.layer.probeService) {\r\n const minFeatureZoom = _.get(this.options, 'minFeatureZoom', this._map.getMinZoom())\r\n const maxFeatureZoom = _.get(this.options, 'maxFeatureZoom', this._map.getMaxZoom())\r\n if ((this.zoomStartLevel >= minFeatureZoom && this.zoomEndLevel < minFeatureZoom) ||\r\n (this.zoomStartLevel <= maxFeatureZoom && this.zoomEndLevel > maxFeatureZoom)) {\r\n // We crossed minFeatureZoom/maxFeatureZoom => reset to station state\r\n let collection = []\r\n for (const internalFeature of this.allFeatures.values()) {\r\n collection.push(_.cloneDeep(internalFeature.geojson))\r\n }\r\n collection = featureCollection(collection)\r\n this.activity.updateLayer(this.layer.name, collection, true)\r\n this.activity.updateLayer(this.layer.name, collection)\r\n } else if (this.pendingStationUpdates.length) {\r\n // Otherwise apply pending station updates\r\n for (const collection of this.pendingStationUpdates) {\r\n // But before, make sure we still know the stations\r\n const known = []\r\n featureEach(collection, (feature) => {\r\n if (this.allFeatures.has(this.getFeatureKey(feature)))\r\n known.push(feature)\r\n })\r\n this.activity.updateLayer(this.layer.name, featureCollection(known))\r\n }\r\n }\r\n this.pendingStationUpdates.length = 0\r\n }\r\n }\r\n\r\n return events\r\n },\r\n\r\n createTile (coords) {\r\n const key = tile2key(coords)\r\n let tile = this.flyingTiles.get(key)\r\n if (tile === undefined) {\r\n tile = {\r\n div: document.createElement('div'),\r\n coords: coords,\r\n bbox: this._tileCoordsToBounds(coords),\r\n featuresRequest: null,\r\n featuresChildren: [],\r\n features: [],\r\n measuresRequest: null,\r\n measuresChildren: [],\r\n unload: false\r\n }\r\n\r\n this.flyingTiles.set(key, tile)\r\n\r\n if (this.enableDebug) {\r\n tile.div.style.outline = '1px solid orange'\r\n tile.div.innerHTML = ''\r\n }\r\n } else {\r\n tile.unload = false\r\n if (this.enableDebug) tile.div.innerHTML += '</br>createTile: found in flying tiles'\r\n }\r\n\r\n this.modifiedTiles.add(key)\r\n\r\n return tile.div\r\n },\r\n\r\n onTileUnload (event) {\r\n const key = tile2key(event.coords)\r\n const tile = this.flyingTiles.get(key)\r\n if (tile) tile.unload = true\r\n this.modifiedTiles.add(key)\r\n\r\n if (this.enableDebug && tile) tile.div.innerHTML += '</br>unload scheduled'\r\n },\r\n\r\n mergeRequests (tiles) {\r\n const requests = []\r\n\r\n // Try to merge tiles vertically, then horizontally\r\n const sortedTiles = tiles.sort((a, b) => {\r\n if (a.coords.x === b.coords.x) {\r\n return a.coords.y < b.coords.y ? -1 : a.coords.y !== b.coords.y ? 1 : 0\r\n }\r\n return a.coords.x < b.coords.x ? -1 : 1\r\n })\r\n\r\n if (sortedTiles.length) {\r\n const z = sortedTiles[0].coords.z\r\n const vrequests = []\r\n sortedTiles.forEach((tile) => {\r\n let newRequest = true\r\n if (vrequests.length) {\r\n const r = vrequests[vrequests.length - 1]\r\n if (tile.coords.x === r.x) {\r\n if (tile.coords.y === r.maxy + 1) {\r\n r.tiles.push(tile)\r\n r.maxy = tile.coords.y\r\n newRequest = false\r\n }\r\n }\r\n }\r\n if (newRequest) {\r\n vrequests.push({\r\n x: tile.coords.x,\r\n miny: tile.coords.y,\r\n maxy: tile.coords.y,\r\n tiles: [tile]\r\n })\r\n }\r\n })\r\n\r\n // Now try to merge horizontally adjacent vertical requests\r\n vrequests.forEach((v) => {\r\n let newRequest = true\r\n if (requests.length) {\r\n const h = requests[requests.length - 1]\r\n if (v.miny === h.miny && v.maxy === h.maxy && v.x === h.maxx + 1) {\r\n h.tiles.push(...v.tiles)\r\n h.maxx = v.x\r\n newRequest = false\r\n }\r\n }\r\n if (newRequest) {\r\n requests.push({\r\n minx: v.x,\r\n maxx: v.x,\r\n miny: v.miny,\r\n maxy: v.maxy,\r\n tiles: [].concat(v.tiles)\r\n })\r\n }\r\n })\r\n\r\n // Compute final query\r\n requests.forEach((r) => {\r\n const minp = L.point(r.minx, r.miny); const maxp = L.point(r.maxx, r.maxy)\r\n minp.z = maxp.z = z\r\n const bounds = this._tileCoordsToBounds(minp)\r\n bounds.extend(this._tileCoordsToBounds(maxp))\r\n r.query = {\r\n south: bounds.getSouth(),\r\n north: bounds.getNorth(),\r\n west: bounds.getWest(),\r\n east: bounds.getEast()\r\n }\r\n })\r\n\r\n if (this.enableDebug) {\r\n let numTilesR = 0\r\n requests.forEach((r) => { numTilesR += r.tiles.length })\r\n if (numTilesR !== tiles.length) {\r\n logger.debug('TiledFeatureLayer: less requested tiles than expected !')\r\n }\r\n }\r\n }\r\n\r\n /* One request per tile\r\n tiles.forEach((tile) => {\r\n const r = {\r\n tiles: [tile],\r\n query: {\r\n south: tile.bbox.getSouth(),\r\n north: tile.bbox.getNorth(),\r\n west: tile.bbox.getWest(),\r\n east: tile.bbox.getEast()\r\n }\r\n }\r\n requests.push(r)\r\n })\r\n */\r\n\r\n if (this.enableDebug && tiles.length) {\r\n logger.debug(`TiledFeatureLayer: ${tiles.length} requests reduced to ${requests.length}`)\r\n }\r\n\r\n return requests\r\n },\r\n\r\n _update (center) {\r\n L.GridLayer.prototype._update.call(this)\r\n\r\n // No update while dragging\r\n if (this.userIsDragging) return\r\n\r\n const tilesToRemove = []\r\n const tilesWithFeaturesRequest = []\r\n const tilesWithMeasuresRequest = []\r\n\r\n const minFeatureZoom = _.get(this.options, 'minFeatureZoom', this._map.getMinZoom())\r\n const maxFeatureZoom = _.get(this.options, 'maxFeatureZoom', this._map.getMaxZoom())\r\n\r\n // Loop through tiles to consider\r\n // - either tile is flagged for unload => work on its feature once the pending request is over\r\n // - either tile is flagged for load\r\n // in this case, we check if there's a parent tile from which we can read data\r\n // if not, we'll have to issue a request to the featureSource\r\n this.modifiedTiles.forEach((key) => {\r\n const tile = this.flyingTiles.get(key)\r\n\r\n // This can happen when a tile has been removed from flyingTiles\r\n // because the associated request failed\r\n if (tile === undefined) return\r\n\r\n if (tile.unload) {\r\n // Wait for request to end before removing associated tile data since\r\n // a child tile may wait on that request\r\n if (tile.featuresRequest === null && tile.measuresRequest === null) tilesToRemove.push(tile)\r\n } else {\r\n // Is this a tile with measures ?\r\n const tileWithMeasures = this.layer.probeService && (tile.coords.z >= minFeatureZoom) && (tile.coords.z <= maxFeatureZoom)\r\n\r\n if (this.enableDebug) {\r\n tile.div.innerHTML += '</br>features'\r\n if (tileWithMeasures) tile.div.innerHTML += ' + measures'\r\n }\r\n\r\n const parentTileCoords = getParentTileInTileSet(this.flyingTiles, tile.coords)\r\n if (parentTileCoords === undefined) {\r\n // No known parent tile, we'll have to request data\r\n tilesWithFeaturesRequest.push(tile)\r\n if (tileWithMeasures) tilesWithMeasuresRequest.push(tile)\r\n if (this.enableDebug) tile.div.innerHTML += '</br>need request(s)'\r\n } else {\r\n const parentTile = this.flyingTiles.get(tile2key(parentTileCoords))\r\n\r\n if (parentTile.featuresRequest === null) {\r\n // Parent tile has already loaded the features, fetch from there\r\n parentTile.features.forEach((featureId) => {\r\n const feature = this.allFeatures.get(featureId)\r\n if (tile.bbox.intersects(feature.bbox)) {\r\n feature.refCount += 1\r\n tile.features.push(featureId)\r\n }\r\n })\r\n\r\n if (this.enableDebug) {\r\n tile.div.style.outline = '1px solid green'\r\n tile.div.innerHTML += `</br>found ${tile.features.length} features in parent tile`\r\n }\r\n } else {\r\n // Otherwise, link to pending parent tile request\r\n parentTile.featuresChildren.push(tile)\r\n tile.featuresRequest = parentTile.featuresRequest\r\n\r\n if (this.enableDebug) tile.div.innerHTML += '</br>pending parent features request'\r\n }\r\n\r\n // Special case for probes: the parent tile may be at the level where only probes are loaded\r\n // and it's still missing the measures, schedule measure load now\r\n if (tileWithMeasures) {\r\n if (parentTile.measuresRequest !== null) {\r\n parentTile.measuresChildren.push(tile)\r\n tile.measuresRequest = parentTile.measuresRequest\r\n\r\n if (this.enableDebug) tile.div.innerHTML += '</br>pending parent measures request'\r\n } else if (parentTileCoords.z < minFeatureZoom) {\r\n tilesWithMeasuresRequest.push(tile)\r\n\r\n if (this.enableDebug) tile.div.innerHTML += '</br>need measures request'\r\n }\r\n }\r\n }\r\n }\r\n })\r\n\r\n this.modifiedTiles.clear()\r\n\r\n // We have to issue request(s) for tiles with no features. Requests can span over\r\n // multiple tiles due to merge step\r\n // Once requests are done, dispatch loaded features amongst associated tiles. A top level tile\r\n // may have children tiles too, these will get updated also.\r\n const featureRequests = this.mergeRequests(tilesWithFeaturesRequest)\r\n featureRequests.forEach((r) => {\r\n const promise = this.layer.probeService\r\n ? this.activity.getProbeFeatures(_.merge({ baseQuery: r.query }, this.layer))\r\n : this.featureSource(r.query)\r\n r.tiles.forEach((tile) => {\r\n tile.featuresRequest = promise\r\n\r\n if (this.enableDebug) tile.div.innerHTML += '</br>features request issued'\r\n })\r\n\r\n promise.then((data) => {\r\n // Gather all associated tiles, taking children tiles into account\r\n const allTiles = [r.tiles]\r\n r.tiles.forEach((tile) => { if (tile.featuresChildren.length) allTiles.push(tile.featuresChildren) })\r\n const tiles = allTiles.flat()\r\n\r\n const addCollection = []\r\n data.features.forEach((feature) => {\r\n const featureId = this.getFeatureKey(feature)\r\n let internalFeature = this.allFeatures.get(featureId)\r\n const unknownFeature = internalFeature === undefined\r\n if (unknownFeature) {\r\n // Feature we don't know, gather infos about it\r\n const turfBbox = bbox(feature)\r\n const corner1 = L.latLng(turfBbox[1], turfBbox[0])\r\n const corner2 = L.latLng(turfBbox[3], turfBbox[2])\r\n internalFeature = { geojson: feature, refCount: 0, bbox: L.latLngBounds(corner1, corner2) }\r\n }\r\n // Dispatch feature amongst associated tiles\r\n tiles.forEach((tile) => {\r\n if (tile.bbox.intersects(internalFeature.bbox)) {\r\n internalFeature.refCount += 1\r\n tile.features.push(featureId)\r\n }\r\n })\r\n // Tiles may be outside request bbox when bbox is big because of\r\n // underlying service projection (refCount would stay 0)\r\n if (internalFeature.refCount > 0) {\r\n if (unknownFeature) {\r\n addCollection.push(_.cloneDeep(feature))\r\n this.allFeatures.set(featureId, internalFeature)\r\n }\r\n }\r\n })\r\n if (addCollection.length) {\r\n const collection = featureCollection(addCollection)\r\n this.activity.updateLayer(this.layer.name, collection)\r\n }\r\n\r\n // Notify tiles their request is done\r\n tiles.forEach((tile) => {\r\n tile.featuresRequest = null\r\n tile.featuresChildren = []\r\n // When a tile was scheduled for removal, add it to the list of tiles to consider\r\n if (tile.unload) this.modifiedTiles.add(tile2key(tile.coords))\r\n\r\n if (this.enableDebug) {\r\n tile.div.style.outline = '1px solid green'\r\n tile.div.innerHTML += `</br>features request success: ${data.features.length} total, ${tile.features.length} for tile`\r\n }\r\n })\r\n\r\n if (this.enableDebug) logger.debug(`TiledFeatureLayer: allFeatures is ${this.allFeatures.size} long`)\r\n }).catch((err) => {\r\n // Gather all associated tiles, taking children tiles into account\r\n const allTiles = [r.tiles]\r\n r.tiles.forEach((tile) => { if (tile.featuresChildren.length) allTiles.push(tile.featuresChildren) })\r\n const tiles = allTiles.flat()\r\n\r\n // Failed tiles are removed from flyingTiles\r\n tiles.forEach((tile) => {\r\n this.flyingTiles.delete(tile2key(tile.coords))\r\n\r\n if (this.enableDebug) {\r\n tile.div.style.outline = '1px solid red'\r\n tile.div.innerHTML += `</br>features request failed: ${err}`\r\n }\r\n })\r\n\r\n if (this.enableDebug) logger.debug(`TiledFeatureLayer: allFeatures is ${this.allFeatures.size} long`)\r\n })\r\n })\r\n\r\n // Handle tiles where we need to fetch measures\r\n const measureRequests = this.mergeRequests(tilesWithMeasuresRequest)\r\n measureRequests.forEach((r) => {\r\n const promise = this.featureSource(r.query)\r\n const stationPromises = []\r\n r.tiles.forEach((tile) => {\r\n tile.measuresRequest = promise\r\n if (tile.featuresRequest) stationPromises.push(tile.featuresRequest)\r\n\r\n if (this.enableDebug) tile.div.innerHTML += '</br>measures request issued'\r\n })\r\n\r\n // When stations are fetched, we flag them with a 'measureRequestIssued' property that we\r\n // may use in dynamic styling\r\n Promise.all(stationPromises).then(() => {\r\n const flaggedStations = []\r\n r.tiles.forEach((tile) => {\r\n tile.features.forEach((id) => {\r\n const internalFeature = this.allFeatures.get(id)\r\n if (internalFeature) {\r\n const feature = _.cloneDeep(internalFeature.geojson)\r\n feature.properties.measureRequestIssued = true\r\n flaggedStations.push(feature)\r\n }\r\n })\r\n })\r\n if (flaggedStations.length) this.updateStations(featureCollection(flaggedStations))\r\n })\r\n\r\n promise.then((data) => {\r\n // Gather all associated tiles, taking children tiles into account\r\n const allTiles = [r.tiles]\r\n r.tiles.forEach((tile) => { if (tile.measuresChildren.length) allTiles.push(tile.measuresChildren) })\r\n const tiles = allTiles.flat()\r\n\r\n const stationPromises = []\r\n tiles.forEach((tile) => {\r\n tile.measuresRequest = null\r\n tile.measuresChildren = []\r\n // We want to push measures _after_ we pushed the stations\r\n if (tile.featuresRequest) stationPromises.push(tile.featuresRequest)\r\n\r\n if (this.enableDebug) tile.div.innerHTML += `</br>measures request success: ${data.features.length} total`\r\n })\r\n\r\n Promise.all(stationPromises).then(() => {\r\n // Make sure we know the stations those measures refer to\r\n const okMeasures = []\r\n featureEach(data, (feature) => {\r\n const id = this.getFeatureKey(feature)\r\n if (this.allFeatures.has(id)) okMeasures.push(feature)\r\n })\r\n if (okMeasures.length) this.updateStations(featureCollection(okMeasures))\r\n })\r\n }).catch((err) => {\r\n const allTiles = [r.tiles]\r\n r.tiles.forEach((tile) => { if (tile.measuresChildren.length) allTiles.push(tile.measuresChildren) })\r\n const tiles = allTiles.flat()\r\n\r\n tiles.forEach((tile) => {\r\n if (this.enableDebug) {\r\n tile.div.style.outline = '1px solid red'\r\n tile.div.innerHTML += `</br>measures request failed: ${err}`\r\n }\r\n })\r\n })\r\n })\r\n\r\n // Now handle tiles to remove\r\n const removeCollection = []\r\n tilesToRemove.forEach((tile) => {\r\n tile.features.forEach((featureId) => {\r\n const feature = this.allFeatures.get(featureId)\r\n if (feature.refCount === 1) {\r\n removeCollection.push(feature.geojson)\r\n this.allFeatures.delete(featureId)\r\n } else {\r\n feature.refCount -= 1\r\n }\r\n })\r\n this.flyingTiles.delete(tile2key(tile.coords))\r\n })\r\n if (removeCollection.length) this.activity.updateLayer(this.layer.name, featureCollection(removeCollection), true)\r\n\r\n if (this.enableDebug) {\r\n logger.debug(`TiledFeatureLayer: flyingTiles is ${this.flyingTiles.size} long`)\r\n logger.debug(`TiledFeatureLayer: allFeatures is ${this.allFeatures.size} long`)\r\n\r\n if (this.flyingTiles.size === 0 && this.allFeatures.size !== 0) {\r\n logger.debug(`TileFeatureLayer: no more flyingTiles but ${this.allFeatures.size} remaining features !`)\r\n this.allFeatures.forEach((feature) => {\r\n logger.debug(`TileFeatureLayer: ${this.getFeatureKey(feature.geojson)}: refCount ${feature.refCount}`)\r\n })\r\n }\r\n }\r\n },\r\n\r\n updateStations (geojson) {\r\n // When user is zooming, wait for the end of the zoom animation to update\r\n // stations. If we don't do that the features seem to 'slide' during the zoom\r\n // animation between their screen space position at the different zoom levels\r\n if (this.userIsZooming) {\r\n this.pendingStationUpdates.push(geojson)\r\n } else {\r\n const minFeatureZoom = _.get(this.options, 'minFeatureZoom', this._map.getMinZoom())\r\n const maxFeatureZoom = _.get(this.options, 'maxFeatureZoom', this._map.getMaxZoom())\r\n if (this.zoomEndLevel >= minFeatureZoom && this.zoomEndLevel <= maxFeatureZoom) { this.activity.updateLayer(this.layer.name, geojson) }\r\n }\r\n },\r\n\r\n redraw () {\r\n // clear underlying geojson layer\r\n const allFeatures = Array.from(this.allFeatures.values(), (feat) => feat.geojson)\r\n this.activity.updateLayer(this.layer.name, featureCollection(allFeatures), true)\r\n\r\n this.flyingTiles.clear()\r\n this.modifiedTiles.clear()\r\n this.allFeatures.clear()\r\n\r\n this.pendingStationUpdates.length = 0\r\n\r\n // request grid layer redraw\r\n L.GridLayer.prototype.redraw.call(this)\r\n }\r\n})\r\n\r\nexport { TiledFeatureLayer }\r\n"]}
@@ -41,7 +41,9 @@ const TiledMeshLayer = _leaflet2.default.GridLayer.extend({
41
41
  this.conf.render = {
42
42
  cutOver: options.cutOver,
43
43
  cutUnder: options.cutUnder,
44
- pixelColorMapping: options.pixelColorMapping
44
+ pixelColorMapping: options.pixelColorMapping,
45
+ showWireframe: options.showWireframe,
46
+ enableCulling: _lodash2.default.get(options, 'enableCulling', true)
45
47
  // keep debug options
46
48
  };this.conf.debug = {
47
49
  showTileInfos: options.showTileInfos,
@@ -60,13 +62,13 @@ const TiledMeshLayer = _leaflet2.default.GridLayer.extend({
60
62
  } });
61
63
  this.layerUniforms = new PIXI.UniformGroup({ in_layerAlpha: options.opacity, in_zoomLevel: 1.0 });
62
64
  this.pixiState = new PIXI.State();
63
- this.pixiState.culling = true;
65
+ this.pixiState.culling = this.conf.render.enableCulling;
64
66
  this.pixiState.blendMode = PIXI.BLEND_MODES.SCREEN;
65
67
 
66
68
  // setup layer global uniforms (as opposed to tile specific uniforms)
67
69
  this.cutValueUniform = null;
68
70
  if (options.cutOver) {
69
- this.layerUniforms.uniforms.cutOver = 0.0;
71
+ this.layerUniforms.uniforms.in_cutOver = 0.0;
70
72
  if (options.cutOver === 'levels') {
71
73
  this.cutValueUniform = 'in_cutOver';
72
74
  } else {
@@ -74,7 +76,7 @@ const TiledMeshLayer = _leaflet2.default.GridLayer.extend({
74
76
  }
75
77
  }
76
78
  if (options.cutUnder) {
77
- this.layerUniforms.uniforms.cutUnder = 0.0;
79
+ this.layerUniforms.uniforms.in_cutUnder = 0.0;
78
80
  if (options.cutUnder === 'levels') {
79
81
  this.cutValueUniform = 'in_cutUnder';
80
82
  } else {
@@ -147,22 +149,15 @@ const TiledMeshLayer = _leaflet2.default.GridLayer.extend({
147
149
 
148
150
  if (grid) {
149
151
  if (grid.hasData()) {
150
- // grid may be much larger than request, try to squeeze it
151
- const [iminlat, iminlon, imaxlat, imaxlon] = grid.getBestFit(reqBBox);
152
-
153
- const minlat = grid.getLat(iminlat);
154
- const minlon = grid.getLon(iminlon);
155
- const maxlat = grid.getLat(imaxlat);
156
- const maxlon = grid.getLon(imaxlon);
157
-
158
- // build mesh
159
- const raw = new _pixiUtils.RawValueHook('in_layerValue');
160
- const geometry = (0, _pixiUtils.buildPixiMeshFromGrid)(grid, [raw], iminlat, iminlon, imaxlat, imaxlon);
152
+ const { coords, minLat, minLon, deltaLat, deltaLon } = grid.genCoordsBuffer();
153
+ const values = grid.genValuesBuffer();
154
+ const indexes = grid.genMeshIndexBuffer();
155
+ const geometry = new PIXI.Geometry().addAttribute('in_layerCoord', coords, 2, false, PIXI.TYPES.HALF_FLOAT_VERTEX).addAttribute('in_layerValue', values, 1, false, PIXI.TYPES.FLOAT).addIndex(indexes);
161
156
 
162
157
  // compute tile specific uniforms
163
158
  const uniforms = {
164
159
  in_layerBounds: Float32Array.from(reqBBox),
165
- in_layerOffsetScale: Float32Array.of(minlat, minlon, maxlat - minlat, maxlon - minlon),
160
+ in_layerOffsetScale: Float32Array.of(minLat, minLon, deltaLat, deltaLon),
166
161
  layerUniforms: this.layerUniforms
167
162
  };
168
163
  if (grid.nodata !== undefined) {
@@ -173,19 +168,22 @@ const TiledMeshLayer = _leaflet2.default.GridLayer.extend({
173
168
  const mode = this.conf.debug.meshAsPoints ? PIXI.DRAW_MODES.POINTS : PIXI.DRAW_MODES.TRIANGLE_STRIP;
174
169
  tile.mesh = new PIXI.Mesh(geometry, shader, this.pixiState, mode);
175
170
 
171
+ if (this.conf.render.showWireframe) {
172
+ const wireframeGeometry = new PIXI.Geometry().addAttribute('in_layerCoord', geometry.getBuffer('in_layerCoord'), 2, false, PIXI.TYPES.HALF_FLOAT_VERTEX).addIndex(grid.genWireframeIndexBuffer());
173
+ const wireframeShader = new PIXI.Shader(this.wireframeProgram, uniforms);
174
+ tile.wireframe = new PIXI.Mesh(wireframeGeometry, wireframeShader, this.pixiState, PIXI.DRAW_MODES.LINE_STRIP);
175
+ }
176
+
176
177
  if (this.conf.debug.showTileInfos) {
177
- const dims = grid.getDimensions();
178
- const res = grid.getResolution();
179
178
  tile.innerHTML = `leaflet tile is ${tileSize.y} x ${tileSize.x} pixels</br>
180
179
  covering ${reqBBox[0].toPrecision(6)},${reqBBox[1].toPrecision(6)} to ${reqBBox[2].toPrecision(6)},${reqBBox[3].toPrecision(6)}</br>
181
180
  req res: ${resolution[0].toPrecision(4)} ${resolution[1].toPrecision(4)}</br>
182
- got res: ${res[0].toPrecision(4)} ${res[1].toPrecision(4)}</br>
183
- fetched grid is ${dims[0]} x ${dims[1]}, slimmed down to ${1 + imaxlat - iminlat} x ${1 + imaxlon - iminlon} points`;
181
+ mesh is made of ${values.length} points`;
184
182
  tile.style.outline = '1px solid green';
185
183
  }
186
184
  } else if (this.conf.debug.showTileInfos) {
187
185
  tile.style.outline = '1px solid red';
188
- tile.innerHTML = 'no data here (grid was full of nodata)!';
186
+ tile.innerHTML = 'no data here (grid maybe full of nodata)!';
189
187
  }
190
188
  } else if (this.conf.debug.showTileInfos) {
191
189
  tile.style.outline = '1px solid red';
@@ -195,7 +193,6 @@ const TiledMeshLayer = _leaflet2.default.GridLayer.extend({
195
193
  done(null, tile);
196
194
  }).catch(err => {
197
195
  done(err, tile);
198
- throw err;
199
196
  });
200
197
 
201
198
  return tile;
@@ -209,6 +206,14 @@ const TiledMeshLayer = _leaflet2.default.GridLayer.extend({
209
206
  mesh.zoomLevel = event.coords.z;
210
207
  mesh.visible = mesh.zoomLevel === this._map.getZoom();
211
208
  this.pixiRoot.addChild(mesh);
209
+
210
+ if (this.conf.render.showWireframe) {
211
+ const wireframe = event.tile.wireframe;
212
+ wireframe.zoomLevel = mesh.zoomLevel;
213
+ wireframe.visible = mesh.visible;
214
+ this.pixiRoot.addChild(wireframe);
215
+ }
216
+
212
217
  if (mesh.visible) {
213
218
  this.pixiLayer.redraw();
214
219
  }
@@ -224,6 +229,13 @@ const TiledMeshLayer = _leaflet2.default.GridLayer.extend({
224
229
  if (event.tile.mesh) {
225
230
  // remove and destroy tile mesh
226
231
  this.pixiRoot.removeChild(event.tile.mesh);
232
+
233
+ if (this.conf.render.showWireframe) {
234
+ this.pixiRoot.removeChild(event.tile.wireframe);
235
+ event.tile.wireframe.destroy();
236
+ event.tile.wireframe = null;
237
+ }
238
+
227
239
  if (event.tile.mesh.visible) {
228
240
  this.pixiLayer.redraw();
229
241
  }
@@ -239,8 +251,8 @@ const TiledMeshLayer = _leaflet2.default.GridLayer.extend({
239
251
  // and zoom level 'n+1' are being loaded on top of them
240
252
  // when alpha blending is used, this is annoying
241
253
  const zoomLevel = this._map.getZoom();
242
- for (const mesh of this.pixiRoot.children) {
243
- if (mesh.zoomLevel === zoomLevel) mesh.visible = false;
254
+ for (const child of this.pixiRoot.children) {
255
+ if (child.zoomLevel === zoomLevel) child.visible = false;
244
256
  }
245
257
  },
246
258
 
@@ -251,8 +263,8 @@ const TiledMeshLayer = _leaflet2.default.GridLayer.extend({
251
263
  // this is important when quickly zoomin in and out
252
264
  // because some meshes may not have been evicted yet
253
265
  const zoomLevel = this._map.getZoom();
254
- for (const mesh of this.pixiRoot.children) {
255
- if (mesh.zoomLevel === zoomLevel) mesh.visible = true;
266
+ for (const child of this.pixiRoot.children) {
267
+ if (child.zoomLevel === zoomLevel) child.visible = true;
256
268
  }
257
269
  this.pixiLayer.redraw();
258
270
  },
@@ -318,19 +330,20 @@ const TiledMeshLayer = _leaflet2.default.GridLayer.extend({
318
330
  const features = [
319
331
  // feature projecting layer position
320
332
  {
321
- name: 'layerPosition',
322
- varyings: ['vec2 frg_layerPosition'],
333
+ name: 'layerCoord',
334
+ varyings: ['vec2 frg_layerCoord'],
323
335
  vertex: {
324
- attributes: ['vec2 in_layerPosition'],
336
+ attributes: ['vec2 in_layerCoord'],
325
337
  uniforms: ['mat3 translationMatrix', 'mat3 projectionMatrix', 'float in_zoomLevel', 'vec4 in_layerOffsetScale'],
326
338
  functions: [_pixiUtils.WEBGL_FUNCTIONS.latLonToWebMercator, _pixiUtils.WEBGL_FUNCTIONS.unpack2],
327
- code: ` frg_layerPosition = unpack2(in_layerPosition, in_layerOffsetScale);
328
- vec2 projected = latLonToWebMercator(vec3(frg_layerPosition, in_zoomLevel));
329
- gl_Position = vec4((projectionMatrix * translationMatrix * vec3(projected, 1.0)).xy, 0.0, 1.0);`
339
+ code: ` frg_layerCoord = unpack2(in_layerCoord, in_layerOffsetScale);
340
+ vec2 projected = latLonToWebMercator(vec3(frg_layerCoord, in_zoomLevel));
341
+ gl_Position = vec4((projectionMatrix * translationMatrix * vec3(projected, 1.0)).xy, 0.0, 1.0);
342
+ ${this.conf.debug.meshAsPoints ? 'gl_PointSize = 10.0;' : ''}`
330
343
  },
331
344
  fragment: {
332
345
  uniforms: ['vec4 in_layerBounds'],
333
- code: ` bvec4 outside = bvec4(lessThan(frg_layerPosition, in_layerBounds.xy), greaterThan(frg_layerPosition, in_layerBounds.zw));
346
+ code: ` bvec4 outside = bvec4(lessThan(frg_layerCoord, in_layerBounds.xy), greaterThan(frg_layerCoord, in_layerBounds.zw));
334
347
  if (any(outside)) discard;`
335
348
  }
336
349
  },
@@ -421,14 +434,24 @@ const TiledMeshLayer = _leaflet2.default.GridLayer.extend({
421
434
  name: 'tail',
422
435
  fragment: {
423
436
  uniforms: ['float in_layerAlpha'],
424
- code: ` gl_FragColor.rgb = color.rgb * in_layerAlpha;
425
- gl_FragColor.a = in_layerAlpha;`
437
+ code: ' outColor = vec4(color.rgb * in_layerAlpha, in_layerAlpha);'
426
438
  }
427
439
  });
428
440
 
429
441
  const [vtxCode, frgCode] = (0, _pixiUtils.buildShaderCode)(features);
430
442
  this.program = new PIXI.Program(vtxCode, frgCode);
431
443
 
444
+ if (this.conf.render.showWireframe) {
445
+ const [vtxWireframe, frgWireframe] = (0, _pixiUtils.buildShaderCode)([features[0], {
446
+ name: 'tail',
447
+ fragment: {
448
+ uniforms: ['float in_layerAlpha'],
449
+ code: ' outColor = vec4(0.0, 0.0, 0.0, in_layerAlpha);'
450
+ }
451
+ }]);
452
+ this.wireframeProgram = new PIXI.Program(vtxWireframe, frgWireframe);
453
+ }
454
+
432
455
  if (this.conf.debug.showShader) {
433
456
  console.log('Generated vertex shader:');
434
457
  console.log(vtxCode);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../map/client/leaflet/TiledMeshLayer.js"],"names":["PIXI","TiledMeshLayer","L","GridLayer","extend","initialize","options","gridSource","conf","chromajs","render","cutOver","cutUnder","pixelColorMapping","debug","showTileInfos","meshAsPoints","showShader","resolutionScale","_","get","prototype","call","pixiRoot","Container","pixiLayer","pixiOverlay","utils","renderPixiLayer","destroyInteractionManager","shouldRedrawOnMove","layerUniforms","UniformGroup","in_layerAlpha","opacity","in_zoomLevel","pixiState","State","culling","blendMode","BLEND_MODES","SCREEN","cutValueUniform","uniforms","in_cutOver","in_cutUnder","on","event","onTileLoad","onTileUnload","onDataChangedCallback","onDataChanged","bind","onAdd","map","addLayer","_initialZoom","zoomStartCallback","onZoomStart","zoomEndCallback","onZoomEnd","onRemove","off","removeLayer","createTile","coords","done","tile","document","createElement","bounds","_tileCoordsToBounds","reqBBox","getSouth","getWest","getNorth","getEast","tileSize","getTileSize","resolution","y","x","fetchController","AbortController","fetch","signal","then","grid","hasData","iminlat","iminlon","imaxlat","imaxlon","getBestFit","minlat","getLat","minlon","getLon","maxlat","maxlon","raw","RawValueHook","geometry","in_layerBounds","Float32Array","from","in_layerOffsetScale","of","nodata","undefined","in_nodata","shader","Shader","program","mode","DRAW_MODES","POINTS","TRIANGLE_STRIP","mesh","Mesh","dims","getDimensions","res","getResolution","innerHTML","toPrecision","style","outline","catch","err","zoomLevel","z","visible","_map","getZoom","addChild","redraw","abort","removeChild","destroy","children","bbox","getBBox","c1","latLng","c2","latLngBounds","updateColorMap","updateShader","colorMap","fire","colorMapShaderCode","domain","classes","getDataBounds","invert","colors","scale","chroma","glcolors","c","gl","slice","reverse","console","error","features","name","varyings","vertex","attributes","functions","WEBGL_FUNCTIONS","latLonToWebMercator","unpack2","code","fragment","push","supportsNoData","vtxCode","frgCode","Program","log","renderer","getRenderer","setLevel","value","_resetView","setTime","time","setModel","model","getBounds","wrapLatLngBounds"],"mappings":"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","file":"TiledMeshLayer.js","sourcesContent":["import _ from 'lodash'\r\nimport L from 'leaflet'\r\nimport chroma from 'chroma-js'\r\nimport * as PIXI from 'pixi.js'\r\nimport 'leaflet-pixi-overlay'\r\nimport 'abort-controller/polyfill'\r\n\r\nimport { RawValueHook, buildPixiMeshFromGrid, buildColorMapShaderCodeFromClasses, buildColorMapShaderCodeFromDomain, buildShaderCode, WEBGL_FUNCTIONS } from '../pixi-utils'\r\n\r\nconst TiledMeshLayer = L.GridLayer.extend({\r\n initialize (options, gridSource) {\r\n this.conf = {}\r\n\r\n // keep color scale options\r\n this.conf.chromajs = options.chromajs\r\n // keep rendering options\r\n this.conf.render = {\r\n cutOver: options.cutOver,\r\n cutUnder: options.cutUnder,\r\n pixelColorMapping: options.pixelColorMapping\r\n }\r\n // keep debug options\r\n this.conf.debug = {\r\n showTileInfos: options.showTileInfos,\r\n meshAsPoints: options.meshAsPoints,\r\n showShader: options.showShader\r\n }\r\n this.conf.resolutionScale = _.get(options, 'resolutionScale', [1.0, 1.0])\r\n\r\n // initialize grid layer\r\n L.GridLayer.prototype.initialize.call(this, options)\r\n\r\n // setup pixi objects\r\n this.pixiRoot = new PIXI.Container()\r\n this.pixiLayer = L.pixiOverlay(\r\n utils => this.renderPixiLayer(utils),\r\n this.pixiRoot,\r\n { destroyInteractionManager: true, shouldRedrawOnMove: function () { return true } })\r\n this.layerUniforms = new PIXI.UniformGroup({ in_layerAlpha: options.opacity, in_zoomLevel: 1.0 })\r\n this.pixiState = new PIXI.State()\r\n this.pixiState.culling = true\r\n this.pixiState.blendMode = PIXI.BLEND_MODES.SCREEN\r\n\r\n // setup layer global uniforms (as opposed to tile specific uniforms)\r\n this.cutValueUniform = null\r\n if (options.cutOver) {\r\n this.layerUniforms.uniforms.cutOver = 0.0\r\n if (options.cutOver === 'levels') {\r\n this.cutValueUniform = 'in_cutOver'\r\n } else {\r\n this.layerUniforms.uniforms.in_cutOver = options.cutOver\r\n }\r\n }\r\n if (options.cutUnder) {\r\n this.layerUniforms.uniforms.cutUnder = 0.0\r\n if (options.cutUnder === 'levels') {\r\n this.cutValueUniform = 'in_cutUnder'\r\n } else {\r\n this.layerUniforms.uniforms.in_cutUnder = options.cutUnder\r\n }\r\n }\r\n\r\n // register event callbacks\r\n this.on('tileload', (event) => { this.onTileLoad(event) })\r\n this.on('tileunload', (event) => { this.onTileUnload(event) })\r\n\r\n this.gridSource = gridSource\r\n // keep ref on callback to be able to remove it\r\n this.onDataChangedCallback = this.onDataChanged.bind(this)\r\n this.gridSource.on('data-changed', this.onDataChangedCallback)\r\n },\r\n\r\n onAdd (map) {\r\n map.addLayer(this.pixiLayer)\r\n\r\n // This gets computed by pixi layer when it gets added to a map.\r\n // This uniform is supposed to reflect the visualization zoom level\r\n // to correctly project from wgs84 to web mercator in the shader\r\n // BUT since pixi already handles zoom with the container's scale matrix\r\n // we use the constant zoom level that was defined when the pixi layer\r\n // was added to the map.\r\n this.layerUniforms.uniforms.in_zoomLevel = this.pixiLayer._initialZoom\r\n\r\n // be notified when zoom starts\r\n // keep a ref on bound objects to be able to remove them later\r\n this.zoomStartCallback = this.onZoomStart.bind(this)\r\n this.zoomEndCallback = this.onZoomEnd.bind(this)\r\n map.on('zoomstart', this.zoomStartCallback)\r\n map.on('zoomend', this.zoomEndCallback)\r\n\r\n L.GridLayer.prototype.onAdd.call(this, map)\r\n },\r\n\r\n onRemove (map) {\r\n // remove map listeners\r\n map.off('zoomstart', this.zoomStartCallback)\r\n map.off('zoomend', this.zoomEndCallback)\r\n this.zoomStartCallback = null\r\n this.zoomEndCallback = null\r\n\r\n map.removeLayer(this.pixiLayer)\r\n\r\n L.GridLayer.prototype.onRemove.call(this, map)\r\n },\r\n\r\n createTile (coords, done) {\r\n const tile = document.createElement('div')\r\n\r\n // bbox we'll request to the grid source\r\n const bounds = this._tileCoordsToBounds(coords)\r\n const reqBBox = [bounds.getSouth(), bounds.getWest(), bounds.getNorth(), bounds.getEast()]\r\n // compute an ideal resolution for grid sources that care\r\n const tileSize = this.getTileSize()\r\n const resolution = [\r\n this.conf.resolutionScale[0] * ((reqBBox[2] - reqBBox[0]) / (tileSize.y - 1)),\r\n this.conf.resolutionScale[1] * ((reqBBox[3] - reqBBox[1]) / (tileSize.x - 1))\r\n ]\r\n tile.fetchController = new AbortController()\r\n\r\n // request data\r\n this.gridSource.fetch(tile.fetchController.signal, reqBBox, resolution)\r\n .then(grid => {\r\n // fetch ended, can't abort anymore\r\n tile.fetchController = null\r\n\r\n if (grid) {\r\n if (grid.hasData()) {\r\n // grid may be much larger than request, try to squeeze it\r\n const [iminlat, iminlon, imaxlat, imaxlon] = grid.getBestFit(reqBBox)\r\n\r\n const minlat = grid.getLat(iminlat)\r\n const minlon = grid.getLon(iminlon)\r\n const maxlat = grid.getLat(imaxlat)\r\n const maxlon = grid.getLon(imaxlon)\r\n\r\n // build mesh\r\n const raw = new RawValueHook('in_layerValue')\r\n const geometry = buildPixiMeshFromGrid(grid, [raw], iminlat, iminlon, imaxlat, imaxlon)\r\n\r\n // compute tile specific uniforms\r\n const uniforms = {\r\n in_layerBounds: Float32Array.from(reqBBox),\r\n in_layerOffsetScale: Float32Array.of(minlat, minlon, maxlat - minlat, maxlon - minlon),\r\n layerUniforms: this.layerUniforms\r\n }\r\n if (grid.nodata !== undefined) {\r\n uniforms.in_nodata = grid.nodata\r\n }\r\n\r\n const shader = new PIXI.Shader(this.program, uniforms)\r\n const mode = this.conf.debug.meshAsPoints ? PIXI.DRAW_MODES.POINTS : PIXI.DRAW_MODES.TRIANGLE_STRIP\r\n tile.mesh = new PIXI.Mesh(geometry, shader, this.pixiState, mode)\r\n\r\n if (this.conf.debug.showTileInfos) {\r\n const dims = grid.getDimensions()\r\n const res = grid.getResolution()\r\n tile.innerHTML =\r\n `leaflet tile is ${tileSize.y} x ${tileSize.x} pixels</br>\r\n covering ${reqBBox[0].toPrecision(6)},${reqBBox[1].toPrecision(6)} to ${reqBBox[2].toPrecision(6)},${reqBBox[3].toPrecision(6)}</br>\r\n req res: ${resolution[0].toPrecision(4)} ${resolution[1].toPrecision(4)}</br>\r\n got res: ${res[0].toPrecision(4)} ${res[1].toPrecision(4)}</br>\r\n fetched grid is ${dims[0]} x ${dims[1]}, slimmed down to ${1 + imaxlat - iminlat} x ${1 + imaxlon - iminlon} points`\r\n tile.style.outline = '1px solid green'\r\n }\r\n } else if (this.conf.debug.showTileInfos) {\r\n tile.style.outline = '1px solid red'\r\n tile.innerHTML = 'no data here (grid was full of nodata)!'\r\n }\r\n } else if (this.conf.debug.showTileInfos) {\r\n tile.style.outline = '1px solid red'\r\n tile.innerHTML = 'no data here (grid source returned null grid)!'\r\n }\r\n\r\n done(null, tile)\r\n })\r\n .catch(err => {\r\n done(err, tile)\r\n throw err\r\n })\r\n\r\n return tile\r\n },\r\n\r\n onTileLoad (event) {\r\n // tile loaded\r\n const mesh = event.tile.mesh\r\n if (!mesh) return\r\n\r\n mesh.zoomLevel = event.coords.z\r\n mesh.visible = (mesh.zoomLevel === this._map.getZoom())\r\n this.pixiRoot.addChild(mesh)\r\n if (mesh.visible) {\r\n this.pixiLayer.redraw()\r\n }\r\n },\r\n\r\n onTileUnload (event) {\r\n // tile unloaded\r\n if (event.tile.fetchController) {\r\n // fetch controller still present, abort fetching underlying data\r\n event.tile.fetchController.abort()\r\n event.tile.fetchController = null\r\n }\r\n if (event.tile.mesh) {\r\n // remove and destroy tile mesh\r\n this.pixiRoot.removeChild(event.tile.mesh)\r\n if (event.tile.mesh.visible) {\r\n this.pixiLayer.redraw()\r\n }\r\n event.tile.mesh.destroy()\r\n event.tile.mesh = null\r\n }\r\n },\r\n\r\n onZoomStart (event) {\r\n // hide meshes from current zoom level\r\n // this prevents visual weirdness when zooming where\r\n // zoom level 'n' tiles are still visible\r\n // and zoom level 'n+1' are being loaded on top of them\r\n // when alpha blending is used, this is annoying\r\n const zoomLevel = this._map.getZoom()\r\n for (const mesh of this.pixiRoot.children) {\r\n if (mesh.zoomLevel === zoomLevel) mesh.visible = false\r\n }\r\n },\r\n\r\n onZoomEnd (event) {\r\n // show meshes at current zoom level\r\n // this restores visibility for meshes that may have been hidden\r\n // on zoomstart event\r\n // this is important when quickly zoomin in and out\r\n // because some meshes may not have been evicted yet\r\n const zoomLevel = this._map.getZoom()\r\n for (const mesh of this.pixiRoot.children) {\r\n if (mesh.zoomLevel === zoomLevel) mesh.visible = true\r\n }\r\n this.pixiLayer.redraw()\r\n },\r\n\r\n onDataChanged () {\r\n const bbox = this.gridSource.getBBox()\r\n if (bbox) {\r\n // allow grid layer to only request tiles located in those bounds\r\n const c1 = L.latLng(bbox[0], bbox[1])\r\n const c2 = L.latLng(bbox[2], bbox[3])\r\n this.options.bounds = L.latLngBounds(c1, c2)\r\n }\r\n\r\n // eventually, update color map\r\n this.updateColorMap()\r\n // eventually, update shader\r\n this.updateShader()\r\n\r\n // clear tiles and request again\r\n this.redraw()\r\n\r\n // play nice with color legend component\r\n if (this.colorMap) {\r\n this.fire('data')\r\n this.hasData = true\r\n }\r\n },\r\n\r\n updateColorMap () {\r\n // create color map using domain or classes\r\n // domain and classes can be specified from options\r\n // if not, domain can be gathered from grid source\r\n this.colorMap = null\r\n this.colorMapShaderCode = null\r\n\r\n let domain = null\r\n const classes = _.get(this.conf, 'chromajs.classes', null)\r\n if (!classes) {\r\n domain = _.get(this.conf, 'chromajs.domain', null)\r\n if (!domain) {\r\n domain = this.gridSource.getDataBounds()\r\n }\r\n }\r\n\r\n const invert = _.get(this.conf, 'chromajs.invertScale', false)\r\n const colors = _.get(this.conf, 'chromajs.scale', null)\r\n const scale = chroma.scale(colors)\r\n // translate to glsl style colors for shader code\r\n const glcolors = scale.colors().map(c => chroma(c).gl())\r\n\r\n if (domain) {\r\n this.colorMap = chroma.scale(colors).domain(invert ? domain.slice().reverse() : domain)\r\n this.colorMapShaderCode = buildColorMapShaderCodeFromDomain(domain, glcolors, invert)\r\n } else if (classes) {\r\n this.colorMap = chroma.scale(colors).classes(invert ? classes.slice().reverse() : classes)\r\n this.colorMapShaderCode = buildColorMapShaderCodeFromClasses(classes, glcolors, invert)\r\n } else {\r\n console.error(\"Couldn't find any domain or classes to build color map!\")\r\n }\r\n },\r\n\r\n updateShader () {\r\n const features = [\r\n // feature projecting layer position\r\n {\r\n name: 'layerPosition',\r\n varyings: ['vec2 frg_layerPosition'],\r\n vertex: {\r\n attributes: ['vec2 in_layerPosition'],\r\n uniforms: ['mat3 translationMatrix', 'mat3 projectionMatrix', 'float in_zoomLevel', 'vec4 in_layerOffsetScale'],\r\n functions: [WEBGL_FUNCTIONS.latLonToWebMercator, WEBGL_FUNCTIONS.unpack2],\r\n code: ` frg_layerPosition = unpack2(in_layerPosition, in_layerOffsetScale);\r\n vec2 projected = latLonToWebMercator(vec3(frg_layerPosition, in_zoomLevel));\r\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(projected, 1.0)).xy, 0.0, 1.0);`\r\n },\r\n fragment: {\r\n uniforms: ['vec4 in_layerBounds'],\r\n code: ` bvec4 outside = bvec4(lessThan(frg_layerPosition, in_layerBounds.xy), greaterThan(frg_layerPosition, in_layerBounds.zw));\r\n if (any(outside)) discard;`\r\n }\r\n },\r\n // feature defining layer's scalar value\r\n {\r\n name: 'layerValue',\r\n varyings: ['float frg_layerValue'],\r\n vertex: {\r\n attributes: ['float in_layerValue'],\r\n code: ' frg_layerValue = in_layerValue;'\r\n }\r\n }\r\n ]\r\n\r\n // feature discarding fragments when scalar value is > threshold\r\n if (this.conf.render.cutOver) {\r\n features.push({\r\n name: 'cutOver',\r\n fragment: {\r\n uniforms: ['float in_cutOver'],\r\n code: ' if (frg_layerValue > in_cutOver) discard;'\r\n }\r\n })\r\n }\r\n // feature discarding fragments when scalar value is < threshold\r\n if (this.conf.render.cutUnder) {\r\n features.push({\r\n name: 'cutUnder',\r\n fragment: {\r\n uniforms: ['float in_cutUnder'],\r\n code: ' if (frg_layerValue < in_cutUnder) discard;'\r\n }\r\n })\r\n }\r\n // feature discarding fragments when scalar value is nodata\r\n if (this.gridSource.supportsNoData()) {\r\n features.push({\r\n name: 'nodata',\r\n varyings: ['float frg_validValue'],\r\n vertex: {\r\n uniforms: ['float in_nodata'],\r\n code: ' frg_validValue = (in_layerValue == in_nodata ? 0.0 : 1.0);'\r\n },\r\n fragment: {\r\n code: ' if (frg_validValue != 1.0) discard;'\r\n }\r\n })\r\n }\r\n // feature performing color mapping ...\r\n if (this.colorMapShaderCode) {\r\n if (this.conf.render.pixelColorMapping) {\r\n // ... per fragment\r\n features.push({\r\n name: 'colormap',\r\n fragment: {\r\n functions: [this.colorMapShaderCode],\r\n code: ' vec4 color = ColorMap(frg_layerValue);'\r\n }\r\n })\r\n } else {\r\n // ... or per vertex\r\n features.push({\r\n name: 'colormap',\r\n varyings: ['vec4 frg_color'],\r\n vertex: {\r\n functions: [this.colorMapShaderCode],\r\n code: ' frg_color = ColorMap(frg_layerValue);'\r\n },\r\n fragment: {\r\n code: ' vec4 color = frg_color;'\r\n }\r\n })\r\n }\r\n } else {\r\n // .. no color map code provided, issue unique color\r\n features.push({\r\n name: 'colormap',\r\n varyings: ['vec4 frg_color'],\r\n vertex: {\r\n code: ' frg_color = vec4(1.0, 0.521, 0.105, 1.1);'\r\n },\r\n fragment: {\r\n code: ' vec4 color = frg_color;'\r\n }\r\n })\r\n }\r\n // feature computing final fragment color\r\n features.push({\r\n name: 'tail',\r\n fragment: {\r\n uniforms: ['float in_layerAlpha'],\r\n code: ` gl_FragColor.rgb = color.rgb * in_layerAlpha;\r\n gl_FragColor.a = in_layerAlpha;`\r\n }\r\n })\r\n\r\n const [vtxCode, frgCode] = buildShaderCode(features)\r\n this.program = new PIXI.Program(vtxCode, frgCode)\r\n\r\n if (this.conf.debug.showShader) {\r\n console.log('Generated vertex shader:')\r\n console.log(vtxCode)\r\n console.log('Generated fragment shader:')\r\n console.log(frgCode)\r\n }\r\n },\r\n\r\n renderPixiLayer (utils) {\r\n const renderer = utils.getRenderer()\r\n renderer.render(this.pixiRoot)\r\n },\r\n\r\n setLevel (value) {\r\n if (this.cutValueUniform) {\r\n this.layerUniforms.uniforms[this.cutValueUniform] = value\r\n this.pixiLayer.redraw()\r\n } else if (typeof this.gridSource.setLevel === 'function') {\r\n this._resetView()\r\n this.gridSource.setLevel(value)\r\n }\r\n },\r\n\r\n setTime (time) {\r\n if (typeof this.gridSource.setTime === 'function') {\r\n this._resetView()\r\n this.gridSource.setTime(time)\r\n }\r\n },\r\n\r\n setModel (model) {\r\n if (typeof this.gridSource.setModel === 'function') {\r\n this._resetView()\r\n this.gridSource.setModel(model)\r\n }\r\n },\r\n\r\n getBounds () {\r\n const bounds = this.options.bounds ? this.options.bounds : L.latLngBounds(L.latLng(-90, -180), L.latLng(90, 180))\r\n return this._map ? this._map.wrapLatLngBounds(bounds) : bounds\r\n }\r\n})\r\n\r\nexport { TiledMeshLayer }\r\n"]}
1
+ {"version":3,"sources":["../../../../map/client/leaflet/TiledMeshLayer.js"],"names":["PIXI","TiledMeshLayer","L","GridLayer","extend","initialize","options","gridSource","conf","chromajs","render","cutOver","cutUnder","pixelColorMapping","showWireframe","enableCulling","_","get","debug","showTileInfos","meshAsPoints","showShader","resolutionScale","prototype","call","pixiRoot","Container","pixiLayer","pixiOverlay","utils","renderPixiLayer","destroyInteractionManager","shouldRedrawOnMove","layerUniforms","UniformGroup","in_layerAlpha","opacity","in_zoomLevel","pixiState","State","culling","blendMode","BLEND_MODES","SCREEN","cutValueUniform","uniforms","in_cutOver","in_cutUnder","on","event","onTileLoad","onTileUnload","onDataChangedCallback","onDataChanged","bind","onAdd","map","addLayer","_initialZoom","zoomStartCallback","onZoomStart","zoomEndCallback","onZoomEnd","onRemove","off","removeLayer","createTile","coords","done","tile","document","createElement","bounds","_tileCoordsToBounds","reqBBox","getSouth","getWest","getNorth","getEast","tileSize","getTileSize","resolution","y","x","fetchController","AbortController","fetch","signal","then","grid","hasData","minLat","minLon","deltaLat","deltaLon","genCoordsBuffer","values","genValuesBuffer","indexes","genMeshIndexBuffer","geometry","Geometry","addAttribute","TYPES","HALF_FLOAT_VERTEX","FLOAT","addIndex","in_layerBounds","Float32Array","from","in_layerOffsetScale","of","nodata","undefined","in_nodata","shader","Shader","program","mode","DRAW_MODES","POINTS","TRIANGLE_STRIP","mesh","Mesh","wireframeGeometry","getBuffer","genWireframeIndexBuffer","wireframeShader","wireframeProgram","wireframe","LINE_STRIP","innerHTML","toPrecision","length","style","outline","catch","err","zoomLevel","z","visible","_map","getZoom","addChild","redraw","abort","removeChild","destroy","child","children","bbox","getBBox","c1","latLng","c2","latLngBounds","updateColorMap","updateShader","colorMap","fire","colorMapShaderCode","domain","classes","getDataBounds","invert","colors","scale","chroma","glcolors","c","gl","slice","reverse","console","error","features","name","varyings","vertex","attributes","functions","WEBGL_FUNCTIONS","latLonToWebMercator","unpack2","code","fragment","push","supportsNoData","vtxCode","frgCode","Program","vtxWireframe","frgWireframe","log","renderer","getRenderer","setLevel","value","_resetView","setTime","time","setModel","model","getBounds","wrapLatLngBounds"],"mappings":"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","file":"TiledMeshLayer.js","sourcesContent":["import _ from 'lodash'\r\nimport L from 'leaflet'\r\nimport chroma from 'chroma-js'\r\nimport * as PIXI from 'pixi.js'\r\nimport 'leaflet-pixi-overlay'\r\nimport 'abort-controller/polyfill'\r\n\r\nimport { buildColorMapShaderCodeFromClasses, buildColorMapShaderCodeFromDomain, buildShaderCode, WEBGL_FUNCTIONS } from '../pixi-utils'\r\n\r\nconst TiledMeshLayer = L.GridLayer.extend({\r\n initialize (options, gridSource) {\r\n this.conf = {}\r\n\r\n // keep color scale options\r\n this.conf.chromajs = options.chromajs\r\n // keep rendering options\r\n this.conf.render = {\r\n cutOver: options.cutOver,\r\n cutUnder: options.cutUnder,\r\n pixelColorMapping: options.pixelColorMapping,\r\n showWireframe: options.showWireframe,\r\n enableCulling: _.get(options, 'enableCulling', true)\r\n }\r\n // keep debug options\r\n this.conf.debug = {\r\n showTileInfos: options.showTileInfos,\r\n meshAsPoints: options.meshAsPoints,\r\n showShader: options.showShader\r\n }\r\n this.conf.resolutionScale = _.get(options, 'resolutionScale', [1.0, 1.0])\r\n\r\n // initialize grid layer\r\n L.GridLayer.prototype.initialize.call(this, options)\r\n\r\n // setup pixi objects\r\n this.pixiRoot = new PIXI.Container()\r\n this.pixiLayer = L.pixiOverlay(\r\n utils => this.renderPixiLayer(utils),\r\n this.pixiRoot,\r\n { destroyInteractionManager: true, shouldRedrawOnMove: function () { return true } })\r\n this.layerUniforms = new PIXI.UniformGroup({ in_layerAlpha: options.opacity, in_zoomLevel: 1.0 })\r\n this.pixiState = new PIXI.State()\r\n this.pixiState.culling = this.conf.render.enableCulling\r\n this.pixiState.blendMode = PIXI.BLEND_MODES.SCREEN\r\n\r\n // setup layer global uniforms (as opposed to tile specific uniforms)\r\n this.cutValueUniform = null\r\n if (options.cutOver) {\r\n this.layerUniforms.uniforms.in_cutOver = 0.0\r\n if (options.cutOver === 'levels') {\r\n this.cutValueUniform = 'in_cutOver'\r\n } else {\r\n this.layerUniforms.uniforms.in_cutOver = options.cutOver\r\n }\r\n }\r\n if (options.cutUnder) {\r\n this.layerUniforms.uniforms.in_cutUnder = 0.0\r\n if (options.cutUnder === 'levels') {\r\n this.cutValueUniform = 'in_cutUnder'\r\n } else {\r\n this.layerUniforms.uniforms.in_cutUnder = options.cutUnder\r\n }\r\n }\r\n\r\n // register event callbacks\r\n this.on('tileload', (event) => { this.onTileLoad(event) })\r\n this.on('tileunload', (event) => { this.onTileUnload(event) })\r\n\r\n this.gridSource = gridSource\r\n // keep ref on callback to be able to remove it\r\n this.onDataChangedCallback = this.onDataChanged.bind(this)\r\n this.gridSource.on('data-changed', this.onDataChangedCallback)\r\n },\r\n\r\n onAdd (map) {\r\n map.addLayer(this.pixiLayer)\r\n\r\n // This gets computed by pixi layer when it gets added to a map.\r\n // This uniform is supposed to reflect the visualization zoom level\r\n // to correctly project from wgs84 to web mercator in the shader\r\n // BUT since pixi already handles zoom with the container's scale matrix\r\n // we use the constant zoom level that was defined when the pixi layer\r\n // was added to the map.\r\n this.layerUniforms.uniforms.in_zoomLevel = this.pixiLayer._initialZoom\r\n\r\n // be notified when zoom starts\r\n // keep a ref on bound objects to be able to remove them later\r\n this.zoomStartCallback = this.onZoomStart.bind(this)\r\n this.zoomEndCallback = this.onZoomEnd.bind(this)\r\n map.on('zoomstart', this.zoomStartCallback)\r\n map.on('zoomend', this.zoomEndCallback)\r\n\r\n L.GridLayer.prototype.onAdd.call(this, map)\r\n },\r\n\r\n onRemove (map) {\r\n // remove map listeners\r\n map.off('zoomstart', this.zoomStartCallback)\r\n map.off('zoomend', this.zoomEndCallback)\r\n this.zoomStartCallback = null\r\n this.zoomEndCallback = null\r\n\r\n map.removeLayer(this.pixiLayer)\r\n\r\n L.GridLayer.prototype.onRemove.call(this, map)\r\n },\r\n\r\n createTile (coords, done) {\r\n const tile = document.createElement('div')\r\n\r\n // bbox we'll request to the grid source\r\n const bounds = this._tileCoordsToBounds(coords)\r\n const reqBBox = [bounds.getSouth(), bounds.getWest(), bounds.getNorth(), bounds.getEast()]\r\n // compute an ideal resolution for grid sources that care\r\n const tileSize = this.getTileSize()\r\n const resolution = [\r\n this.conf.resolutionScale[0] * ((reqBBox[2] - reqBBox[0]) / (tileSize.y - 1)),\r\n this.conf.resolutionScale[1] * ((reqBBox[3] - reqBBox[1]) / (tileSize.x - 1))\r\n ]\r\n tile.fetchController = new AbortController()\r\n\r\n // request data\r\n this.gridSource.fetch(tile.fetchController.signal, reqBBox, resolution)\r\n .then(grid => {\r\n // fetch ended, can't abort anymore\r\n tile.fetchController = null\r\n\r\n if (grid) {\r\n if (grid.hasData()) {\r\n const { coords, minLat, minLon, deltaLat, deltaLon } = grid.genCoordsBuffer()\r\n const values = grid.genValuesBuffer()\r\n const indexes = grid.genMeshIndexBuffer()\r\n const geometry = new PIXI.Geometry()\r\n .addAttribute('in_layerCoord', coords, 2, false, PIXI.TYPES.HALF_FLOAT_VERTEX)\r\n .addAttribute('in_layerValue', values, 1, false, PIXI.TYPES.FLOAT)\r\n .addIndex(indexes)\r\n\r\n // compute tile specific uniforms\r\n const uniforms = {\r\n in_layerBounds: Float32Array.from(reqBBox),\r\n in_layerOffsetScale: Float32Array.of(minLat, minLon, deltaLat, deltaLon),\r\n layerUniforms: this.layerUniforms\r\n }\r\n if (grid.nodata !== undefined) {\r\n uniforms.in_nodata = grid.nodata\r\n }\r\n\r\n const shader = new PIXI.Shader(this.program, uniforms)\r\n const mode = this.conf.debug.meshAsPoints ? PIXI.DRAW_MODES.POINTS : PIXI.DRAW_MODES.TRIANGLE_STRIP\r\n tile.mesh = new PIXI.Mesh(geometry, shader, this.pixiState, mode)\r\n\r\n if (this.conf.render.showWireframe) {\r\n const wireframeGeometry = new PIXI.Geometry()\r\n .addAttribute('in_layerCoord', geometry.getBuffer('in_layerCoord'), 2, false, PIXI.TYPES.HALF_FLOAT_VERTEX)\r\n .addIndex(grid.genWireframeIndexBuffer())\r\n const wireframeShader = new PIXI.Shader(this.wireframeProgram, uniforms)\r\n tile.wireframe = new PIXI.Mesh(wireframeGeometry, wireframeShader, this.pixiState, PIXI.DRAW_MODES.LINE_STRIP)\r\n }\r\n\r\n if (this.conf.debug.showTileInfos) {\r\n tile.innerHTML =\r\n `leaflet tile is ${tileSize.y} x ${tileSize.x} pixels</br>\r\n covering ${reqBBox[0].toPrecision(6)},${reqBBox[1].toPrecision(6)} to ${reqBBox[2].toPrecision(6)},${reqBBox[3].toPrecision(6)}</br>\r\n req res: ${resolution[0].toPrecision(4)} ${resolution[1].toPrecision(4)}</br>\r\n mesh is made of ${values.length} points`\r\n tile.style.outline = '1px solid green'\r\n }\r\n } else if (this.conf.debug.showTileInfos) {\r\n tile.style.outline = '1px solid red'\r\n tile.innerHTML = 'no data here (grid maybe full of nodata)!'\r\n }\r\n } else if (this.conf.debug.showTileInfos) {\r\n tile.style.outline = '1px solid red'\r\n tile.innerHTML = 'no data here (grid source returned null grid)!'\r\n }\r\n\r\n done(null, tile)\r\n })\r\n .catch(err => {\r\n done(err, tile)\r\n })\r\n\r\n return tile\r\n },\r\n\r\n onTileLoad (event) {\r\n // tile loaded\r\n const mesh = event.tile.mesh\r\n if (!mesh) return\r\n\r\n mesh.zoomLevel = event.coords.z\r\n mesh.visible = (mesh.zoomLevel === this._map.getZoom())\r\n this.pixiRoot.addChild(mesh)\r\n\r\n if (this.conf.render.showWireframe) {\r\n const wireframe = event.tile.wireframe\r\n wireframe.zoomLevel = mesh.zoomLevel\r\n wireframe.visible = mesh.visible\r\n this.pixiRoot.addChild(wireframe)\r\n }\r\n\r\n if (mesh.visible) {\r\n this.pixiLayer.redraw()\r\n }\r\n },\r\n\r\n onTileUnload (event) {\r\n // tile unloaded\r\n if (event.tile.fetchController) {\r\n // fetch controller still present, abort fetching underlying data\r\n event.tile.fetchController.abort()\r\n event.tile.fetchController = null\r\n }\r\n if (event.tile.mesh) {\r\n // remove and destroy tile mesh\r\n this.pixiRoot.removeChild(event.tile.mesh)\r\n\r\n if (this.conf.render.showWireframe) {\r\n this.pixiRoot.removeChild(event.tile.wireframe)\r\n event.tile.wireframe.destroy()\r\n event.tile.wireframe = null\r\n }\r\n\r\n if (event.tile.mesh.visible) {\r\n this.pixiLayer.redraw()\r\n }\r\n event.tile.mesh.destroy()\r\n event.tile.mesh = null\r\n }\r\n },\r\n\r\n onZoomStart (event) {\r\n // hide meshes from current zoom level\r\n // this prevents visual weirdness when zooming where\r\n // zoom level 'n' tiles are still visible\r\n // and zoom level 'n+1' are being loaded on top of them\r\n // when alpha blending is used, this is annoying\r\n const zoomLevel = this._map.getZoom()\r\n for (const child of this.pixiRoot.children) {\r\n if (child.zoomLevel === zoomLevel) child.visible = false\r\n }\r\n },\r\n\r\n onZoomEnd (event) {\r\n // show meshes at current zoom level\r\n // this restores visibility for meshes that may have been hidden\r\n // on zoomstart event\r\n // this is important when quickly zoomin in and out\r\n // because some meshes may not have been evicted yet\r\n const zoomLevel = this._map.getZoom()\r\n for (const child of this.pixiRoot.children) {\r\n if (child.zoomLevel === zoomLevel) child.visible = true\r\n }\r\n this.pixiLayer.redraw()\r\n },\r\n\r\n onDataChanged () {\r\n const bbox = this.gridSource.getBBox()\r\n if (bbox) {\r\n // allow grid layer to only request tiles located in those bounds\r\n const c1 = L.latLng(bbox[0], bbox[1])\r\n const c2 = L.latLng(bbox[2], bbox[3])\r\n this.options.bounds = L.latLngBounds(c1, c2)\r\n }\r\n\r\n // eventually, update color map\r\n this.updateColorMap()\r\n // eventually, update shader\r\n this.updateShader()\r\n\r\n // clear tiles and request again\r\n this.redraw()\r\n\r\n // play nice with color legend component\r\n if (this.colorMap) {\r\n this.fire('data')\r\n this.hasData = true\r\n }\r\n },\r\n\r\n updateColorMap () {\r\n // create color map using domain or classes\r\n // domain and classes can be specified from options\r\n // if not, domain can be gathered from grid source\r\n this.colorMap = null\r\n this.colorMapShaderCode = null\r\n\r\n let domain = null\r\n const classes = _.get(this.conf, 'chromajs.classes', null)\r\n if (!classes) {\r\n domain = _.get(this.conf, 'chromajs.domain', null)\r\n if (!domain) {\r\n domain = this.gridSource.getDataBounds()\r\n }\r\n }\r\n\r\n const invert = _.get(this.conf, 'chromajs.invertScale', false)\r\n const colors = _.get(this.conf, 'chromajs.scale', null)\r\n const scale = chroma.scale(colors)\r\n // translate to glsl style colors for shader code\r\n const glcolors = scale.colors().map(c => chroma(c).gl())\r\n\r\n if (domain) {\r\n this.colorMap = chroma.scale(colors).domain(invert ? domain.slice().reverse() : domain)\r\n this.colorMapShaderCode = buildColorMapShaderCodeFromDomain(domain, glcolors, invert)\r\n } else if (classes) {\r\n this.colorMap = chroma.scale(colors).classes(invert ? classes.slice().reverse() : classes)\r\n this.colorMapShaderCode = buildColorMapShaderCodeFromClasses(classes, glcolors, invert)\r\n } else {\r\n console.error(\"Couldn't find any domain or classes to build color map!\")\r\n }\r\n },\r\n\r\n updateShader () {\r\n const features = [\r\n // feature projecting layer position\r\n {\r\n name: 'layerCoord',\r\n varyings: ['vec2 frg_layerCoord'],\r\n vertex: {\r\n attributes: ['vec2 in_layerCoord'],\r\n uniforms: ['mat3 translationMatrix', 'mat3 projectionMatrix', 'float in_zoomLevel', 'vec4 in_layerOffsetScale'],\r\n functions: [WEBGL_FUNCTIONS.latLonToWebMercator, WEBGL_FUNCTIONS.unpack2],\r\n code: ` frg_layerCoord = unpack2(in_layerCoord, in_layerOffsetScale);\r\n vec2 projected = latLonToWebMercator(vec3(frg_layerCoord, in_zoomLevel));\r\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(projected, 1.0)).xy, 0.0, 1.0);\r\n ${this.conf.debug.meshAsPoints ? 'gl_PointSize = 10.0;' : ''}`\r\n },\r\n fragment: {\r\n uniforms: ['vec4 in_layerBounds'],\r\n code: ` bvec4 outside = bvec4(lessThan(frg_layerCoord, in_layerBounds.xy), greaterThan(frg_layerCoord, in_layerBounds.zw));\r\n if (any(outside)) discard;`\r\n }\r\n },\r\n // feature defining layer's scalar value\r\n {\r\n name: 'layerValue',\r\n varyings: ['float frg_layerValue'],\r\n vertex: {\r\n attributes: ['float in_layerValue'],\r\n code: ' frg_layerValue = in_layerValue;'\r\n }\r\n }\r\n ]\r\n\r\n // feature discarding fragments when scalar value is > threshold\r\n if (this.conf.render.cutOver) {\r\n features.push({\r\n name: 'cutOver',\r\n fragment: {\r\n uniforms: ['float in_cutOver'],\r\n code: ' if (frg_layerValue > in_cutOver) discard;'\r\n }\r\n })\r\n }\r\n // feature discarding fragments when scalar value is < threshold\r\n if (this.conf.render.cutUnder) {\r\n features.push({\r\n name: 'cutUnder',\r\n fragment: {\r\n uniforms: ['float in_cutUnder'],\r\n code: ' if (frg_layerValue < in_cutUnder) discard;'\r\n }\r\n })\r\n }\r\n // feature discarding fragments when scalar value is nodata\r\n if (this.gridSource.supportsNoData()) {\r\n features.push({\r\n name: 'nodata',\r\n varyings: ['float frg_validValue'],\r\n vertex: {\r\n uniforms: ['float in_nodata'],\r\n code: ' frg_validValue = (in_layerValue == in_nodata ? 0.0 : 1.0);'\r\n },\r\n fragment: {\r\n code: ' if (frg_validValue != 1.0) discard;'\r\n }\r\n })\r\n }\r\n // feature performing color mapping ...\r\n if (this.colorMapShaderCode) {\r\n if (this.conf.render.pixelColorMapping) {\r\n // ... per fragment\r\n features.push({\r\n name: 'colormap',\r\n fragment: {\r\n functions: [this.colorMapShaderCode],\r\n code: ' vec4 color = ColorMap(frg_layerValue);'\r\n }\r\n })\r\n } else {\r\n // ... or per vertex\r\n features.push({\r\n name: 'colormap',\r\n varyings: ['vec4 frg_color'],\r\n vertex: {\r\n functions: [this.colorMapShaderCode],\r\n code: ' frg_color = ColorMap(frg_layerValue);'\r\n },\r\n fragment: {\r\n code: ' vec4 color = frg_color;'\r\n }\r\n })\r\n }\r\n } else {\r\n // .. no color map code provided, issue unique color\r\n features.push({\r\n name: 'colormap',\r\n varyings: ['vec4 frg_color'],\r\n vertex: {\r\n code: ' frg_color = vec4(1.0, 0.521, 0.105, 1.1);'\r\n },\r\n fragment: {\r\n code: ' vec4 color = frg_color;'\r\n }\r\n })\r\n }\r\n // feature computing final fragment color\r\n features.push({\r\n name: 'tail',\r\n fragment: {\r\n uniforms: ['float in_layerAlpha'],\r\n code: ' outColor = vec4(color.rgb * in_layerAlpha, in_layerAlpha);'\r\n }\r\n })\r\n\r\n const [vtxCode, frgCode] = buildShaderCode(features)\r\n this.program = new PIXI.Program(vtxCode, frgCode)\r\n\r\n if (this.conf.render.showWireframe) {\r\n const [vtxWireframe, frgWireframe] = buildShaderCode([features[0], {\r\n name: 'tail',\r\n fragment: {\r\n uniforms: ['float in_layerAlpha'],\r\n code: ' outColor = vec4(0.0, 0.0, 0.0, in_layerAlpha);'\r\n }\r\n }])\r\n this.wireframeProgram = new PIXI.Program(vtxWireframe, frgWireframe)\r\n }\r\n\r\n if (this.conf.debug.showShader) {\r\n console.log('Generated vertex shader:')\r\n console.log(vtxCode)\r\n console.log('Generated fragment shader:')\r\n console.log(frgCode)\r\n }\r\n },\r\n\r\n renderPixiLayer (utils) {\r\n const renderer = utils.getRenderer()\r\n renderer.render(this.pixiRoot)\r\n },\r\n\r\n setLevel (value) {\r\n if (this.cutValueUniform) {\r\n this.layerUniforms.uniforms[this.cutValueUniform] = value\r\n this.pixiLayer.redraw()\r\n } else if (typeof this.gridSource.setLevel === 'function') {\r\n this._resetView()\r\n this.gridSource.setLevel(value)\r\n }\r\n },\r\n\r\n setTime (time) {\r\n if (typeof this.gridSource.setTime === 'function') {\r\n this._resetView()\r\n this.gridSource.setTime(time)\r\n }\r\n },\r\n\r\n setModel (model) {\r\n if (typeof this.gridSource.setModel === 'function') {\r\n this._resetView()\r\n this.gridSource.setModel(model)\r\n }\r\n },\r\n\r\n getBounds () {\r\n const bounds = this.options.bounds ? this.options.bounds : L.latLngBounds(L.latLng(-90, -180), L.latLng(90, 180))\r\n return this._map ? this._map.wrapLatLngBounds(bounds) : bounds\r\n }\r\n})\r\n\r\nexport { TiledMeshLayer }\r\n"]}
@@ -8,13 +8,19 @@ exports.bindLeafletEvents = bindLeafletEvents;
8
8
  exports.unbindLeafletEvents = unbindLeafletEvents;
9
9
  exports.getHtmlTable = getHtmlTable;
10
10
  exports.tile2key = tile2key;
11
+ exports.key2tile = key2tile;
11
12
  exports.tileSetContainsParent = tileSetContainsParent;
13
+ exports.getParentTileInTileSet = getParentTileInTileSet;
12
14
  exports.computeIdealMaxNativeZoom = computeIdealMaxNativeZoom;
13
15
 
14
16
  var _lodash = require('lodash');
15
17
 
16
18
  var _lodash2 = _interopRequireDefault(_lodash);
17
19
 
20
+ var _leaflet = require('leaflet');
21
+
22
+ var _leaflet2 = _interopRequireDefault(_leaflet);
23
+
18
24
  var _client = require('../../../core/client');
19
25
 
20
26
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -106,6 +112,20 @@ function tile2key(coords) {
106
112
  return coords.x * 536870912 + coords.y * 32 + coords.z;
107
113
  }
108
114
 
115
+ function key2tile(key) {
116
+ // JS Number.MAX_SAFE_INTEGER = 2^53 - 1, so 53 bits available
117
+ // put z value on 5 bits (0 - 32)
118
+ // put y value on 24 bits (0 - 16777216)
119
+ // put x value on 24 bits (0 - 16777216)
120
+ // shift y by 5 bits (* 32)
121
+ // shift x by 5+24 bits (* 536870912)
122
+ const x = Math.floor(key / 536870912);
123
+ const y = Math.floor((key - x * 536870912) / 32);
124
+ const p = _leaflet2.default.point(x, y);
125
+ p.z = key - (x * 536870912 + y * 32);
126
+ return p;
127
+ }
128
+
109
129
  function tileSetContainsParent(tileset, coords) {
110
130
  const triplet = {
111
131
  x: coords.x,
@@ -115,9 +135,7 @@ function tileSetContainsParent(tileset, coords) {
115
135
 
116
136
  while (triplet.z > 1) {
117
137
  const tilekey = tile2key(triplet);
118
- if (tileset.has(tilekey)) {
119
- return true;
120
- }
138
+ if (tileset.has(tilekey)) return true;
121
139
 
122
140
  triplet.x = Math.floor(triplet.x / 2);
123
141
  triplet.y = Math.floor(triplet.y / 2);
@@ -127,6 +145,29 @@ function tileSetContainsParent(tileset, coords) {
127
145
  return false;
128
146
  }
129
147
 
148
+ function getParentTileInTileSet(tileset, coords) {
149
+ const triplet = {
150
+ x: coords.x,
151
+ y: coords.y,
152
+ z: coords.z
153
+ };
154
+
155
+ triplet.x = Math.floor(triplet.x / 2);
156
+ triplet.y = Math.floor(triplet.y / 2);
157
+ triplet.z -= 1;
158
+
159
+ while (triplet.z > 1) {
160
+ const tilekey = tile2key(triplet);
161
+ if (tileset.has(tilekey)) return triplet;
162
+
163
+ triplet.x = Math.floor(triplet.x / 2);
164
+ triplet.y = Math.floor(triplet.y / 2);
165
+ triplet.z -= 1;
166
+ }
167
+
168
+ return undefined;
169
+ }
170
+
130
171
  function computeIdealMaxNativeZoom(gridLayer, dataSetBounds, dataSetTileSize) {
131
172
  // compute optimal maxNativeZoom value to ensure
132
173
  // the smallest leaflet tile will approximately match a dataset tile