@deck.gl/geo-layers 9.0.0-beta.1 → 9.0.0-beta.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 (245) hide show
  1. package/dist/dist.dev.js +2246 -3773
  2. package/dist/geo-cell-layer/GeoCellLayer.js +51 -0
  3. package/dist/geohash-layer/geohash-layer.js +19 -0
  4. package/dist/geohash-layer/geohash-utils.js +50 -0
  5. package/dist/great-circle-layer/great-circle-layer.js +12 -0
  6. package/dist/h3-layers/h3-cluster-layer.js +47 -0
  7. package/dist/h3-layers/h3-hexagon-layer.js +204 -0
  8. package/dist/h3-layers/h3-utils.js +56 -0
  9. package/dist/index.cjs +3199 -0
  10. package/dist/index.cjs.map +7 -0
  11. package/{typed → dist}/index.d.ts +5 -5
  12. package/{typed → dist}/index.d.ts.map +1 -1
  13. package/dist/index.js +36 -0
  14. package/dist/{esm/mesh-layer → mesh-layer}/mesh-layer-fragment.glsl.js +0 -1
  15. package/dist/{esm/mesh-layer → mesh-layer}/mesh-layer-vertex.glsl.js +0 -1
  16. package/dist/mesh-layer/mesh-layer.js +129 -0
  17. package/{typed → dist}/mvt-layer/coordinate-transform.d.ts +1 -1
  18. package/{typed → dist}/mvt-layer/coordinate-transform.d.ts.map +1 -1
  19. package/dist/mvt-layer/coordinate-transform.js +41 -0
  20. package/dist/mvt-layer/find-index-binary.d.ts +11 -0
  21. package/dist/mvt-layer/find-index-binary.d.ts.map +1 -0
  22. package/dist/mvt-layer/find-index-binary.js +96 -0
  23. package/{typed → dist}/mvt-layer/mvt-layer.d.ts +6 -5
  24. package/dist/mvt-layer/mvt-layer.d.ts.map +1 -0
  25. package/dist/mvt-layer/mvt-layer.js +305 -0
  26. package/dist/quadkey-layer/quadkey-layer.js +22 -0
  27. package/dist/quadkey-layer/quadkey-utils.js +26 -0
  28. package/dist/s2-layer/s2-geometry.js +123 -0
  29. package/dist/s2-layer/s2-layer.js +38 -0
  30. package/dist/s2-layer/s2-utils.js +87 -0
  31. package/{typed → dist}/terrain-layer/terrain-layer.d.ts +3 -3
  32. package/dist/terrain-layer/terrain-layer.d.ts.map +1 -0
  33. package/dist/terrain-layer/terrain-layer.js +233 -0
  34. package/dist/tile-3d-layer/tile-3d-layer.js +302 -0
  35. package/{typed → dist}/tile-layer/tile-layer.d.ts +3 -3
  36. package/dist/tile-layer/tile-layer.d.ts.map +1 -0
  37. package/dist/tile-layer/tile-layer.js +204 -0
  38. package/dist/tileset-2d/index.js +4 -0
  39. package/dist/tileset-2d/memoize.js +41 -0
  40. package/{typed → dist}/tileset-2d/tile-2d-header.d.ts +2 -1
  41. package/dist/tileset-2d/tile-2d-header.d.ts.map +1 -0
  42. package/dist/tileset-2d/tile-2d-header.js +135 -0
  43. package/{typed → dist}/tileset-2d/tile-2d-traversal.d.ts +1 -1
  44. package/{typed → dist}/tileset-2d/tile-2d-traversal.d.ts.map +1 -1
  45. package/dist/tileset-2d/tile-2d-traversal.js +182 -0
  46. package/{typed → dist}/tileset-2d/tileset-2d.d.ts +4 -4
  47. package/{typed → dist}/tileset-2d/tileset-2d.d.ts.map +1 -1
  48. package/dist/tileset-2d/tileset-2d.js +456 -0
  49. package/dist/tileset-2d/types.js +1 -0
  50. package/{typed → dist}/tileset-2d/utils.d.ts +2 -2
  51. package/dist/tileset-2d/utils.d.ts.map +1 -0
  52. package/dist/tileset-2d/utils.js +234 -0
  53. package/dist/trips-layer/trips-layer.js +93 -0
  54. package/dist/wms-layer/utils.js +13 -0
  55. package/dist/wms-layer/wms-layer.js +192 -0
  56. package/dist.min.js +27 -159
  57. package/package.json +32 -18
  58. package/src/index.ts +5 -5
  59. package/src/mvt-layer/coordinate-transform.ts +1 -1
  60. package/src/mvt-layer/find-index-binary.ts +5 -9
  61. package/src/mvt-layer/mvt-layer.ts +19 -15
  62. package/src/terrain-layer/terrain-layer.ts +13 -3
  63. package/src/tile-layer/tile-layer.ts +8 -9
  64. package/src/tileset-2d/tile-2d-header.ts +2 -1
  65. package/src/tileset-2d/tile-2d-traversal.ts +1 -1
  66. package/src/tileset-2d/tileset-2d.ts +7 -3
  67. package/src/tileset-2d/utils.ts +2 -2
  68. package/src/wms-layer/wms-layer.ts +1 -1
  69. package/dist/es5/geo-cell-layer/GeoCellLayer.js +0 -118
  70. package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +0 -1
  71. package/dist/es5/geohash-layer/geohash-layer.js +0 -67
  72. package/dist/es5/geohash-layer/geohash-layer.js.map +0 -1
  73. package/dist/es5/geohash-layer/geohash-utils.js +0 -77
  74. package/dist/es5/geohash-layer/geohash-utils.js.map +0 -1
  75. package/dist/es5/great-circle-layer/great-circle-layer.js +0 -48
  76. package/dist/es5/great-circle-layer/great-circle-layer.js.map +0 -1
  77. package/dist/es5/h3-layers/h3-cluster-layer.js +0 -162
  78. package/dist/es5/h3-layers/h3-cluster-layer.js.map +0 -1
  79. package/dist/es5/h3-layers/h3-hexagon-layer.js +0 -351
  80. package/dist/es5/h3-layers/h3-hexagon-layer.js.map +0 -1
  81. package/dist/es5/h3-layers/h3-utils.js +0 -111
  82. package/dist/es5/h3-layers/h3-utils.js.map +0 -1
  83. package/dist/es5/index.js +0 -132
  84. package/dist/es5/index.js.map +0 -1
  85. package/dist/es5/mesh-layer/mesh-layer-fragment.glsl.js +0 -9
  86. package/dist/es5/mesh-layer/mesh-layer-fragment.glsl.js.map +0 -1
  87. package/dist/es5/mesh-layer/mesh-layer-vertex.glsl.js +0 -9
  88. package/dist/es5/mesh-layer/mesh-layer-vertex.glsl.js.map +0 -1
  89. package/dist/es5/mesh-layer/mesh-layer.js +0 -217
  90. package/dist/es5/mesh-layer/mesh-layer.js.map +0 -1
  91. package/dist/es5/mvt-layer/coordinate-transform.js +0 -83
  92. package/dist/es5/mvt-layer/coordinate-transform.js.map +0 -1
  93. package/dist/es5/mvt-layer/find-index-binary.js +0 -127
  94. package/dist/es5/mvt-layer/find-index-binary.js.map +0 -1
  95. package/dist/es5/mvt-layer/mvt-layer.js +0 -533
  96. package/dist/es5/mvt-layer/mvt-layer.js.map +0 -1
  97. package/dist/es5/quadkey-layer/quadkey-layer.js +0 -72
  98. package/dist/es5/quadkey-layer/quadkey-layer.js.map +0 -1
  99. package/dist/es5/quadkey-layer/quadkey-utils.js +0 -53
  100. package/dist/es5/quadkey-layer/quadkey-utils.js.map +0 -1
  101. package/dist/es5/s2-layer/s2-geometry.js +0 -158
  102. package/dist/es5/s2-layer/s2-geometry.js.map +0 -1
  103. package/dist/es5/s2-layer/s2-layer.js +0 -67
  104. package/dist/es5/s2-layer/s2-layer.js.map +0 -1
  105. package/dist/es5/s2-layer/s2-utils.js +0 -80
  106. package/dist/es5/s2-layer/s2-utils.js.map +0 -1
  107. package/dist/es5/terrain-layer/terrain-layer.js +0 -347
  108. package/dist/es5/terrain-layer/terrain-layer.js.map +0 -1
  109. package/dist/es5/tile-3d-layer/tile-3d-layer.js +0 -511
  110. package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +0 -1
  111. package/dist/es5/tile-layer/tile-layer.js +0 -363
  112. package/dist/es5/tile-layer/tile-layer.js.map +0 -1
  113. package/dist/es5/tileset-2d/index.js +0 -66
  114. package/dist/es5/tileset-2d/index.js.map +0 -1
  115. package/dist/es5/tileset-2d/memoize.js +0 -47
  116. package/dist/es5/tileset-2d/memoize.js.map +0 -1
  117. package/dist/es5/tileset-2d/tile-2d-header.js +0 -250
  118. package/dist/es5/tileset-2d/tile-2d-header.js.map +0 -1
  119. package/dist/es5/tileset-2d/tile-2d-traversal.js +0 -256
  120. package/dist/es5/tileset-2d/tile-2d-traversal.js.map +0 -1
  121. package/dist/es5/tileset-2d/tileset-2d.js +0 -757
  122. package/dist/es5/tileset-2d/tileset-2d.js.map +0 -1
  123. package/dist/es5/tileset-2d/types.js +0 -2
  124. package/dist/es5/tileset-2d/types.js.map +0 -1
  125. package/dist/es5/tileset-2d/utils.js +0 -302
  126. package/dist/es5/tileset-2d/utils.js.map +0 -1
  127. package/dist/es5/trips-layer/trips-layer.js +0 -114
  128. package/dist/es5/trips-layer/trips-layer.js.map +0 -1
  129. package/dist/es5/wms-layer/utils.js +0 -18
  130. package/dist/es5/wms-layer/utils.js.map +0 -1
  131. package/dist/es5/wms-layer/wms-layer.js +0 -376
  132. package/dist/es5/wms-layer/wms-layer.js.map +0 -1
  133. package/dist/esm/geo-cell-layer/GeoCellLayer.js +0 -72
  134. package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +0 -1
  135. package/dist/esm/geohash-layer/geohash-layer.js +0 -26
  136. package/dist/esm/geohash-layer/geohash-layer.js.map +0 -1
  137. package/dist/esm/geohash-layer/geohash-utils.js +0 -56
  138. package/dist/esm/geohash-layer/geohash-utils.js.map +0 -1
  139. package/dist/esm/great-circle-layer/great-circle-layer.js +0 -12
  140. package/dist/esm/great-circle-layer/great-circle-layer.js.map +0 -1
  141. package/dist/esm/h3-layers/h3-cluster-layer.js +0 -79
  142. package/dist/esm/h3-layers/h3-cluster-layer.js.map +0 -1
  143. package/dist/esm/h3-layers/h3-hexagon-layer.js +0 -280
  144. package/dist/esm/h3-layers/h3-hexagon-layer.js.map +0 -1
  145. package/dist/esm/h3-layers/h3-utils.js +0 -54
  146. package/dist/esm/h3-layers/h3-utils.js.map +0 -1
  147. package/dist/esm/index.js +0 -17
  148. package/dist/esm/index.js.map +0 -1
  149. package/dist/esm/mesh-layer/mesh-layer-fragment.glsl.js.map +0 -1
  150. package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js.map +0 -1
  151. package/dist/esm/mesh-layer/mesh-layer.js +0 -178
  152. package/dist/esm/mesh-layer/mesh-layer.js.map +0 -1
  153. package/dist/esm/mvt-layer/coordinate-transform.js +0 -49
  154. package/dist/esm/mvt-layer/coordinate-transform.js.map +0 -1
  155. package/dist/esm/mvt-layer/find-index-binary.js +0 -99
  156. package/dist/esm/mvt-layer/find-index-binary.js.map +0 -1
  157. package/dist/esm/mvt-layer/mvt-layer.js +0 -427
  158. package/dist/esm/mvt-layer/mvt-layer.js.map +0 -1
  159. package/dist/esm/quadkey-layer/quadkey-layer.js +0 -31
  160. package/dist/esm/quadkey-layer/quadkey-layer.js.map +0 -1
  161. package/dist/esm/quadkey-layer/quadkey-utils.js +0 -24
  162. package/dist/esm/quadkey-layer/quadkey-utils.js.map +0 -1
  163. package/dist/esm/s2-layer/s2-geometry.js +0 -126
  164. package/dist/esm/s2-layer/s2-geometry.js.map +0 -1
  165. package/dist/esm/s2-layer/s2-layer.js +0 -26
  166. package/dist/esm/s2-layer/s2-layer.js.map +0 -1
  167. package/dist/esm/s2-layer/s2-utils.js +0 -69
  168. package/dist/esm/s2-layer/s2-utils.js.map +0 -1
  169. package/dist/esm/terrain-layer/terrain-layer.js +0 -292
  170. package/dist/esm/terrain-layer/terrain-layer.js.map +0 -1
  171. package/dist/esm/tile-3d-layer/tile-3d-layer.js +0 -438
  172. package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +0 -1
  173. package/dist/esm/tile-layer/tile-layer.js +0 -299
  174. package/dist/esm/tile-layer/tile-layer.js.map +0 -1
  175. package/dist/esm/tileset-2d/index.js +0 -4
  176. package/dist/esm/tileset-2d/index.js.map +0 -1
  177. package/dist/esm/tileset-2d/memoize.js +0 -40
  178. package/dist/esm/tileset-2d/memoize.js.map +0 -1
  179. package/dist/esm/tileset-2d/tile-2d-header.js +0 -179
  180. package/dist/esm/tileset-2d/tile-2d-header.js.map +0 -1
  181. package/dist/esm/tileset-2d/tile-2d-traversal.js +0 -184
  182. package/dist/esm/tileset-2d/tile-2d-traversal.js.map +0 -1
  183. package/dist/esm/tileset-2d/tileset-2d.js +0 -509
  184. package/dist/esm/tileset-2d/tileset-2d.js.map +0 -1
  185. package/dist/esm/tileset-2d/types.js +0 -2
  186. package/dist/esm/tileset-2d/types.js.map +0 -1
  187. package/dist/esm/tileset-2d/utils.js +0 -233
  188. package/dist/esm/tileset-2d/utils.js.map +0 -1
  189. package/dist/esm/trips-layer/trips-layer.js +0 -88
  190. package/dist/esm/trips-layer/trips-layer.js.map +0 -1
  191. package/dist/esm/wms-layer/utils.js +0 -9
  192. package/dist/esm/wms-layer/utils.js.map +0 -1
  193. package/dist/esm/wms-layer/wms-layer.js +0 -231
  194. package/dist/esm/wms-layer/wms-layer.js.map +0 -1
  195. package/typed/mvt-layer/find-index-binary.d.ts +0 -12
  196. package/typed/mvt-layer/find-index-binary.d.ts.map +0 -1
  197. package/typed/mvt-layer/mvt-layer.d.ts.map +0 -1
  198. package/typed/terrain-layer/terrain-layer.d.ts.map +0 -1
  199. package/typed/tile-layer/tile-layer.d.ts.map +0 -1
  200. package/typed/tileset-2d/tile-2d-header.d.ts.map +0 -1
  201. package/typed/tileset-2d/utils.d.ts.map +0 -1
  202. /package/{typed → dist}/geo-cell-layer/GeoCellLayer.d.ts +0 -0
  203. /package/{typed → dist}/geo-cell-layer/GeoCellLayer.d.ts.map +0 -0
  204. /package/{typed → dist}/geohash-layer/geohash-layer.d.ts +0 -0
  205. /package/{typed → dist}/geohash-layer/geohash-layer.d.ts.map +0 -0
  206. /package/{typed → dist}/geohash-layer/geohash-utils.d.ts +0 -0
  207. /package/{typed → dist}/geohash-layer/geohash-utils.d.ts.map +0 -0
  208. /package/{typed → dist}/great-circle-layer/great-circle-layer.d.ts +0 -0
  209. /package/{typed → dist}/great-circle-layer/great-circle-layer.d.ts.map +0 -0
  210. /package/{typed → dist}/h3-layers/h3-cluster-layer.d.ts +0 -0
  211. /package/{typed → dist}/h3-layers/h3-cluster-layer.d.ts.map +0 -0
  212. /package/{typed → dist}/h3-layers/h3-hexagon-layer.d.ts +0 -0
  213. /package/{typed → dist}/h3-layers/h3-hexagon-layer.d.ts.map +0 -0
  214. /package/{typed → dist}/h3-layers/h3-utils.d.ts +0 -0
  215. /package/{typed → dist}/h3-layers/h3-utils.d.ts.map +0 -0
  216. /package/{typed → dist}/mesh-layer/mesh-layer-fragment.glsl.d.ts +0 -0
  217. /package/{typed → dist}/mesh-layer/mesh-layer-fragment.glsl.d.ts.map +0 -0
  218. /package/{typed → dist}/mesh-layer/mesh-layer-vertex.glsl.d.ts +0 -0
  219. /package/{typed → dist}/mesh-layer/mesh-layer-vertex.glsl.d.ts.map +0 -0
  220. /package/{typed → dist}/mesh-layer/mesh-layer.d.ts +0 -0
  221. /package/{typed → dist}/mesh-layer/mesh-layer.d.ts.map +0 -0
  222. /package/{typed → dist}/quadkey-layer/quadkey-layer.d.ts +0 -0
  223. /package/{typed → dist}/quadkey-layer/quadkey-layer.d.ts.map +0 -0
  224. /package/{typed → dist}/quadkey-layer/quadkey-utils.d.ts +0 -0
  225. /package/{typed → dist}/quadkey-layer/quadkey-utils.d.ts.map +0 -0
  226. /package/{typed → dist}/s2-layer/s2-geometry.d.ts +0 -0
  227. /package/{typed → dist}/s2-layer/s2-geometry.d.ts.map +0 -0
  228. /package/{typed → dist}/s2-layer/s2-layer.d.ts +0 -0
  229. /package/{typed → dist}/s2-layer/s2-layer.d.ts.map +0 -0
  230. /package/{typed → dist}/s2-layer/s2-utils.d.ts +0 -0
  231. /package/{typed → dist}/s2-layer/s2-utils.d.ts.map +0 -0
  232. /package/{typed → dist}/tile-3d-layer/tile-3d-layer.d.ts +0 -0
  233. /package/{typed → dist}/tile-3d-layer/tile-3d-layer.d.ts.map +0 -0
  234. /package/{typed → dist}/tileset-2d/index.d.ts +0 -0
  235. /package/{typed → dist}/tileset-2d/index.d.ts.map +0 -0
  236. /package/{typed → dist}/tileset-2d/memoize.d.ts +0 -0
  237. /package/{typed → dist}/tileset-2d/memoize.d.ts.map +0 -0
  238. /package/{typed → dist}/tileset-2d/types.d.ts +0 -0
  239. /package/{typed → dist}/tileset-2d/types.d.ts.map +0 -0
  240. /package/{typed → dist}/trips-layer/trips-layer.d.ts +0 -0
  241. /package/{typed → dist}/trips-layer/trips-layer.d.ts.map +0 -0
  242. /package/{typed → dist}/wms-layer/utils.d.ts +0 -0
  243. /package/{typed → dist}/wms-layer/utils.d.ts.map +0 -0
  244. /package/{typed → dist}/wms-layer/wms-layer.d.ts +0 -0
  245. /package/{typed → dist}/wms-layer/wms-layer.d.ts.map +0 -0
