@kalisio/kdk 2.5.2 → 2.5.3

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 (275) hide show
  1. package/core/client/components/input/KShapePicker.vue +4 -4
  2. package/coverage/core/api/application.js.html +344 -344
  3. package/coverage/core/api/authentication.js.html +79 -79
  4. package/coverage/core/api/db.js.html +167 -167
  5. package/coverage/core/api/hooks/hooks.authentication.js.html +12 -12
  6. package/coverage/core/api/hooks/hooks.authorisations.js.html +166 -163
  7. package/coverage/core/api/hooks/hooks.groups.js.html +1 -1
  8. package/coverage/core/api/hooks/hooks.logger.js.html +18 -18
  9. package/coverage/core/api/hooks/hooks.model.js.html +280 -268
  10. package/coverage/core/api/hooks/hooks.organisations.js.html +1 -1
  11. package/coverage/core/api/hooks/hooks.push.js.html +12 -12
  12. package/coverage/core/api/hooks/hooks.query.js.html +92 -92
  13. package/coverage/core/api/hooks/hooks.schemas.js.html +13 -13
  14. package/coverage/core/api/hooks/hooks.service.js.html +28 -28
  15. package/coverage/core/api/hooks/hooks.storage.js.html +7 -7
  16. package/coverage/core/api/hooks/hooks.users.js.html +48 -48
  17. package/coverage/core/api/hooks/index.html +49 -49
  18. package/coverage/core/api/hooks/index.js.html +11 -11
  19. package/coverage/core/api/index.html +42 -42
  20. package/coverage/core/api/index.js.html +22 -22
  21. package/coverage/core/api/marshall.js.html +127 -127
  22. package/coverage/core/api/models/groups.model.mongodb.js.html +1 -1
  23. package/coverage/core/api/models/index.html +1 -1
  24. package/coverage/core/api/models/messages.model.mongodb.js.html +1 -1
  25. package/coverage/core/api/models/organisations.model.mongodb.js.html +1 -1
  26. package/coverage/core/api/models/tags.model.mongodb.js.html +1 -1
  27. package/coverage/core/api/models/users.model.mongodb.js.html +11 -11
  28. package/coverage/core/api/services/account/account.hooks.js.html +42 -42
  29. package/coverage/core/api/services/account/account.service.js.html +34 -34
  30. package/coverage/core/api/services/account/index.html +1 -1
  31. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +34 -34
  32. package/coverage/core/api/services/authorisations/authorisations.service.js.html +108 -120
  33. package/coverage/core/api/services/authorisations/index.html +19 -19
  34. package/coverage/core/api/services/databases/databases.hooks.js.html +1 -1
  35. package/coverage/core/api/services/databases/databases.service.js.html +1 -1
  36. package/coverage/core/api/services/databases/index.html +1 -1
  37. package/coverage/core/api/services/groups/groups.hooks.js.html +1 -1
  38. package/coverage/core/api/services/groups/index.html +1 -1
  39. package/coverage/core/api/services/import-export/import-export.hooks.js.html +1 -1
  40. package/coverage/core/api/services/import-export/import-export.service.js.html +1 -1
  41. package/coverage/core/api/services/import-export/index.html +1 -1
  42. package/coverage/core/api/services/index.html +15 -15
  43. package/coverage/core/api/services/index.js.html +97 -85
  44. package/coverage/core/api/services/mailer/index.html +1 -1
  45. package/coverage/core/api/services/mailer/mailer.hooks.js.html +1 -1
  46. package/coverage/core/api/services/mailer/mailer.service.js.html +1 -1
  47. package/coverage/core/api/services/messages/index.html +5 -5
  48. package/coverage/core/api/services/messages/messages.hooks.js.html +11 -8
  49. package/coverage/core/api/services/organisations/index.html +1 -1
  50. package/coverage/core/api/services/organisations/organisations.hooks.js.html +1 -1
  51. package/coverage/core/api/services/organisations/organisations.service.js.html +1 -1
  52. package/coverage/core/api/services/push/index.html +1 -1
  53. package/coverage/core/api/services/push/push.hooks.js.html +1 -1
  54. package/coverage/core/api/services/push/push.service.js.html +1 -1
  55. package/coverage/core/api/services/storage/index.html +1 -1
  56. package/coverage/core/api/services/storage/storage.hooks.js.html +36 -36
  57. package/coverage/core/api/services/storage/storage.service.js.html +30 -30
  58. package/coverage/core/api/services/tags/index.html +1 -1
  59. package/coverage/core/api/services/tags/tags.hooks.js.html +1 -1
  60. package/coverage/core/api/services/users/index.html +7 -7
  61. package/coverage/core/api/services/users/users.hooks.js.html +83 -80
  62. package/coverage/core/api/services/users/users.service.js.html +4 -4
  63. package/coverage/core/api/utils.js.html +1 -1
  64. package/coverage/core/common/errors.js.html +2 -2
  65. package/coverage/core/common/index.html +30 -30
  66. package/coverage/core/common/index.js.html +11 -11
  67. package/coverage/core/common/permissions.js.html +187 -187
  68. package/coverage/core/common/schema.js.html +26 -26
  69. package/coverage/core/common/utils.js.html +61 -61
  70. package/coverage/core/common/utils.offline.js.html +6 -6
  71. package/coverage/index.html +179 -164
  72. package/coverage/lcov-report/core/api/application.js.html +344 -344
  73. package/coverage/lcov-report/core/api/authentication.js.html +79 -79
  74. package/coverage/lcov-report/core/api/db.js.html +167 -167
  75. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +12 -12
  76. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +166 -163
  77. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +1 -1
  78. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +18 -18
  79. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +280 -268
  80. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +1 -1
  81. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +12 -12
  82. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +92 -92
  83. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +13 -13
  84. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +28 -28
  85. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +7 -7
  86. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +48 -48
  87. package/coverage/lcov-report/core/api/hooks/index.html +49 -49
  88. package/coverage/lcov-report/core/api/hooks/index.js.html +11 -11
  89. package/coverage/lcov-report/core/api/index.html +42 -42
  90. package/coverage/lcov-report/core/api/index.js.html +22 -22
  91. package/coverage/lcov-report/core/api/marshall.js.html +127 -127
  92. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +1 -1
  93. package/coverage/lcov-report/core/api/models/index.html +1 -1
  94. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +1 -1
  95. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +1 -1
  96. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +1 -1
  97. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +11 -11
  98. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +42 -42
  99. package/coverage/lcov-report/core/api/services/account/account.service.js.html +34 -34
  100. package/coverage/lcov-report/core/api/services/account/index.html +1 -1
  101. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +34 -34
  102. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +108 -120
  103. package/coverage/lcov-report/core/api/services/authorisations/index.html +19 -19
  104. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +1 -1
  105. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +1 -1
  106. package/coverage/lcov-report/core/api/services/databases/index.html +1 -1
  107. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +1 -1
  108. package/coverage/lcov-report/core/api/services/groups/index.html +1 -1
  109. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +1 -1
  110. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +1 -1
  111. package/coverage/lcov-report/core/api/services/import-export/index.html +1 -1
  112. package/coverage/lcov-report/core/api/services/index.html +15 -15
  113. package/coverage/lcov-report/core/api/services/index.js.html +97 -85
  114. package/coverage/lcov-report/core/api/services/mailer/index.html +1 -1
  115. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +1 -1
  116. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +1 -1
  117. package/coverage/lcov-report/core/api/services/messages/index.html +5 -5
  118. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +11 -8
  119. package/coverage/lcov-report/core/api/services/organisations/index.html +1 -1
  120. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +1 -1
  121. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +1 -1
  122. package/coverage/lcov-report/core/api/services/push/index.html +1 -1
  123. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +1 -1
  124. package/coverage/lcov-report/core/api/services/push/push.service.js.html +1 -1
  125. package/coverage/lcov-report/core/api/services/storage/index.html +1 -1
  126. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +36 -36
  127. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +30 -30
  128. package/coverage/lcov-report/core/api/services/tags/index.html +1 -1
  129. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +1 -1
  130. package/coverage/lcov-report/core/api/services/users/index.html +7 -7
  131. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +83 -80
  132. package/coverage/lcov-report/core/api/services/users/users.service.js.html +4 -4
  133. package/coverage/lcov-report/core/api/utils.js.html +1 -1
  134. package/coverage/lcov-report/core/common/errors.js.html +2 -2
  135. package/coverage/lcov-report/core/common/index.html +30 -30
  136. package/coverage/lcov-report/core/common/index.js.html +11 -11
  137. package/coverage/lcov-report/core/common/permissions.js.html +187 -187
  138. package/coverage/lcov-report/core/common/schema.js.html +26 -26
  139. package/coverage/lcov-report/core/common/utils.js.html +61 -61
  140. package/coverage/lcov-report/core/common/utils.offline.js.html +6 -6
  141. package/coverage/lcov-report/index.html +179 -164
  142. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +348 -258
  143. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +218 -218
  144. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +795 -810
  145. package/coverage/lcov-report/map/api/hooks/index.html +54 -54
  146. package/coverage/lcov-report/map/api/hooks/index.js.html +16 -16
  147. package/coverage/lcov-report/map/api/index.html +32 -32
  148. package/coverage/lcov-report/map/api/index.js.html +46 -46
  149. package/coverage/lcov-report/map/api/marshall.js.html +72 -72
  150. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +24 -24
  151. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +69 -27
  152. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +80 -80
  153. package/coverage/lcov-report/map/api/models/index.html +69 -54
  154. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +26 -26
  155. package/coverage/lcov-report/map/api/models/styles.model.mongodb.js.html +112 -0
  156. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +136 -136
  157. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +343 -343
  158. package/coverage/lcov-report/map/api/services/alerts/index.html +32 -32
  159. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +177 -162
  160. package/coverage/lcov-report/map/api/services/catalog/index.html +21 -21
  161. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  162. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  163. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +160 -160
  164. package/coverage/lcov-report/map/api/services/features/features.service.js.html +117 -117
  165. package/coverage/lcov-report/map/api/services/features/index.html +31 -31
  166. package/coverage/lcov-report/map/api/services/index.html +21 -21
  167. package/coverage/lcov-report/map/api/services/index.js.html +404 -296
  168. package/coverage/lcov-report/map/api/services/projects/index.html +21 -21
  169. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +237 -237
  170. package/coverage/lcov-report/map/api/services/styles/index.html +116 -0
  171. package/coverage/lcov-report/map/api/services/styles/styles.hooks.js.html +196 -0
  172. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +68 -68
  173. package/coverage/lcov-report/map/common/errors.js.html +16 -16
  174. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +267 -267
  175. package/coverage/lcov-report/map/common/grid.js.html +554 -554
  176. package/coverage/lcov-report/map/common/index.html +158 -158
  177. package/coverage/lcov-report/map/common/index.js.html +68 -68
  178. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +73 -73
  179. package/coverage/lcov-report/map/common/moment-utils.js.html +18 -18
  180. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +484 -484
  181. package/coverage/lcov-report/map/common/opendap-utils.js.html +353 -353
  182. package/coverage/lcov-report/map/common/permissions.js.html +42 -36
  183. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +59 -59
  184. package/coverage/lcov-report/map/common/tms-utils.js.html +6 -6
  185. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +190 -190
  186. package/coverage/lcov-report/map/common/wcs-utils.js.html +339 -339
  187. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +345 -345
  188. package/coverage/lcov-report/map/common/wfs-utils.js.html +11 -11
  189. package/coverage/lcov-report/map/common/wms-utils.js.html +8 -8
  190. package/coverage/lcov-report/map/common/wmts-utils.js.html +7 -7
  191. package/coverage/lcov.info +7022 -5894
  192. package/coverage/map/api/hooks/hooks.catalog.js.html +348 -258
  193. package/coverage/map/api/hooks/hooks.features.js.html +218 -218
  194. package/coverage/map/api/hooks/hooks.query.js.html +795 -810
  195. package/coverage/map/api/hooks/index.html +54 -54
  196. package/coverage/map/api/hooks/index.js.html +16 -16
  197. package/coverage/map/api/index.html +32 -32
  198. package/coverage/map/api/index.js.html +46 -46
  199. package/coverage/map/api/marshall.js.html +72 -72
  200. package/coverage/map/api/models/alerts.model.mongodb.js.html +24 -24
  201. package/coverage/map/api/models/catalog.model.mongodb.js.html +69 -27
  202. package/coverage/map/api/models/features.model.mongodb.js.html +80 -80
  203. package/coverage/map/api/models/index.html +69 -54
  204. package/coverage/map/api/models/projects.model.mongodb.js.html +26 -26
  205. package/coverage/map/api/models/styles.model.mongodb.js.html +112 -0
  206. package/coverage/map/api/services/alerts/alerts.hooks.js.html +136 -136
  207. package/coverage/map/api/services/alerts/alerts.service.js.html +343 -343
  208. package/coverage/map/api/services/alerts/index.html +32 -32
  209. package/coverage/map/api/services/catalog/catalog.hooks.js.html +177 -162
  210. package/coverage/map/api/services/catalog/index.html +21 -21
  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 +160 -160
  214. package/coverage/map/api/services/features/features.service.js.html +117 -117
  215. package/coverage/map/api/services/features/index.html +31 -31
  216. package/coverage/map/api/services/index.html +21 -21
  217. package/coverage/map/api/services/index.js.html +404 -296
  218. package/coverage/map/api/services/projects/index.html +21 -21
  219. package/coverage/map/api/services/projects/projects.hooks.js.html +237 -237
  220. package/coverage/map/api/services/styles/index.html +116 -0
  221. package/coverage/map/api/services/styles/styles.hooks.js.html +196 -0
  222. package/coverage/map/common/dynamic-grid-source.js.html +68 -68
  223. package/coverage/map/common/errors.js.html +16 -16
  224. package/coverage/map/common/geotiff-grid-source.js.html +267 -267
  225. package/coverage/map/common/grid.js.html +554 -554
  226. package/coverage/map/common/index.html +158 -158
  227. package/coverage/map/common/index.js.html +68 -68
  228. package/coverage/map/common/meteo-model-grid-source.js.html +73 -73
  229. package/coverage/map/common/moment-utils.js.html +18 -18
  230. package/coverage/map/common/opendap-grid-source.js.html +484 -484
  231. package/coverage/map/common/opendap-utils.js.html +353 -353
  232. package/coverage/map/common/permissions.js.html +42 -36
  233. package/coverage/map/common/time-based-grid-source.js.html +59 -59
  234. package/coverage/map/common/tms-utils.js.html +6 -6
  235. package/coverage/map/common/wcs-grid-source.js.html +190 -190
  236. package/coverage/map/common/wcs-utils.js.html +339 -339
  237. package/coverage/map/common/weacast-grid-source.js.html +345 -345
  238. package/coverage/map/common/wfs-utils.js.html +11 -11
  239. package/coverage/map/common/wms-utils.js.html +8 -8
  240. package/coverage/map/common/wmts-utils.js.html +7 -7
  241. package/coverage/tmp/coverage-151198-1753351220086-0.json +1 -0
  242. package/coverage/tmp/coverage-151210-1753351220070-0.json +1 -0
  243. package/coverage/tmp/coverage-151221-1753351129816-0.json +1 -0
  244. package/coverage/tmp/coverage-151233-1753351129803-0.json +1 -0
  245. package/coverage/tmp/coverage-151240-1753351129770-0.json +1 -0
  246. package/coverage/tmp/coverage-151307-1753351220058-0.json +1 -0
  247. package/coverage/tmp/coverage-151319-1753351220044-0.json +1 -0
  248. package/coverage/tmp/coverage-151326-1753351220010-0.json +1 -0
  249. package/map/api/services/styles/styles.hooks.js +1 -1
  250. package/map/client/components/KLayerEditor.vue +4 -0
  251. package/map/client/components/catalog/KLayerCategories.vue +2 -0
  252. package/map/client/components/stickies/KLevelSlider.vue +10 -8
  253. package/map/client/components/styles/KStyleEditor.vue +1 -1
  254. package/map/client/components/styles/KStyleManager.vue +7 -1
  255. package/map/client/composables/highlight.js +5 -1
  256. package/map/client/i18n/map_en.json +4 -1
  257. package/map/client/i18n/map_fr.json +4 -1
  258. package/map/client/mixins/globe/mixin.geojson-layers.js +11 -5
  259. package/map/client/mixins/mixin.activity.js +9 -0
  260. package/map/client/utils/utils.layers.js +0 -2
  261. package/package.json +1 -1
  262. package/test/api/core/push.test.js +1 -1
  263. package/test/api/core/test-log-2025-02-05.log +23 -0
  264. package/test/api/core/test-log-2025-05-21.log +15 -0
  265. package/test/api/core/test-log-2025-06-25.log +9 -0
  266. package/test/api/core/test-log-2025-07-24.log +44 -0
  267. package/test/api/map/test-log-2025-05-27.log +13 -0
  268. package/test/api/map/test-log-2025-06-23.log +7 -0
  269. package/test/api/map/{test-log-2025-05-26.log → test-log-2025-07-24.log} +3 -4
  270. package/coverage/tmp/coverage-122123-1739872365211-0.json +0 -1
  271. package/coverage/tmp/coverage-122135-1739872365196-0.json +0 -1
  272. package/coverage/tmp/coverage-122146-1739872365184-0.json +0 -1
  273. package/coverage/tmp/coverage-122158-1739872365169-0.json +0 -1
  274. package/coverage/tmp/coverage-122165-1739872365141-0.json +0 -1
  275. package/test/api/core/test-log-2025-05-26.log +0 -22
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">0% </span>
26
+ <span class="strong">51.58% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/316</span>
28
+ <span class='fraction'>163/316</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
33
+ <span class="strong">53.84% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/1</span>
35
+ <span class='fraction'>14/26</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
40
+ <span class="strong">75% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/1</span>
42
+ <span class='fraction'>9/12</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">0% </span>
47
+ <span class="strong">51.58% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/316</span>
49
+ <span class='fraction'>163/316</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line low'></div>
64
+ <div class='status-line medium'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -379,7 +379,96 @@
379
379
  <a name='L314'></a><a href='#L314'>314</a>
380
380
  <a name='L315'></a><a href='#L315'>315</a>
381
381
  <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
382
+ <a name='L317'></a><a href='#L317'>317</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
383
+ <span class="cline-any cline-yes">1x</span>
384
+ <span class="cline-any cline-yes">1x</span>
385
+ <span class="cline-any cline-yes">1x</span>
386
+ <span class="cline-any cline-yes">1x</span>
387
+ <span class="cline-any cline-yes">1x</span>
388
+ <span class="cline-any cline-yes">2x</span>
389
+ <span class="cline-any cline-yes">2x</span>
390
+ <span class="cline-any cline-yes">2x</span>
391
+ <span class="cline-any cline-yes">2x</span>
392
+ <span class="cline-any cline-yes">2x</span>
393
+ <span class="cline-any cline-yes">2x</span>
394
+ <span class="cline-any cline-yes">2x</span>
395
+ <span class="cline-any cline-yes">2x</span>
396
+ <span class="cline-any cline-yes">2x</span>
397
+ <span class="cline-any cline-yes">2x</span>
398
+ <span class="cline-any cline-yes">2x</span>
399
+ <span class="cline-any cline-yes">1x</span>
400
+ <span class="cline-any cline-yes">1x</span>
401
+ <span class="cline-any cline-yes">1x</span>
402
+ <span class="cline-any cline-yes">1x</span>
403
+ <span class="cline-any cline-yes">1x</span>
404
+ <span class="cline-any cline-yes">1x</span>
405
+ <span class="cline-any cline-yes">1x</span>
406
+ <span class="cline-any cline-yes">1x</span>
407
+ <span class="cline-any cline-yes">1x</span>
408
+ <span class="cline-any cline-yes">1x</span>
409
+ <span class="cline-any cline-yes">1x</span>
410
+ <span class="cline-any cline-yes">2x</span>
411
+ <span class="cline-any cline-yes">2x</span>
412
+ <span class="cline-any cline-yes">2x</span>
413
+ <span class="cline-any cline-yes">1x</span>
414
+ <span class="cline-any cline-yes">1x</span>
415
+ <span class="cline-any cline-yes">2x</span>
416
+ <span class="cline-any cline-yes">2x</span>
417
+ <span class="cline-any cline-yes">2x</span>
418
+ <span class="cline-any cline-yes">1x</span>
419
+ <span class="cline-any cline-yes">1x</span>
420
+ <span class="cline-any cline-yes">1x</span>
421
+ <span class="cline-any cline-yes">1x</span>
422
+ <span class="cline-any cline-yes">1x</span>
423
+ <span class="cline-any cline-yes">1x</span>
424
+ <span class="cline-any cline-yes">1x</span>
425
+ <span class="cline-any cline-no">&nbsp;</span>
426
+ <span class="cline-any cline-no">&nbsp;</span>
427
+ <span class="cline-any cline-no">&nbsp;</span>
428
+ <span class="cline-any cline-yes">1x</span>
429
+ <span class="cline-any cline-no">&nbsp;</span>
430
+ <span class="cline-any cline-no">&nbsp;</span>
431
+ <span class="cline-any cline-no">&nbsp;</span>
432
+ <span class="cline-any cline-no">&nbsp;</span>
433
+ <span class="cline-any cline-yes">1x</span>
434
+ <span class="cline-any cline-yes">1x</span>
435
+ <span class="cline-any cline-yes">1x</span>
436
+ <span class="cline-any cline-yes">1x</span>
437
+ <span class="cline-any cline-yes">1x</span>
438
+ <span class="cline-any cline-yes">1x</span>
439
+ <span class="cline-any cline-yes">1x</span>
440
+ <span class="cline-any cline-yes">1x</span>
441
+ <span class="cline-any cline-yes">1x</span>
442
+ <span class="cline-any cline-yes">1x</span>
443
+ <span class="cline-any cline-yes">1x</span>
444
+ <span class="cline-any cline-yes">1x</span>
445
+ <span class="cline-any cline-yes">1x</span>
446
+ <span class="cline-any cline-yes">1x</span>
447
+ <span class="cline-any cline-yes">1x</span>
448
+ <span class="cline-any cline-yes">1x</span>
449
+ <span class="cline-any cline-yes">1x</span>
450
+ <span class="cline-any cline-yes">1x</span>
451
+ <span class="cline-any cline-yes">1x</span>
452
+ <span class="cline-any cline-yes">1x</span>
453
+ <span class="cline-any cline-yes">1x</span>
454
+ <span class="cline-any cline-yes">1x</span>
455
+ <span class="cline-any cline-yes">1x</span>
456
+ <span class="cline-any cline-yes">1x</span>
457
+ <span class="cline-any cline-yes">1x</span>
458
+ <span class="cline-any cline-yes">1x</span>
459
+ <span class="cline-any cline-yes">1x</span>
460
+ <span class="cline-any cline-yes">1x</span>
461
+ <span class="cline-any cline-yes">1x</span>
462
+ <span class="cline-any cline-yes">1x</span>
463
+ <span class="cline-any cline-yes">1x</span>
464
+ <span class="cline-any cline-yes">1x</span>
465
+ <span class="cline-any cline-yes">1x</span>
466
+ <span class="cline-any cline-yes">1x</span>
467
+ <span class="cline-any cline-yes">1x</span>
468
+ <span class="cline-any cline-yes">1x</span>
469
+ <span class="cline-any cline-yes">1x</span>
470
+ <span class="cline-any cline-yes">1x</span>
471
+ <span class="cline-any cline-yes">1x</span>
383
472
  <span class="cline-any cline-no">&nbsp;</span>