@@ -0,0 +1,234 @@
1
+ import { getOSMTileIndices } from "./tile-2d-traversal.js";
2
+ const TILE_SIZE = 512;
3
+ const DEFAULT_EXTENT = [-Infinity, -Infinity, Infinity, Infinity];
4
+ export const urlType = {
5
+ type: 'object',
6
+ value: null,
7
+ validate: (value, propType) => (propType.optional && value === null) ||
8
+ typeof value === 'string' ||
9
+ (Array.isArray(value) && value.every(url => typeof url === 'string')),
10
+ equal: (value1, value2) => {
11
+ if (value1 === value2) {
12
+ return true;
13
+ }
14
+ if (!Array.isArray(value1) || !Array.isArray(value2)) {
15
+ return false;
16
+ }
17
+ const len = value1.length;
18
+ if (len !== value2.length) {
19
+ return false;
20
+ }
21
+ for (let i = 0; i < len; i++) {
22
+ if (value1[i] !== value2[i]) {
23
+ return false;
24
+ }
25
+ }
26
+ return true;
27
+ }
28
+ };
29
+ function transformBox(bbox, modelMatrix) {
30
+ const transformedCoords = [
31
+ // top-left
32
+ modelMatrix.transformAsPoint([bbox[0], bbox[1]]),
33
+ // top-right
34
+ modelMatrix.transformAsPoint([bbox[2], bbox[1]]),
35
+ // bottom-left
36
+ modelMatrix.transformAsPoint([bbox[0], bbox[3]]),
37
+ // bottom-right
38
+ modelMatrix.transformAsPoint([bbox[2], bbox[3]])
39
+ ];
40
+ const transformedBox = [
41
+ // Minimum x coord
42
+ Math.min(...transformedCoords.map(i => i[0])),
43
+ // Minimum y coord
44
+ Math.min(...transformedCoords.map(i => i[1])),
45
+ // Max x coord
46
+ Math.max(...transformedCoords.map(i => i[0])),
47
+ // Max y coord
48
+ Math.max(...transformedCoords.map(i => i[1]))
49
+ ];
50
+ return transformedBox;
51
+ }
52
+ function stringHash(s) {
53
+ return Math.abs(s.split('').reduce((a, b) => ((a << 5) - a + b.charCodeAt(0)) | 0, 0));
54
+ }
55
+ export function getURLFromTemplate(template, tile) {
56
+ if (!template || !template.length) {
57
+ return null;
58
+ }
59
+ const { index, id } = tile;
60
+ if (Array.isArray(template)) {
61
+ const i = stringHash(id) % template.length;
62
+ template = template[i];
63
+ }
64
+ let url = template;
65
+ for (const key of Object.keys(index)) {
66
+ const regex = new RegExp(`{${key}}`, 'g');
67
+ url = url.replace(regex, String(index[key]));
68
+ }
69
+ // Back-compatible support for {-y}
70
+ if (Number.isInteger(index.y) && Number.isInteger(index.z)) {
71
+ url = url.replace(/\{-y\}/g, String(Math.pow(2, index.z) - index.y - 1));
72
+ }
73
+ return url;
74
+ }
75
+ /**
76
+ * gets the bounding box of a viewport
77
+ */
78
+ function getBoundingBox(viewport, zRange, extent) {
79
+ let bounds;
80
+ if (zRange && zRange.length === 2) {
81
+ const [minZ, maxZ] = zRange;
82
+ const bounds0 = viewport.getBounds({ z: minZ });
83
+ const bounds1 = viewport.getBounds({ z: maxZ });
84
+ bounds = [
85
+ Math.min(bounds0[0], bounds1[0]),
86
+ Math.min(bounds0[1], bounds1[1]),
87
+ Math.max(bounds0[2], bounds1[2]),
88
+ Math.max(bounds0[3], bounds1[3])
89
+ ];
90
+ }
91
+ else {
92
+ bounds = viewport.getBounds();
93
+ }
94
+ if (!viewport.isGeospatial) {
95
+ return [
96
+ // Top corner should not be more then bottom corner in either direction
97
+ Math.max(Math.min(bounds[0], extent[2]), extent[0]),
98
+ Math.max(Math.min(bounds[1], extent[3]), extent[1]),
99
+ // Bottom corner should not be less then top corner in either direction
100
+ Math.min(Math.max(bounds[2], extent[0]), extent[2]),
101
+ Math.min(Math.max(bounds[3], extent[1]), extent[3])
102
+ ];
103
+ }
104
+ return [
105
+ Math.max(bounds[0], extent[0]),
106
+ Math.max(bounds[1], extent[1]),
107
+ Math.min(bounds[2], extent[2]),
108
+ Math.min(bounds[3], extent[3])
109
+ ];
110
+ }
111
+ /** Get culling bounds in world space */
112
+ export function getCullBounds({ viewport, z, cullRect }) {
113
+ const subViewports = viewport.subViewports || [viewport];
114
+ return subViewports.map(v => getCullBoundsInViewport(v, z || 0, cullRect));
115
+ }
116
+ function getCullBoundsInViewport(
117
+ /** Current viewport */
118
+ viewport,
119
+ /** At altitude */
120
+ z,
121
+ /** Culling rectangle in screen space */
122
+ cullRect) {
123
+ if (!Array.isArray(z)) {
124
+ const x = cullRect.x - viewport.x;
125
+ const y = cullRect.y - viewport.y;
126
+ const { width, height } = cullRect;
127
+ const unprojectOption = { targetZ: z };
128
+ const topLeft = viewport.unproject([x, y], unprojectOption);
129
+ const topRight = viewport.unproject([x + width, y], unprojectOption);
130
+ const bottomLeft = viewport.unproject([x, y + height], unprojectOption);
131
+ const bottomRight = viewport.unproject([x + width, y + height], unprojectOption);
132
+ return [
133
+ Math.min(topLeft[0], topRight[0], bottomLeft[0], bottomRight[0]),
134
+ Math.min(topLeft[1], topRight[1], bottomLeft[1], bottomRight[1]),
135
+ Math.max(topLeft[0], topRight[0], bottomLeft[0], bottomRight[0]),
136
+ Math.max(topLeft[1], topRight[1], bottomLeft[1], bottomRight[1])
137
+ ];
138
+ }
139
+ const bounds0 = getCullBoundsInViewport(viewport, z[0], cullRect);
140
+ const bounds1 = getCullBoundsInViewport(viewport, z[1], cullRect);
141
+ return [
142
+ Math.min(bounds0[0], bounds1[0]),
143
+ Math.min(bounds0[1], bounds1[1]),
144
+ Math.max(bounds0[2], bounds1[2]),
145
+ Math.max(bounds0[3], bounds1[3])
146
+ ];
147
+ }
148
+ function getIndexingCoords(bbox, scale, modelMatrixInverse) {
149
+ if (modelMatrixInverse) {
150
+ const transformedTileIndex = transformBox(bbox, modelMatrixInverse).map(i => (i * scale) / TILE_SIZE);
151
+ return transformedTileIndex;
152
+ }
153
+ return bbox.map(i => (i * scale) / TILE_SIZE);
154
+ }
155
+ function getScale(z, tileSize) {
156
+ return (Math.pow(2, z) * TILE_SIZE) / tileSize;
157
+ }
158
+ // https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Lon..2Flat._to_tile_numbers_2
159
+ export function osmTile2lngLat(x, y, z) {
160
+ const scale = getScale(z, TILE_SIZE);
161
+ const lng = (x / scale) * 360 - 180;
162
+ const n = Math.PI - (2 * Math.PI * y) / scale;
163
+ const lat = (180 / Math.PI) * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));
164
+ return [lng, lat];
165
+ }
166
+ function tile2XY(x, y, z, tileSize) {
167
+ const scale = getScale(z, tileSize);
168
+ return [(x / scale) * TILE_SIZE, (y / scale) * TILE_SIZE];
169
+ }
170
+ export function tileToBoundingBox(viewport, x, y, z, tileSize = TILE_SIZE) {
171
+ if (viewport.isGeospatial) {
172
+ const [west, north] = osmTile2lngLat(x, y, z);
173
+ const [east, south] = osmTile2lngLat(x + 1, y + 1, z);
174
+ return { west, north, east, south };
175
+ }
176
+ const [left, top] = tile2XY(x, y, z, tileSize);
177
+ const [right, bottom] = tile2XY(x + 1, y + 1, z, tileSize);
178
+ return { left, top, right, bottom };
179
+ }
180
+ function getIdentityTileIndices(viewport, z, tileSize, extent, modelMatrixInverse) {
181
+ const bbox = getBoundingBox(viewport, null, extent);
182
+ const scale = getScale(z, tileSize);
183
+ const [minX, minY, maxX, maxY] = getIndexingCoords(bbox, scale, modelMatrixInverse);
184
+ const indices = [];
185
+ /*
186
+ | TILE | TILE | TILE |
187
+ |(minX) |(maxX)
188
+ */
189
+ for (let x = Math.floor(minX); x < maxX; x++) {
190
+ for (let y = Math.floor(minY); y < maxY; y++) {
191
+ indices.push({ x, y, z });
192
+ }
193
+ }
194
+ return indices;
195
+ }
196
+ /**
197
+ * Returns all tile indices in the current viewport. If the current zoom level is smaller
198
+ * than minZoom, return an empty array. If the current zoom level is greater than maxZoom,
199
+ * return tiles that are on maxZoom.
200
+ */
201
+ // eslint-disable-next-line complexity
202
+ export function getTileIndices({ viewport, maxZoom, minZoom, zRange, extent, tileSize = TILE_SIZE, modelMatrix, modelMatrixInverse, zoomOffset = 0 }) {
203
+ let z = viewport.isGeospatial
204
+ ? Math.round(viewport.zoom + Math.log2(TILE_SIZE / tileSize)) + zoomOffset
205
+ : Math.ceil(viewport.zoom) + zoomOffset;
206
+ if (typeof minZoom === 'number' && Number.isFinite(minZoom) && z < minZoom) {
207
+ if (!extent) {
208
+ return [];
209
+ }
210
+ z = minZoom;
211
+ }
212
+ if (typeof maxZoom === 'number' && Number.isFinite(maxZoom) && z > maxZoom) {
213
+ z = maxZoom;
214
+ }
215
+ let transformedExtent = extent;
216
+ if (modelMatrix && modelMatrixInverse && extent && !viewport.isGeospatial) {
217
+ transformedExtent = transformBox(extent, modelMatrix);
218
+ }
219
+ return viewport.isGeospatial
220
+ ? getOSMTileIndices(viewport, z, zRange, extent)
221
+ : getIdentityTileIndices(viewport, z, tileSize, transformedExtent || DEFAULT_EXTENT, modelMatrixInverse);
222
+ }
223
+ /**
224
+ * Returns true if s is a valid URL template
225
+ */
226
+ export function isURLTemplate(s) {
227
+ return /(?=.*{z})(?=.*{x})(?=.*({y}|{-y}))/.test(s);
228
+ }
229
+ export function isGeoBoundingBox(v) {
230
+ return (Number.isFinite(v.west) &&
231
+ Number.isFinite(v.north) &&
232
+ Number.isFinite(v.east) &&
233
+ Number.isFinite(v.south));
234
+ }
@@ -0,0 +1,93 @@
1
+ // Copyright (c) 2015 - 2017 Uber Technologies, Inc.
2
+ //
3
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ // of this software and associated documentation files (the "Software"), to deal
5
+ // in the Software without restriction, including without limitation the rights
6
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ // copies of the Software, and to permit persons to whom the Software is
8
+ // furnished to do so, subject to the following conditions:
9
+ //
10
+ // The above copyright notice and this permission notice shall be included in
11
+ // all copies or substantial portions of the Software.
12
+ //
13
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ // THE SOFTWARE.
20
+ import { PathLayer } from '@deck.gl/layers';
21
+ const defaultProps = {
22
+ fadeTrail: true,
23
+ trailLength: { type: 'number', value: 120, min: 0 },
24
+ currentTime: { type: 'number', value: 0, min: 0 },
25
+ getTimestamps: { type: 'accessor', value: (d) => d.timestamps }
26
+ };
27
+ /** Render animated paths that represent vehicle trips. */
28
+ export default class TripsLayer extends PathLayer {
29
+ static { this.layerName = 'TripsLayer'; }
30
+ static { this.defaultProps = defaultProps; }
31
+ getShaders() {
32
+ const shaders = super.getShaders();
33
+ shaders.inject = {
34
+ 'vs:#decl': `\
35
+ uniform float trailLength;
36
+ in float instanceTimestamps;
37
+ in float instanceNextTimestamps;
38
+ out float vTime;
39
+ `,
40
+ // Timestamp of the vertex
41
+ 'vs:#main-end': `\
42
+ vTime = instanceTimestamps + (instanceNextTimestamps - instanceTimestamps) * vPathPosition.y / vPathLength;
43
+ `,
44
+ 'fs:#decl': `\
45
+ uniform bool fadeTrail;
46
+ uniform float trailLength;
47
+ uniform float currentTime;
48
+ in float vTime;
49
+ `,
50
+ // Drop the segments outside of the time window
51
+ 'fs:#main-start': `\
52
+ if(vTime > currentTime || (fadeTrail && (vTime < currentTime - trailLength))) {
53
+ discard;
54
+ }
55
+ `,
56
+ // Fade the color (currentTime - 100%, end of trail - 0%)
57
+ 'fs:DECKGL_FILTER_COLOR': `\
58
+ if(fadeTrail) {
59
+ color.a *= 1.0 - (currentTime - vTime) / trailLength;
60
+ }
61
+ `
62
+ };
63
+ return shaders;
64
+ }
65
+ initializeState() {
66
+ super.initializeState();
67
+ const attributeManager = this.getAttributeManager();
68
+ attributeManager.addInstanced({
69
+ timestamps: {
70
+ size: 1,
71
+ accessor: 'getTimestamps',
72
+ shaderAttributes: {
73
+ instanceTimestamps: {
74
+ vertexOffset: 0
75
+ },
76
+ instanceNextTimestamps: {
77
+ vertexOffset: 1
78
+ }
79
+ }
80
+ }
81
+ });
82
+ }
83
+ draw(params) {
84
+ const { fadeTrail, trailLength, currentTime } = this.props;
85
+ params.uniforms = {
86
+ ...params.uniforms,
87
+ fadeTrail,
88
+ trailLength,
89
+ currentTime
90
+ };
91
+ super.draw(params);
92
+ }
93
+ }
@@ -0,0 +1,13 @@
1
+ import { lngLatToWorld } from '@math.gl/web-mercator';
2
+ // https://epsg.io/3857
3
+ // +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs
4
+ const HALF_EARTH_CIRCUMFERENCE = 6378137 * Math.PI;
5
+ /** Projects EPSG:4326 to EPSG:3857
6
+ * This is a lightweight replacement of proj4. Use tests to ensure conformance.
7
+ */
8
+ export function WGS84ToPseudoMercator(coord) {
9
+ const mercator = lngLatToWorld(coord);
10
+ mercator[0] = (mercator[0] / 256 - 1) * HALF_EARTH_CIRCUMFERENCE;
11
+ mercator[1] = (mercator[1] / 256 - 1) * HALF_EARTH_CIRCUMFERENCE;
12
+ return mercator;
13
+ }
@@ -0,0 +1,192 @@
1
+ // deck.gl, MIT license
2
+ // Attributions:
3
+ // Copyright 2022 Foursquare Labs, Inc.
4
+ /* eslint-disable camelcase */ // Some WMS parameters are not in camel case
5
+ /* global setTimeout, clearTimeout */
6
+ import { CompositeLayer, COORDINATE_SYSTEM, _deepEqual as deepEqual } from '@deck.gl/core';
7
+ import { BitmapLayer } from '@deck.gl/layers';
8
+ import { ImageSource, createImageSource } from '@loaders.gl/wms';
9
+ import { WGS84ToPseudoMercator } from "./utils.js";
10
+ const defaultProps = {
11
+ id: 'imagery-layer',
12
+ data: '',
13
+ serviceType: 'auto',
14
+ srs: 'auto',
15
+ layers: { type: 'array', compare: true, value: [] },
16
+ onMetadataLoad: { type: 'function', value: () => { } },
17
+ // eslint-disable-next-line
18
+ onMetadataLoadError: { type: 'function', value: console.error },
19
+ onImageLoadStart: { type: 'function', value: () => { } },
20
+ onImageLoad: { type: 'function', value: () => { } },
21
+ onImageLoadError: {
22
+ type: 'function',
23
+ compare: false,
24
+ // eslint-disable-next-line
25
+ value: (requestId, error) => console.error(error, requestId)
26
+ }
27
+ };
28
+ /**
29
+ * The layer is used in Hex Tile layer in order to properly discard invisible elements during animation
30
+ */
31
+ export class WMSLayer extends CompositeLayer {
32
+ static { this.layerName = 'WMSLayer'; }
33
+ static { this.defaultProps = defaultProps; }
34
+ /** Returns true if all async resources are loaded */
35
+ get isLoaded() {
36
+ // Track the explicit loading done by this layer
37
+ return this.state?.loadCounter === 0 && super.isLoaded;
38
+ }
39
+ /** Lets deck.gl know that we want viewport change events */
40
+ shouldUpdateState() {
41
+ return true;
42
+ }
43
+ initializeState() {
44
+ // intentionally empty, initialization is done in updateState
45
+ this.state._nextRequestId = 0;
46
+ this.state.lastRequestId = -1;
47
+ this.state.loadCounter = 0;
48
+ }
49
+ updateState({ changeFlags, props, oldProps }) {
50
+ const { viewport } = this.context;
51
+ // Check if data source has changed
52
+ if (changeFlags.dataChanged || props.serviceType !== oldProps.serviceType) {
53
+ this.state.imageSource = this._createImageSource(props);
54
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
55
+ this._loadMetadata();
56
+ this.debounce(() => this.loadImage(viewport, 'image source changed'), 0);
57
+ }
58
+ else if (!deepEqual(props.layers, oldProps.layers, 1)) {
59
+ this.debounce(() => this.loadImage(viewport, 'layers changed'), 0);
60
+ }
61
+ else if (changeFlags.viewportChanged) {
62
+ this.debounce(() => this.loadImage(viewport, 'viewport changed'));
63
+ }
64
+ }
65
+ finalizeState() {
66
+ // TODO - we could cancel outstanding requests
67
+ }
68
+ renderLayers() {
69
+ // TODO - which bitmap layer is rendered should depend on the current viewport
70
+ // Currently Studio only uses one viewport
71
+ const { bounds, image, lastRequestParameters } = this.state;
72
+ return (image &&
73
+ new BitmapLayer({
74
+ ...this.getSubLayerProps({ id: 'bitmap' }),
75
+ _imageCoordinateSystem: lastRequestParameters.srs === 'EPSG:4326'
76
+ ? COORDINATE_SYSTEM.LNGLAT
77
+ : COORDINATE_SYSTEM.CARTESIAN,
78
+ bounds,
79
+ image
80
+ }));
81
+ }
82
+ async getFeatureInfoText(x, y) {
83
+ const { lastRequestParameters } = this.state;
84
+ if (lastRequestParameters) {
85
+ // @ts-expect-error Undocumented method
86
+ const featureInfo = await this.state.imageSource.getFeatureInfoText?.({
87
+ ...lastRequestParameters,
88
+ query_layers: lastRequestParameters.layers,
89
+ x,
90
+ y,
91
+ info_format: 'application/vnd.ogc.gml'
92
+ });
93
+ return featureInfo;
94
+ }
95
+ return '';
96
+ }
97
+ _createImageSource(props) {
98
+ if (props.data instanceof ImageSource) {
99
+ return props.data;
100
+ }
101
+ if (typeof props.data === 'string') {
102
+ return createImageSource({
103
+ url: props.data,
104
+ loadOptions: props.loadOptions,
105
+ type: props.serviceType
106
+ });
107
+ }
108
+ throw new Error('invalid image source in props.data');
109
+ }
110
+ /** Run a getMetadata on the image service */
111
+ async _loadMetadata() {
112
+ const { imageSource } = this.state;
113
+ try {
114
+ this.state.loadCounter++;
115
+ const metadata = await imageSource.getMetadata();
116
+ // If a request takes a long time, it may no longer be expected
117
+ if (this.state.imageSource === imageSource) {
118
+ this.getCurrentLayer()?.props.onMetadataLoad(metadata);
119
+ }
120
+ }
121
+ catch (error) {
122
+ this.getCurrentLayer()?.props.onMetadataLoadError(error);
123
+ }
124
+ finally {
125
+ this.state.loadCounter--;
126
+ }
127
+ }
128
+ /** Load an image */
129
+ async loadImage(viewport, reason) {
130
+ const { layers, serviceType } = this.props;
131
+ // TODO - move to ImageSource?
132
+ if (serviceType === 'wms' && layers.length === 0) {
133
+ return;
134
+ }
135
+ const bounds = viewport.getBounds();
136
+ const { width, height } = viewport;
137
+ const requestId = this.getRequestId();
138
+ let { srs } = this.props;
139
+ if (srs === 'auto') {
140
+ // BitmapLayer only supports LNGLAT or CARTESIAN (Web-Mercator)
141
+ srs = viewport.resolution ? 'EPSG:4326' : 'EPSG:3857';
142
+ }
143
+ const requestParams = {
144
+ width,
145
+ height,
146
+ boundingBox: [
147
+ [bounds[0], bounds[1]],
148
+ [bounds[2], bounds[3]]
149
+ ],
150
+ layers,
151
+ crs: srs
152
+ };
153
+ if (srs === 'EPSG:3857') {
154
+ const min = WGS84ToPseudoMercator([bounds[0], bounds[1]]);
155
+ const max = WGS84ToPseudoMercator([bounds[2], bounds[3]]);
156
+ requestParams.boundingBox = [min, max];
157
+ }
158
+ try {
159
+ this.state.loadCounter++;
160
+ this.props.onImageLoadStart(requestId);
161
+ const image = await this.state.imageSource.getImage(requestParams);
162
+ // If a request takes a long time, later requests may have already loaded.
163
+ if (this.state.lastRequestId < requestId) {
164
+ this.getCurrentLayer()?.props.onImageLoad(requestId);
165
+ // Not type safe...
166
+ this.setState({
167
+ image,
168
+ bounds,
169
+ lastRequestParameters: requestParams,
170
+ lastRequestId: requestId
171
+ });
172
+ }
173
+ }
174
+ catch (error) {
175
+ this.raiseError(error, 'Load image');
176
+ this.getCurrentLayer()?.props.onImageLoadError(requestId, error);
177
+ }
178
+ finally {
179
+ this.state.loadCounter--;
180
+ }
181
+ }
182
+ // HELPERS
183
+ /** Global counter for issuing unique request ids */
184
+ getRequestId() {
185
+ return this.state._nextRequestId++;
186
+ }
187
+ /** Runs an action in the future, cancels it if the new action is issued before it executes */
188
+ debounce(fn, ms = 500) {
189
+ clearTimeout(this.state._timeoutId);
190
+ this.state._timeoutId = setTimeout(() => fn(), ms);
191
+ }
192
+ }