384
473
  <span class="cline-any cline-no">&nbsp;</span>
385
474
  <span class="cline-any cline-no">&nbsp;</span>
@@ -388,6 +477,39 @@
388
477
  <span class="cline-any cline-no">&nbsp;</span>
389
478
  <span class="cline-any cline-no">&nbsp;</span>
390
479
  <span class="cline-any cline-no">&nbsp;</span>
480
+ <span class="cline-any cline-yes">1x</span>
481
+ <span class="cline-any cline-yes">1x</span>
482
+ <span class="cline-any cline-yes">1x</span>
483
+ <span class="cline-any cline-yes">1x</span>
484
+ <span class="cline-any cline-yes">1x</span>
485
+ <span class="cline-any cline-yes">1x</span>
486
+ <span class="cline-any cline-yes">1x</span>
487
+ <span class="cline-any cline-yes">1x</span>
488
+ <span class="cline-any cline-yes">1x</span>
489
+ <span class="cline-any cline-yes">1x</span>
490
+ <span class="cline-any cline-yes">1x</span>
491
+ <span class="cline-any cline-yes">1x</span>
492
+ <span class="cline-any cline-yes">1x</span>
493
+ <span class="cline-any cline-yes">1x</span>
494
+ <span class="cline-any cline-yes">1x</span>
495
+ <span class="cline-any cline-yes">1x</span>
496
+ <span class="cline-any cline-yes">1x</span>
497
+ <span class="cline-any cline-yes">1x</span>
498
+ <span class="cline-any cline-yes">1x</span>
499
+ <span class="cline-any cline-yes">1x</span>
500
+ <span class="cline-any cline-yes">1x</span>
501
+ <span class="cline-any cline-yes">1x</span>
502
+ <span class="cline-any cline-yes">1x</span>
503
+ <span class="cline-any cline-yes">1x</span>
504
+ <span class="cline-any cline-yes">1x</span>
505
+ <span class="cline-any cline-yes">1x</span>
506
+ <span class="cline-any cline-yes">1x</span>
507
+ <span class="cline-any cline-yes">1x</span>
508
+ <span class="cline-any cline-yes">1x</span>
509
+ <span class="cline-any cline-yes">1x</span>
510
+ <span class="cline-any cline-yes">1x</span>
511
+ <span class="cline-any cline-yes">1x</span>
512
+ <span class="cline-any cline-yes">1x</span>
391
513
  <span class="cline-any cline-no">&nbsp;</span>
392
514
  <span class="cline-any cline-no">&nbsp;</span>
393
515
  <span class="cline-any cline-no">&nbsp;</span>
@@ -526,265 +648,143 @@
526
648
  <span class="cline-any cline-no">&nbsp;</span>
527
649
  <span class="cline-any cline-no">&nbsp;</span>
528
650
  <span class="cline-any cline-no">&nbsp;</span>
529
- <span class="cline-any cline-no">&nbsp;</span>
530
- <span class="cline-any cline-no">&nbsp;</span>
531
- <span class="cline-any cline-no">&nbsp;</span>
532
- <span class="cline-any cline-no">&nbsp;</span>
533
- <span class="cline-any cline-no">&nbsp;</span>
534
- <span class="cline-any cline-no">&nbsp;</span>
535
- <span class="cline-any cline-no">&nbsp;</span>
536
- <span class="cline-any cline-no">&nbsp;</span>
537
- <span class="cline-any cline-no">&nbsp;</span>
538
- <span class="cline-any cline-no">&nbsp;</span>
539
- <span class="cline-any cline-no">&nbsp;</span>
540
- <span class="cline-any cline-no">&nbsp;</span>
541
- <span class="cline-any cline-no">&nbsp;</span>
542
- <span class="cline-any cline-no">&nbsp;</span>
543
- <span class="cline-any cline-no">&nbsp;</span>
544
- <span class="cline-any cline-no">&nbsp;</span>
545
- <span class="cline-any cline-no">&nbsp;</span>
546
- <span class="cline-any cline-no">&nbsp;</span>
547
- <span class="cline-any cline-no">&nbsp;</span>
548
- <span class="cline-any cline-no">&nbsp;</span>
549
- <span class="cline-any cline-no">&nbsp;</span>
550
- <span class="cline-any cline-no">&nbsp;</span>
551
- <span class="cline-any cline-no">&nbsp;</span>
552
- <span class="cline-any cline-no">&nbsp;</span>
553
- <span class="cline-any cline-no">&nbsp;</span>
554
- <span class="cline-any cline-no">&nbsp;</span>
555
- <span class="cline-any cline-no">&nbsp;</span>
556
- <span class="cline-any cline-no">&nbsp;</span>
557
- <span class="cline-any cline-no">&nbsp;</span>
558
- <span class="cline-any cline-no">&nbsp;</span>
559
- <span class="cline-any cline-no">&nbsp;</span>
560
- <span class="cline-any cline-no">&nbsp;</span>
561
- <span class="cline-any cline-no">&nbsp;</span>
562
- <span class="cline-any cline-no">&nbsp;</span>
563
- <span class="cline-any cline-no">&nbsp;</span>
564
- <span class="cline-any cline-no">&nbsp;</span>
565
- <span class="cline-any cline-no">&nbsp;</span>
566
- <span class="cline-any cline-no">&nbsp;</span>
567
- <span class="cline-any cline-no">&nbsp;</span>
568
- <span class="cline-any cline-no">&nbsp;</span>
569
- <span class="cline-any cline-no">&nbsp;</span>
570
- <span class="cline-any cline-no">&nbsp;</span>
571
- <span class="cline-any cline-no">&nbsp;</span>
572
- <span class="cline-any cline-no">&nbsp;</span>
573
- <span class="cline-any cline-no">&nbsp;</span>
574
- <span class="cline-any cline-no">&nbsp;</span>
575
- <span class="cline-any cline-no">&nbsp;</span>
576
- <span class="cline-any cline-no">&nbsp;</span>
577
- <span class="cline-any cline-no">&nbsp;</span>
578
- <span class="cline-any cline-no">&nbsp;</span>
579
- <span class="cline-any cline-no">&nbsp;</span>
580
- <span class="cline-any cline-no">&nbsp;</span>
581
- <span class="cline-any cline-no">&nbsp;</span>
582
- <span class="cline-any cline-no">&nbsp;</span>
583
- <span class="cline-any cline-no">&nbsp;</span>
584
- <span class="cline-any cline-no">&nbsp;</span>
585
- <span class="cline-any cline-no">&nbsp;</span>
586
- <span class="cline-any cline-no">&nbsp;</span>
587
- <span class="cline-any cline-no">&nbsp;</span>
588
- <span class="cline-any cline-no">&nbsp;</span>
589
- <span class="cline-any cline-no">&nbsp;</span>
590
- <span class="cline-any cline-no">&nbsp;</span>
591
- <span class="cline-any cline-no">&nbsp;</span>
592
- <span class="cline-any cline-no">&nbsp;</span>
593
- <span class="cline-any cline-no">&nbsp;</span>
594
- <span class="cline-any cline-no">&nbsp;</span>
595
- <span class="cline-any cline-no">&nbsp;</span>
596
- <span class="cline-any cline-no">&nbsp;</span>
597
- <span class="cline-any cline-no">&nbsp;</span>
598
- <span class="cline-any cline-no">&nbsp;</span>
599
- <span class="cline-any cline-no">&nbsp;</span>
600
- <span class="cline-any cline-no">&nbsp;</span>
601
- <span class="cline-any cline-no">&nbsp;</span>
602
- <span class="cline-any cline-no">&nbsp;</span>
603
- <span class="cline-any cline-no">&nbsp;</span>
604
- <span class="cline-any cline-no">&nbsp;</span>
605
- <span class="cline-any cline-no">&nbsp;</span>
606
- <span class="cline-any cline-no">&nbsp;</span>
607
- <span class="cline-any cline-no">&nbsp;</span>
608
- <span class="cline-any cline-no">&nbsp;</span>
609
- <span class="cline-any cline-no">&nbsp;</span>
610
- <span class="cline-any cline-no">&nbsp;</span>
611
- <span class="cline-any cline-no">&nbsp;</span>
612
- <span class="cline-any cline-no">&nbsp;</span>
613
- <span class="cline-any cline-no">&nbsp;</span>
614
- <span class="cline-any cline-no">&nbsp;</span>
615
- <span class="cline-any cline-no">&nbsp;</span>
616
- <span class="cline-any cline-no">&nbsp;</span>
617
- <span class="cline-any cline-no">&nbsp;</span>
618
- <span class="cline-any cline-no">&nbsp;</span>
619
- <span class="cline-any cline-no">&nbsp;</span>
620
- <span class="cline-any cline-no">&nbsp;</span>
621
- <span class="cline-any cline-no">&nbsp;</span>
622
- <span class="cline-any cline-no">&nbsp;</span>
623
- <span class="cline-any cline-no">&nbsp;</span>
624
- <span class="cline-any cline-no">&nbsp;</span>
625
- <span class="cline-any cline-no">&nbsp;</span>
626
- <span class="cline-any cline-no">&nbsp;</span>
627
- <span class="cline-any cline-no">&nbsp;</span>
628
- <span class="cline-any cline-no">&nbsp;</span>
629
- <span class="cline-any cline-no">&nbsp;</span>
630
- <span class="cline-any cline-no">&nbsp;</span>
631
- <span class="cline-any cline-no">&nbsp;</span>
632
- <span class="cline-any cline-no">&nbsp;</span>
633
- <span class="cline-any cline-no">&nbsp;</span>
634
- <span class="cline-any cline-no">&nbsp;</span>
635
- <span class="cline-any cline-no">&nbsp;</span>
636
- <span class="cline-any cline-no">&nbsp;</span>
637
- <span class="cline-any cline-no">&nbsp;</span>
638
- <span class="cline-any cline-no">&nbsp;</span>
639
- <span class="cline-any cline-no">&nbsp;</span>
640
- <span class="cline-any cline-no">&nbsp;</span>
641
- <span class="cline-any cline-no">&nbsp;</span>
642
- <span class="cline-any cline-no">&nbsp;</span>
643
- <span class="cline-any cline-no">&nbsp;</span>
644
- <span class="cline-any cline-no">&nbsp;</span>
645
- <span class="cline-any cline-no">&nbsp;</span>
646
- <span class="cline-any cline-no">&nbsp;</span>
647
- <span class="cline-any cline-no">&nbsp;</span>
648
- <span class="cline-any cline-no">&nbsp;</span>
649
- <span class="cline-any cline-no">&nbsp;</span>
650
- <span class="cline-any cline-no">&nbsp;</span>
651
- <span class="cline-any cline-no">&nbsp;</span>
652
- <span class="cline-any cline-no">&nbsp;</span>
653
- <span class="cline-any cline-no">&nbsp;</span>
654
- <span class="cline-any cline-no">&nbsp;</span>
655
- <span class="cline-any cline-no">&nbsp;</span>
656
- <span class="cline-any cline-no">&nbsp;</span>
657
- <span class="cline-any cline-no">&nbsp;</span>
658
- <span class="cline-any cline-no">&nbsp;</span>
659
- <span class="cline-any cline-no">&nbsp;</span>
660
- <span class="cline-any cline-no">&nbsp;</span>
661
- <span class="cline-any cline-no">&nbsp;</span>
662
- <span class="cline-any cline-no">&nbsp;</span>
663
- <span class="cline-any cline-no">&nbsp;</span>
664
- <span class="cline-any cline-no">&nbsp;</span>
665
- <span class="cline-any cline-no">&nbsp;</span>
666
- <span class="cline-any cline-no">&nbsp;</span>
667
- <span class="cline-any cline-no">&nbsp;</span>
668
- <span class="cline-any cline-no">&nbsp;</span>
669
- <span class="cline-any cline-no">&nbsp;</span>
670
- <span class="cline-any cline-no">&nbsp;</span>
671
- <span class="cline-any cline-no">&nbsp;</span>
672
- <span class="cline-any cline-no">&nbsp;</span>
673
- <span class="cline-any cline-no">&nbsp;</span>
674
- <span class="cline-any cline-no">&nbsp;</span>
675
- <span class="cline-any cline-no">&nbsp;</span>
676
- <span class="cline-any cline-no">&nbsp;</span>
677
- <span class="cline-any cline-no">&nbsp;</span>
678
- <span class="cline-any cline-no">&nbsp;</span>
679
- <span class="cline-any cline-no">&nbsp;</span>
680
- <span class="cline-any cline-no">&nbsp;</span>
681
- <span class="cline-any cline-no">&nbsp;</span>
682
- <span class="cline-any cline-no">&nbsp;</span>
683
- <span class="cline-any cline-no">&nbsp;</span>
684
- <span class="cline-any cline-no">&nbsp;</span>
685
- <span class="cline-any cline-no">&nbsp;</span>
686
- <span class="cline-any cline-no">&nbsp;</span>
687
- <span class="cline-any cline-no">&nbsp;</span>
688
- <span class="cline-any cline-no">&nbsp;</span>
689
- <span class="cline-any cline-no">&nbsp;</span>
690
- <span class="cline-any cline-no">&nbsp;</span>
691
- <span class="cline-any cline-no">&nbsp;</span>
692
- <span class="cline-any cline-no">&nbsp;</span>
693
- <span class="cline-any cline-no">&nbsp;</span>
694
- <span class="cline-any cline-no">&nbsp;</span>
695
- <span class="cline-any cline-no">&nbsp;</span>
696
- <span class="cline-any cline-no">&nbsp;</span>
697
- <span class="cline-any cline-no">&nbsp;</span>
698
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >import _ from 'lodash'</span></span></span>
699
- <span class="cstat-no" title="statement not covered" >import moment from 'moment'</span>
700
- <span class="cstat-no" title="statement not covered" >import { unitConverters, SortOrder, GridSource, Grid1D, TiledGrid, SubGrid } from './grid.js'</span>
701
- <span class="cstat-no" title="statement not covered" ></span>
702
- <span class="cstat-no" title="statement not covered" >// computes how many equidistant points are required to generate</span>
703
- <span class="cstat-no" title="statement not covered" >// points at most every 'precision' degrees</span>
704
- <span class="cstat-no" title="statement not covered" >function additionalPointsNeeded (lat, lon1, lon2, precision) {</span>
705
- <span class="cstat-no" title="statement not covered" > /*</span>
706
- <span class="cstat-no" title="statement not covered" > const p0 = [lon1, lat]</span>
707
- <span class="cstat-no" title="statement not covered" > const p1 = [lon2, lat]</span>
708
- <span class="cstat-no" title="statement not covered" > const dist = distance(p0, p1, { units: 'kilometers' })</span>
709
- <span class="cstat-no" title="statement not covered" > */</span>
710
- <span class="cstat-no" title="statement not covered" ></span>
711
- <span class="cstat-no" title="statement not covered" > const dist = lon2 - lon1</span>
712
- <span class="cstat-no" title="statement not covered" > const num = Math.ceil(dist / precision) - 1</span>
713
- <span class="cstat-no" title="statement not covered" > return Math.max(0, num)</span>
714
- <span class="cstat-no" title="statement not covered" >}</span>
715
- <span class="cstat-no" title="statement not covered" ></span>
716
- <span class="cstat-no" title="statement not covered" >// compute a query polygon where we make sure that</span>
717
- <span class="cstat-no" title="statement not covered" >// we'll have a point at most every 'precision' degrees</span>
718
- <span class="cstat-no" title="statement not covered" >// on longitudinal segments</span>
719
- <span class="cstat-no" title="statement not covered" >function makeMongoPolygon (bbox, precision) {</span>
720
- <span class="cstat-no" title="statement not covered" > const minLatPoints = additionalPointsNeeded(bbox[0], bbox[1], bbox[3], precision)</span>
721
- <span class="cstat-no" title="statement not covered" > const maxLatPoints = additionalPointsNeeded(bbox[2], bbox[1], bbox[3], precision)</span>
722
- <span class="cstat-no" title="statement not covered" > const deltaLon = bbox[3] - bbox[1]</span>
723
- <span class="cstat-no" title="statement not covered" ></span>
724
- <span class="cstat-no" title="statement not covered" > const polygon = []</span>
725
- <span class="cstat-no" title="statement not covered" > for (let i = 0; i &lt; minLatPoints + 2; ++i) {</span>
726
- <span class="cstat-no" title="statement not covered" > const lon = bbox[1] + (i / (minLatPoints + 1)) * deltaLon</span>
727
- <span class="cstat-no" title="statement not covered" > polygon.push([lon, bbox[0]])</span>
728
- <span class="cstat-no" title="statement not covered" > }</span>
729
- <span class="cstat-no" title="statement not covered" ></span>
730
- <span class="cstat-no" title="statement not covered" > for (let i = 0; i &lt; maxLatPoints + 2; ++i) {</span>
731
- <span class="cstat-no" title="statement not covered" > const lon = bbox[3] - (i / (maxLatPoints + 1)) * deltaLon</span>
732
- <span class="cstat-no" title="statement not covered" > polygon.push([lon, bbox[2]])</span>
733
- <span class="cstat-no" title="statement not covered" > }</span>
734
- <span class="cstat-no" title="statement not covered" ></span>
735
- <span class="cstat-no" title="statement not covered" > // closing point</span>
736
- <span class="cstat-no" title="statement not covered" > polygon.push([bbox[1], bbox[0]])</span>
737
- <span class="cstat-no" title="statement not covered" ></span>
738
- <span class="cstat-no" title="statement not covered" > return polygon</span>
739
- <span class="cstat-no" title="statement not covered" >}</span>
740
- <span class="cstat-no" title="statement not covered" ></span>
741
- <span class="cstat-no" title="statement not covered" >function tile2key (x, y) {</span>
651
+ <span class="cline-any cline-yes">1x</span>
652
+ <span class="cline-any cline-yes">1x</span>
653
+ <span class="cline-any cline-yes">1x</span>
654
+ <span class="cline-any cline-yes">1x</span>
655
+ <span class="cline-any cline-yes">1x</span>
656
+ <span class="cline-any cline-yes">1x</span>
657
+ <span class="cline-any cline-yes">1x</span>
658
+ <span class="cline-any cline-yes">1x</span>
659
+ <span class="cline-any cline-yes">1x</span>
660
+ <span class="cline-any cline-yes">1x</span>
661
+ <span class="cline-any cline-yes">1x</span>
662
+ <span class="cline-any cline-yes">1x</span>
663
+ <span class="cline-any cline-yes">1x</span>
664
+ <span class="cline-any cline-yes">1x</span>
665
+ <span class="cline-any cline-yes">1x</span>
666
+ <span class="cline-any cline-yes">1x</span>
667
+ <span class="cline-any cline-yes">1x</span>
668
+ <span class="cline-any cline-yes">1x</span>
669
+ <span class="cline-any cline-yes">1x</span>
670
+ <span class="cline-any cline-yes">1x</span>
671
+ <span class="cline-any cline-yes">1x</span>
672
+ <span class="cline-any cline-yes">1x</span>
673
+ <span class="cline-any cline-yes">1x</span>
674
+ <span class="cline-any cline-yes">1x</span>
675
+ <span class="cline-any cline-yes">1x</span>
676
+ <span class="cline-any cline-yes">1x</span>
677
+ <span class="cline-any cline-yes">1x</span>
678
+ <span class="cline-any cline-yes">1x</span>
679
+ <span class="cline-any cline-yes">1x</span>
680
+ <span class="cline-any cline-yes">1x</span>
681
+ <span class="cline-any cline-yes">1x</span>
682
+ <span class="cline-any cline-yes">2x</span>
683
+ <span class="cline-any cline-yes">2x</span>
684
+ <span class="cline-any cline-yes">2x</span>
685
+ <span class="cline-any cline-yes">2x</span>
686
+ <span class="cline-any cline-yes">2x</span>
687
+ <span class="cline-any cline-yes">2x</span>
688
+ <span class="cline-any cline-yes">2x</span>
689
+ <span class="cline-any cline-yes">2x</span>
690
+ <span class="cline-any cline-yes">2x</span>
691
+ <span class="cline-any cline-yes">2x</span>
692
+ <span class="cline-any cline-yes">2x</span>
693
+ <span class="cline-any cline-yes">2x</span>
694
+ <span class="cline-any cline-yes">1x</span>
695
+ <span class="cline-any cline-yes">1x</span>
696
+ <span class="cline-any cline-yes">1x</span>
697
+ <span class="cline-any cline-yes">1x</span>
698
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import _ from 'lodash'
699
+ import moment from 'moment'
700
+ import { unitConverters, SortOrder, GridSource, Grid1D, TiledGrid, SubGrid } from './grid.js'
701
+ &nbsp;
702
+ // computes how many equidistant points are required to generate
703
+ // points at most every 'precision' degrees
704
+ function additionalPointsNeeded (lat, lon1, lon2, precision) {
705
+ /*
706
+ const p0 = [lon1, lat]
707
+ const p1 = [lon2, lat]
708
+ const dist = distance(p0, p1, { units: 'kilometers' })
709
+ */
710
+ &nbsp;
711
+ const dist = lon2 - lon1
712
+ const num = Math.ceil(dist / precision) - 1
713
+ return Math.max(0, num)
714
+ }
715
+ &nbsp;
716
+ // compute a query polygon where we make sure that
717
+ // we'll have a point at most every 'precision' degrees
718
+ // on longitudinal segments
719
+ function makeMongoPolygon (bbox, precision) {
720
+ const minLatPoints = additionalPointsNeeded(bbox[0], bbox[1], bbox[3], precision)
721
+ const maxLatPoints = additionalPointsNeeded(bbox[2], bbox[1], bbox[3], precision)
722
+ const deltaLon = bbox[3] - bbox[1]
723
+ &nbsp;
724
+ const polygon = []
725
+ for (let i = 0; i &lt; minLatPoints + 2; ++i) {
726
+ const lon = bbox[1] + (i / (minLatPoints + 1)) * deltaLon
727
+ polygon.push([lon, bbox[0]])
728
+ }
729
+ &nbsp;
730
+ for (let i = 0; i &lt; maxLatPoints + 2; ++i) {
731
+ const lon = bbox[3] - (i / (maxLatPoints + 1)) * deltaLon
732
+ polygon.push([lon, bbox[2]])
733
+ }
734
+ &nbsp;
735
+ // closing point
736
+ polygon.push([bbox[1], bbox[0]])
737
+ &nbsp;
738
+ return polygon
739
+ }
740
+ &nbsp;
741
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function tile2key (x, y) {</span></span>
742
742
  <span class="cstat-no" title="statement not covered" > return x * 4294967296 + y</span>
743
743
  <span class="cstat-no" title="statement not covered" >}</span>
744
- <span class="cstat-no" title="statement not covered" ></span>
745
- <span class="cstat-no" title="statement not covered" >function key2tile (k) {</span>
744
+ &nbsp;
745
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function key2tile (k) {</span></span>
746
746
  <span class="cstat-no" title="statement not covered" > const x = Math.floor(k / 4294967296)</span>
747
747
  <span class="cstat-no" title="statement not covered" > return [x, k - (x * 4294967296)]</span>
748
748
  <span class="cstat-no" title="statement not covered" >}</span>
749
- <span class="cstat-no" title="statement not covered" ></span>
750
- <span class="cstat-no" title="statement not covered" >export class WeacastGridSource extends GridSource {</span>
751
- <span class="cstat-no" title="statement not covered" > static getKey () {</span>
752
- <span class="cstat-no" title="statement not covered" > return 'weacast'</span>
753
- <span class="cstat-no" title="statement not covered" > }</span>
754
- <span class="cstat-no" title="statement not covered" ></span>
755
- <span class="cstat-no" title="statement not covered" > constructor (options) {</span>
756
- <span class="cstat-no" title="statement not covered" > super(options)</span>
757
- <span class="cstat-no" title="statement not covered" ></span>
758
- <span class="cstat-no" title="statement not covered" > this.api = options.weacastApi</span>
759
- <span class="cstat-no" title="statement not covered" > this.usable = false</span>
760
- <span class="cstat-no" title="statement not covered" > }</span>
761
- <span class="cstat-no" title="statement not covered" ></span>
762
- <span class="cstat-no" title="statement not covered" > getBBox () {</span>
763
- <span class="cstat-no" title="statement not covered" > return this.usable ? [this.minMaxLat[0], this.minMaxLon[0], this.minMaxLat[1], this.minMaxLon[1]] : null</span>
764
- <span class="cstat-no" title="statement not covered" > }</span>
765
- <span class="cstat-no" title="statement not covered" ></span>
766
- <span class="cstat-no" title="statement not covered" > getDataBounds () {</span>
767
- <span class="cstat-no" title="statement not covered" > return this.usable ? this.minMaxVal : null</span>
768
- <span class="cstat-no" title="statement not covered" > }</span>
769
- <span class="cstat-no" title="statement not covered" ></span>
770
- <span class="cstat-no" title="statement not covered" > async setup (config) {</span>
771
- <span class="cstat-no" title="statement not covered" > this.usable = false</span>
772
- <span class="cstat-no" title="statement not covered" > ++this.sourceKey</span>
773
- <span class="cstat-no" title="statement not covered" ></span>
774
- <span class="cstat-no" title="statement not covered" > if (!this.api) return</span>
775
- <span class="cstat-no" title="statement not covered" ></span>
776
- <span class="cstat-no" title="statement not covered" > // find the model</span>
777
- <span class="cstat-no" title="statement not covered" > const model = this.api.models.find(model =&gt; model.name === config.model)</span>
778
- <span class="cstat-no" title="statement not covered" > if (!model) return</span>
779
- <span class="cstat-no" title="statement not covered" ></span>
780
- <span class="cstat-no" title="statement not covered" > this.converter = unitConverters[config.converter]</span>
781
- <span class="cstat-no" title="statement not covered" > this.time = moment(config.forecastTime).utc().format()</span>
782
- <span class="cstat-no" title="statement not covered" > this.service = config.model + '/' + config.element</span>
783
- <span class="cstat-no" title="statement not covered" > this.lonResolution = model.tileResolution[0]</span>
784
- <span class="cstat-no" title="statement not covered" ></span>
785
- <span class="cstat-no" title="statement not covered" > this.useCache = _.get(config, 'useCache', true)</span>
786
- <span class="cstat-no" title="statement not covered" > this.maxCacheSize = _.get(config, 'maxCacheSize', 0)</span>
787
- <span class="cstat-no" title="statement not covered" > if (this.useCache) {</span>
749
+ &nbsp;
750
+ export class WeacastGridSource extends GridSource {
751
+ static getKey () {
752
+ return 'weacast'
753
+ }
754
+ &nbsp;
755
+ constructor (options) {
756
+ super(options)
757
+ &nbsp;
758
+ this.api = options.weacastApi
759
+ this.usable = false
760
+ }
761
+ &nbsp;
762
+ getBBox () {
763
+ return this.usable ? [this.minMaxLat[0], this.minMaxLon[0], this.minMaxLat[1], this.minMaxLon[1]] <span class="branch-0 cbranch-no" title="branch not covered" >: null</span>
764
+ }
765
+ &nbsp;
766
+ getDataBounds () {
767
+ return this.usable ? this.minMaxVal <span class="branch-0 cbranch-no" title="branch not covered" >: null</span>
768
+ }
769
+ &nbsp;
770
+ async setup (config) {
771
+ this.usable = false
772
+ ++this.sourceKey
773
+ &nbsp;
774
+ if (!this.api) <span class="branch-0 cbranch-no" title="branch not covered" >return</span>
775
+ &nbsp;
776
+ // find the model
777
+ const model = this.api.models.find(model =&gt; model.name === config.model)
778
+ if (!model) <span class="branch-0 cbranch-no" title="branch not covered" >return</span>
779
+ &nbsp;
780
+ this.converter = unitConverters[config.converter]
781
+ this.time = moment(config.forecastTime).utc().format()
782
+ this.service = config.model + '/' + config.element
783
+ this.lonResolution = model.tileResolution[0]
784
+ &nbsp;
785
+ this.useCache = _.get(config, 'useCache', true)
786
+ this.maxCacheSize = _.get(config, 'maxCacheSize', 0)
787
+ if (this.useCache) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
788
788
  <span class="cstat-no" title="statement not covered" > this.tileCache = new Map()</span>
789
789
  <span class="cstat-no" title="statement not covered" > this.tileCounter = 0</span>
790
790
  <span class="cstat-no" title="statement not covered" ></span>
@@ -793,39 +793,39 @@
793
793
  <span class="cstat-no" title="statement not covered" > this.wrapLon = model.bounds[2] &gt; 180.0</span>
794
794
  <span class="cstat-no" title="statement not covered" > this.maxTileX = ((model.bounds[2] - model.bounds[0]) / model.tileResolution[0]) - 1</span>
795
795
  <span class="cstat-no" title="statement not covered" > this.maxTileY = ((model.bounds[3] - model.bounds[1]) / model.tileResolution[1]) - 1</span>
796
- <span class="cstat-no" title="statement not covered" > } else {</span>
797
- <span class="cstat-no" title="statement not covered" > this.tileCache = null</span>
798
- <span class="cstat-no" title="statement not covered" > }</span>
799
- <span class="cstat-no" title="statement not covered" ></span>
800
- <span class="cstat-no" title="statement not covered" > this.minMaxLat = [model.bounds[1], model.bounds[3]]</span>
801
- <span class="cstat-no" title="statement not covered" > // Internal tile management requires longitude in [-180, 180]</span>
802
- <span class="cstat-no" title="statement not covered" > const wrapLongitude = (model.bounds[2] === 360)</span>
803
- <span class="cstat-no" title="statement not covered" > this.minMaxLon = [wrapLongitude ? -180 : model.bounds[0], wrapLongitude ? 180 : model.bounds[2]]</span>
804
- <span class="cstat-no" title="statement not covered" > this.minMaxVal = null</span>
805
- <span class="cstat-no" title="statement not covered" ></span>
806
- <span class="cstat-no" title="statement not covered" > const query = {</span>
807
- <span class="cstat-no" title="statement not covered" > time: this.time,</span>
808
- <span class="cstat-no" title="statement not covered" > $select: ['forecastTime', 'minValue', 'maxValue'],</span>
809
- <span class="cstat-no" title="statement not covered" > $paginate: false</span>
810
- <span class="cstat-no" title="statement not covered" > }</span>
811
- <span class="cstat-no" title="statement not covered" ></span>
812
- <span class="cstat-no" title="statement not covered" > const results = await this.api.getService(this.service).find({ query })</span>
813
- <span class="cstat-no" title="statement not covered" > if (results.length &gt; 0) this.minMaxVal = [results[0].minValue, results[0].maxValue]</span>
814
- <span class="cstat-no" title="statement not covered" ></span>
815
- <span class="cstat-no" title="statement not covered" > this.usable = true</span>
816
- <span class="cstat-no" title="statement not covered" ></span>
817
- <span class="cstat-no" title="statement not covered" > this.dataChanged()</span>
818
- <span class="cstat-no" title="statement not covered" > }</span>
819
- <span class="cstat-no" title="statement not covered" ></span>
820
- <span class="cstat-no" title="statement not covered" > fetch (abort, bbox, resolution) {</span>
821
- <span class="cstat-no" title="statement not covered" > if (!this.usable) { return null }</span>
822
- <span class="cstat-no" title="statement not covered" ></span>
823
- <span class="cstat-no" title="statement not covered" > return this.useCache</span>
824
- <span class="cstat-no" title="statement not covered" > ? this.fetchWithCache(abort, bbox, resolution)</span>
825
- <span class="cstat-no" title="statement not covered" > : this.fetchWithoutCache(abort, bbox, resolution)</span>
826
- <span class="cstat-no" title="statement not covered" > }</span>
827
- <span class="cstat-no" title="statement not covered" ></span>
828
- <span class="cstat-no" title="statement not covered" > async fetchWithCache (abort, bbox, resolution) {</span>
796
+ } else {
797
+ this.tileCache = null
798
+ }
799
+ &nbsp;
800
+ this.minMaxLat = [model.bounds[1], model.bounds[3]]
801
+ // Internal tile management requires longitude in [-180, 180]
802
+ const wrapLongitude = (model.bounds[2] === 360)
803
+ this.minMaxLon = [wrapLongitude ? -180 <span class="branch-0 cbranch-no" title="branch not covered" >: model.bounds[0],</span> wrapLongitude ? 180 <span class="branch-0 cbranch-no" title="branch not covered" >: model.bounds[2]]</span>
804
+ this.minMaxVal = null
805
+ &nbsp;
806
+ const query = {
807
+ time: this.time,
808
+ $select: ['forecastTime', 'minValue', 'maxValue'],
809
+ $paginate: false
810
+ }
811
+ &nbsp;
812
+ const results = await this.api.getService(this.service).find({ query })
813
+ if (results.length &gt; 0) this.minMaxVal = [results[0].minValue, results[0].maxValue]
814
+ &nbsp;
815
+ this.usable = true
816
+ &nbsp;
817
+ this.dataChanged()
818
+ }
819
+ &nbsp;
820
+ fetch (abort, bbox, resolution) {
821
+ if (!this.usable) <span class="branch-0 cbranch-no" title="branch not covered" >{ return null }</span>
822
+ &nbsp;
823
+ return this.useCache
824
+ <span class="branch-0 cbranch-no" title="branch not covered" > ? this.fetchWithCache(abort, bbox, resolution)</span>
825
+ : this.fetchWithoutCache(abort, bbox, resolution)
826
+ }
827
+ &nbsp;
828
+ <span class="fstat-no" title="function not covered" > async fetchWithCache (abort, bbox, resolution) {</span>
829
829
  <span class="cstat-no" title="statement not covered" > // compute which weacast tile(s) we're going to hit</span>
830
830
  <span class="cstat-no" title="statement not covered" > const minLon = this.wrapLon ? (bbox[1] &lt; 0 ? bbox[1] + 360.0 : bbox[1]) : bbox[1]</span>
831
831
  <span class="cstat-no" title="statement not covered" > const maxLon = this.wrapLon ? (bbox[3] &lt; 0 ? bbox[3] + 360.0 : bbox[3]) : bbox[3]</span>
@@ -964,53 +964,53 @@
964
964
  <span class="cstat-no" title="statement not covered" > const grid = allGrids.length &gt; 1 ? new TiledGrid(sourceKey, allGrids) : allGrids[0]</span>
965
965
  <span class="cstat-no" title="statement not covered" > return new SubGrid(sourceKey, grid, bbox)</span>
966
966
  <span class="cstat-no" title="statement not covered" > }</span>
967
- <span class="cstat-no" title="statement not covered" ></span>
968
- <span class="cstat-no" title="statement not covered" > async fetchWithoutCache (abort, bbox, resolution) {</span>
969
- <span class="cstat-no" title="statement not covered" > const query = {</span>
970
- <span class="cstat-no" title="statement not covered" > time: this.time,</span>
971
- <span class="cstat-no" title="statement not covered" > $select: ['forecastTime', 'data', 'geometry', 'size'],</span>
972
- <span class="cstat-no" title="statement not covered" > $paginate: false,</span>
973
- <span class="cstat-no" title="statement not covered" > // build a polygon with points longitudaly spaced every lonResolution degrees</span>
974
- <span class="cstat-no" title="statement not covered" > // otherwise mongodb will connect points using shortest path on sphere</span>
975
- <span class="cstat-no" title="statement not covered" > // which is not going to be a square lat/lon box</span>
976
- <span class="cstat-no" title="statement not covered" > geometry: {</span>
977
- <span class="cstat-no" title="statement not covered" > $geoIntersects: {</span>
978
- <span class="cstat-no" title="statement not covered" > $geometry: {</span>
979
- <span class="cstat-no" title="statement not covered" > type: 'Polygon',</span>
980
- <span class="cstat-no" title="statement not covered" > coordinates: [makeMongoPolygon(bbox, this.lonResolution)]</span>
981
- <span class="cstat-no" title="statement not covered" > }</span>
982
- <span class="cstat-no" title="statement not covered" > }</span>
983
- <span class="cstat-no" title="statement not covered" > }</span>
984
- <span class="cstat-no" title="statement not covered" > }</span>
985
- <span class="cstat-no" title="statement not covered" ></span>
986
- <span class="cstat-no" title="statement not covered" > const sourceKey = this.sourceKey</span>
987
- <span class="cstat-no" title="statement not covered" > const results = await this.api.getService(this.service).find({ query })</span>
988
- <span class="cstat-no" title="statement not covered" > if (results.length === 0) return null</span>
989
- <span class="cstat-no" title="statement not covered" ></span>
990
- <span class="cstat-no" title="statement not covered" > // This is to target raw data</span>
991
- <span class="cstat-no" title="statement not covered" > // return new Grid1D(</span>
992
- <span class="cstat-no" title="statement not covered" > // bbox, [width, height],</span>
993
- <span class="cstat-no" title="statement not covered" > // results[0].data, true, SortOrder.DESCENDING, SortOrder.ASCENDING,</span>
994
- <span class="cstat-no" title="statement not covered" > // this.nodata, this.converter)</span>
995
- <span class="cstat-no" title="statement not covered" > // This is to target tiles instead of raw data</span>
996
- <span class="cstat-no" title="statement not covered" > const tiles = []</span>
997
- <span class="cstat-no" title="statement not covered" > for (const tile of results) {</span>
998
- <span class="cstat-no" title="statement not covered" > const tileBBox = tile.geometry.coordinates[0] // BBox as a polygon</span>
999
- <span class="cstat-no" title="statement not covered" > const tileBounds = [tileBBox[0][1], tileBBox[0][0], tileBBox[2][1], tileBBox[2][0]]</span>
1000
- <span class="cstat-no" title="statement not covered" > // normalize bounds when crossing longitude 180/-180</span>
1001
- <span class="cstat-no" title="statement not covered" > if (tileBounds[1] &gt; tileBounds[3]) tileBounds[1] -= 360.0</span>
1002
- <span class="cstat-no" title="statement not covered" ></span>
1003
- <span class="cstat-no" title="statement not covered" > const grid = new Grid1D(</span>
1004
- <span class="cstat-no" title="statement not covered" > sourceKey,</span>
1005
- <span class="cstat-no" title="statement not covered" > tileBounds, tile.size,</span>
1006
- <span class="cstat-no" title="statement not covered" > tile.data, true, SortOrder.DESCENDING, SortOrder.ASCENDING,</span>
1007
- <span class="cstat-no" title="statement not covered" > this.nodata, this.converter)</span>
1008
- <span class="cstat-no" title="statement not covered" > tiles.push(grid)</span>
1009
- <span class="cstat-no" title="statement not covered" > }</span>
1010
- <span class="cstat-no" title="statement not covered" ></span>
1011
- <span class="cstat-no" title="statement not covered" > return tiles.length &gt; 1 ? new TiledGrid(sourceKey, tiles) : tiles[0]</span>
1012
- <span class="cstat-no" title="statement not covered" > }</span>
1013
- <span class="cstat-no" title="statement not covered" >}</span>
967
+ &nbsp;
968
+ async fetchWithoutCache (abort, bbox, resolution) {
969
+ const query = {
970
+ time: this.time,
971
+ $select: ['forecastTime', 'data', 'geometry', 'size'],
972
+ $paginate: false,
973
+ // build a polygon with points longitudaly spaced every lonResolution degrees
974
+ // otherwise mongodb will connect points using shortest path on sphere
975
+ // which is not going to be a square lat/lon box
976
+ geometry: {
977
+ $geoIntersects: {
978
+ $geometry: {
979
+ type: 'Polygon',
980
+ coordinates: [makeMongoPolygon(bbox, this.lonResolution)]
981
+ }
982
+ }
983
+ }
984
+ }
985
+ &nbsp;
986
+ const sourceKey = this.sourceKey
987
+ const results = await this.api.getService(this.service).find({ query })
988
+ if (results.length === 0) <span class="branch-0 cbranch-no" title="branch not covered" >return null</span>
989
+ &nbsp;
990
+ // This is to target raw data
991
+ // return new Grid1D(
992
+ // bbox, [width, height],
993
+ // results[0].data, true, SortOrder.DESCENDING, SortOrder.ASCENDING,
994
+ // this.nodata, this.converter)
995
+ // This is to target tiles instead of raw data
996
+ const tiles = []
997
+ for (const tile of results) {
998
+ const tileBBox = tile.geometry.coordinates[0] // BBox as a polygon
999
+ const tileBounds = [tileBBox[0][1], tileBBox[0][0], tileBBox[2][1], tileBBox[2][0]]
1000
+ // normalize bounds when crossing longitude 180/-180
1001
+ if (tileBounds[1] &gt; tileBounds[3]) <span class="branch-0 cbranch-no" title="branch not covered" >tileBounds[1] -= 360.0</span>
1002
+ &nbsp;
1003
+ const grid = new Grid1D(
1004
+ sourceKey,
1005
+ tileBounds, tile.size,
1006
+ tile.data, true, SortOrder.DESCENDING, SortOrder.ASCENDING,
1007
+ this.nodata, this.converter)
1008
+ tiles.push(grid)
1009
+ }
1010
+ &nbsp;
1011
+ return tiles.length &gt; 1 ? new TiledGrid(sourceKey, tiles) <span class="branch-0 cbranch-no" title="branch not covered" >: tiles[0]</span>
1012
+ }
1013
+ }
1014
1014
  &nbsp;</pre></td></tr></table></pre>
1015
1015
 
1016
1016
  <div class='push'></div><!-- for sticky footer -->
@@ -1018,7 +1018,7 @@
1018
1018
  <div class='footer quiet pad2 space-top1 center small'>
1019
1019
  Code coverage generated by
1020
1020
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1021
- at 2025-02-18T09:52:45.605Z
1021
+ at 2025-07-24T10:00:20.476Z
1022
1022
  </div>
1023
1023
  <script src="../../prettify.js"></script>
1024
1024
  <script>