leaflet-city-mapper 0.0.2 → 0.0.4

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 (1283) hide show
  1. package/README.md +56 -14
  2. package/cucumber.mjs +2 -2
  3. package/dist/leaflet-city-mapper-src.js +15326 -0
  4. package/dist/leaflet-city-mapper-src.js.map +7 -0
  5. package/dist/leaflet-city-mapper.js +4 -1
  6. package/dist/leaflet-city-mapper.js.map +4 -4
  7. package/libs/leaflet-lens.js +122 -0
  8. package/libs/leaflet.js +76 -0
  9. package/libs/openlayers-bindings.js +1128 -0
  10. package/libs/openlayers-bindings.min.js +99 -0
  11. package/libs/openlayers-bindings.min.js.map +7 -0
  12. package/package.json +5 -3
  13. package/src/archives/decodeDirectory.js +50 -0
  14. package/src/archives/decodeHeader.js +23 -0
  15. package/src/archives/decompress.js +10 -0
  16. package/src/archives/findDirectoryEntry.js +9 -0
  17. package/src/archives/findTile.js +31 -0
  18. package/src/archives/getDirectoryEntries.js +18 -0
  19. package/src/archives/getHeader.js +13 -0
  20. package/src/archives/getTileData.js +13 -0
  21. package/src/archives/getZxy.js +19 -0
  22. package/src/archives/loadDirectory.js +7 -0
  23. package/src/archives/loadSource.js +31 -0
  24. package/src/archives/read.js +32 -0
  25. package/src/archives/tileId.js +23 -0
  26. package/src/archives/varint.js +19 -0
  27. package/src/camera/angles.js +14 -0
  28. package/src/camera/animationPoint.js +11 -0
  29. package/src/camera/cameraMapReady.js +11 -0
  30. package/src/camera/cancelCameraAnimation.js +15 -0
  31. package/src/camera/cleanupCameraMap.js +14 -0
  32. package/src/camera/constrainCameraToBounds.js +3 -0
  33. package/src/camera/displayPoint.js +3 -0
  34. package/src/camera/fitCameraBounds.js +58 -0
  35. package/src/camera/getBearing.js +5 -0
  36. package/src/camera/getPitch.js +5 -0
  37. package/src/camera/groundBounds.js +18 -0
  38. package/src/camera/initializeCameraMap.js +30 -0
  39. package/src/camera/mapAnimateCamera.js +24 -0
  40. package/src/camera/mapCamera.js +103 -0
  41. package/src/camera/mapContainerPointToLayerPoint.js +9 -0
  42. package/src/camera/mapGetBearing.js +4 -0
  43. package/src/camera/mapGetBounds.js +20 -0
  44. package/src/camera/mapGetBoundsCenterZoom.js +10 -0
  45. package/src/camera/mapGetBoundsZoom.js +24 -0
  46. package/src/camera/mapGetCenterLayerPoint.js +6 -0
  47. package/src/camera/mapGetPitch.js +4 -0
  48. package/src/camera/mapLayerPointToContainerPoint.js +8 -0
  49. package/src/camera/mapLimitCenter.js +17 -0
  50. package/src/camera/mapLimitOffset.js +14 -0
  51. package/src/camera/mapPanBy.js +10 -0
  52. package/src/camera/mapPanInside.js +20 -0
  53. package/src/camera/mapResetNorth.js +4 -0
  54. package/src/camera/mapResetNorthPitch.js +4 -0
  55. package/src/camera/mapSetBearing.js +3 -0
  56. package/src/camera/mapSetPitch.js +3 -0
  57. package/src/camera/mapSetPitchAndBearing.js +22 -0
  58. package/src/camera/mapSetZoomAround.js +15 -0
  59. package/src/camera/mapStopPitchBearingAnimation.js +6 -0
  60. package/src/camera/mapTryAnimatedPan.js +10 -0
  61. package/src/camera/mapUpdateCameraOverlays.js +8 -0
  62. package/src/camera/pointOf.js +5 -0
  63. package/src/camera/project.js +27 -0
  64. package/src/camera/runCameraAnimations.js +31 -0
  65. package/src/camera/scheduleCameraAnimation.js +13 -0
  66. package/src/camera/updateSky.js +22 -0
  67. package/src/camera/verticalGroundY.js +4 -0
  68. package/src/cog/decodeCogTile.js +24 -0
  69. package/src/cog/finiteCogValues.js +5 -0
  70. package/src/cog/getCogAssetEntry.js +15 -0
  71. package/src/cog/getCogBase.js +10 -0
  72. package/src/cog/getCogHeader.js +3 -0
  73. package/src/cog/getCogProfile.js +16 -0
  74. package/src/cog/getCogTile.js +12 -0
  75. package/src/cog/getColorTile.js +25 -0
  76. package/src/cog/getElevationTile.js +16 -0
  77. package/src/cog/hasCogProjection.js +9 -0
  78. package/src/cog/initCog.js +7 -0
  79. package/src/cog/invalidCogFullResponse.js +3 -0
  80. package/src/cog/openCog.js +30 -0
  81. package/src/cog/openCogAsset.js +14 -0
  82. package/src/cog/readCog.js +25 -0
  83. package/src/cog/readCogBlock.js +8 -0
  84. package/src/cog/readCogBody.js +20 -0
  85. package/src/cog/readCogDirectories.js +20 -0
  86. package/src/cog/readCogDirectory.js +21 -0
  87. package/src/cog/readCogLevel.js +27 -0
  88. package/src/cog/readCogTag.js +15 -0
  89. package/src/cog/validCogDimensions.js +6 -0
  90. package/src/cog/validCogEncoding.js +5 -0
  91. package/src/cog/validCogGeoArrays.js +8 -0
  92. package/src/cog/validCogGrid.js +9 -0
  93. package/src/cog/validCogTileCoordinates.js +4 -0
  94. package/src/cog/validateCogContainer.js +9 -0
  95. package/src/cog/validateCogContentRange.js +8 -0
  96. package/src/cog/validateCogOffsets.js +10 -0
  97. package/src/cog/validateCogRange.js +7 -0
  98. package/src/cog/validateCogResponse.js +15 -0
  99. package/src/collision/collectMeshes.js +5 -0
  100. package/src/collision/collider.js +56 -0
  101. package/src/collision/hiddenLightHit.js +8 -0
  102. package/src/collision/indexTriangle.js +11 -0
  103. package/src/collision/intersectMeshes.js +32 -0
  104. package/src/collision/localRay.js +21 -0
  105. package/src/collision/mergeHits.js +11 -0
  106. package/src/collision/rayBounds.js +19 -0
  107. package/src/collision/readTriangle.js +20 -0
  108. package/src/collision/sortHits.js +17 -0
  109. package/src/collision/transformTriangle.js +9 -0
  110. package/src/collision/triangleDistance.js +21 -0
  111. package/src/collision/worldHit.js +18 -0
  112. package/src/controls/acceptPitchDrag.js +4 -0
  113. package/src/controls/acceptRotateDrag.js +3 -0
  114. package/src/controls/addCameraHandler.js +9 -0
  115. package/src/controls/adjustCameraDrag.js +15 -0
  116. package/src/controls/cameraControls.js +91 -0
  117. package/src/controls/cameraDragClick.js +10 -0
  118. package/src/controls/cameraDragContextMenu.js +9 -0
  119. package/src/controls/cameraDragDown.js +23 -0
  120. package/src/controls/cameraDragEnd.js +7 -0
  121. package/src/controls/cameraDragMove.js +28 -0
  122. package/src/controls/changeCameraTouch.js +17 -0
  123. package/src/controls/cleanupCameraTouch.js +29 -0
  124. package/src/controls/compassAddHooks.js +18 -0
  125. package/src/controls/compassOrientation.js +7 -0
  126. package/src/controls/compassRemoveHooks.js +5 -0
  127. package/src/controls/containerResizeAddHooks.js +8 -0
  128. package/src/controls/containerResizeRemoveHooks.js +5 -0
  129. package/src/controls/dragCamera.js +26 -0
  130. package/src/controls/editable.js +3 -0
  131. package/src/controls/endAllCameraDrags.js +9 -0
  132. package/src/controls/endAllCameraTouches.js +9 -0
  133. package/src/controls/endCameraTouch.js +12 -0
  134. package/src/controls/endCameraTouchEvent.js +8 -0
  135. package/src/controls/failCompassPermission.js +4 -0
  136. package/src/controls/finishCameraDrag.js +9 -0
  137. package/src/controls/finishCompassPermission.js +17 -0
  138. package/src/controls/loadCameraControls.js +9 -0
  139. package/src/controls/moveCameraTouch.js +29 -0
  140. package/src/controls/notifyCameraTouchChange.js +1 -0
  141. package/src/controls/pitchDragAddHooks.js +8 -0
  142. package/src/controls/pitchDragRemoveHooks.js +5 -0
  143. package/src/controls/refreshRotateControl.js +10 -0
  144. package/src/controls/refreshRotateFocus.js +5 -0
  145. package/src/controls/removeCameraDrag.js +26 -0
  146. package/src/controls/resizeMap.js +3 -0
  147. package/src/controls/rotateButtonClick.js +11 -0
  148. package/src/controls/rotateButtonKeydown.js +15 -0
  149. package/src/controls/rotateControl.js +4 -0
  150. package/src/controls/rotateOnAdd.js +42 -0
  151. package/src/controls/rotateOnRemove.js +6 -0
  152. package/src/controls/shiftRotateAddHooks.js +10 -0
  153. package/src/controls/shiftRotateRemoveHooks.js +5 -0
  154. package/src/controls/shiftRotateWheel.js +11 -0
  155. package/src/controls/startCameraTouch.js +33 -0
  156. package/src/core/addImageState.js +8 -0
  157. package/src/core/addRasterImage.js +12 -0
  158. package/src/core/adjustCameraMarkerPan.js +28 -0
  159. package/src/core/beforeNativeRender.js +10 -0
  160. package/src/core/boundsQuad.js +12 -0
  161. package/src/core/bringNativeLayerToBack.js +8 -0
  162. package/src/core/bringNativeLayerToFront.js +8 -0
  163. package/src/core/bypassNativeEvent.js +11 -0
  164. package/src/core/cameraCircleBounds.js +7 -0
  165. package/src/core/cameraMarkerDrag.js +21 -0
  166. package/src/core/cameraMarkerOnDrag.js +13 -0
  167. package/src/core/cancelGridFade.js +14 -0
  168. package/src/core/closestCameraLayerPoint.js +8 -0
  169. package/src/core/compareNativeHits.js +3 -0
  170. package/src/core/current.js +6 -0
  171. package/src/core/disposeNativeLayer.js +39 -0
  172. package/src/core/fireRasterLoad.js +6 -0
  173. package/src/core/forwardNativeError.js +3 -0
  174. package/src/core/gridlayerGetEvents.js +10 -0
  175. package/src/core/gridlayerGetTiledPixelBounds.js +12 -0
  176. package/src/core/handleNativeMapEvent.js +27 -0
  177. package/src/core/hideTargets.js +18 -0
  178. package/src/core/initNativeGPU.js +25 -0
  179. package/src/core/initializeGridContainer.js +7 -0
  180. package/src/core/initializeNativeLayer.js +40 -0
  181. package/src/core/layerCallInitHooks.js +14 -0
  182. package/src/core/localPixel.js +5 -0
  183. package/src/core/localPixelForGeometry.js +7 -0
  184. package/src/core/localPosition.js +10 -0
  185. package/src/core/markerCameraIconPoint.js +12 -0
  186. package/src/core/markerGetEvents.js +9 -0
  187. package/src/core/markerImageBounds.js +11 -0
  188. package/src/core/markerInitInteraction.js +10 -0
  189. package/src/core/markerQuadCorners.js +48 -0
  190. package/src/core/markerSetIcon.js +12 -0
  191. package/src/core/markerSetPos.js +19 -0
  192. package/src/core/markerSetRotation.js +9 -0
  193. package/src/core/markerUpdateZIndex.js +12 -0
  194. package/src/core/nativeAddLatLng.js +3 -0
  195. package/src/core/nativeBringToBack.js +3 -0
  196. package/src/core/nativeBringToFront.js +3 -0
  197. package/src/core/nativeEventSource.js +18 -0
  198. package/src/core/nativeEvents.js +31 -0
  199. package/src/core/nativeImageError.js +13 -0
  200. package/src/core/nativeImageRefresh.js +11 -0
  201. package/src/core/nativeLayer.js +100 -0
  202. package/src/core/nativeLayerMethod.js +26 -0
  203. package/src/core/nativeRedraw.js +3 -0
  204. package/src/core/nativeSetBounds.js +3 -0
  205. package/src/core/nativeSetIcon.js +3 -0
  206. package/src/core/nativeSetLatLng.js +3 -0
  207. package/src/core/nativeSetLatLngs.js +3 -0
  208. package/src/core/nativeSetOpacity.js +3 -0
  209. package/src/core/nativeSetRadius.js +3 -0
  210. package/src/core/nativeSetStyle.js +3 -0
  211. package/src/core/nativeSetUrl.js +3 -0
  212. package/src/core/nativeSetZIndex.js +3 -0
  213. package/src/core/nativeSetZIndexOffset.js +3 -0
  214. package/src/core/popupAdjustPan.js +29 -0
  215. package/src/core/popupGetEvents.js +8 -0
  216. package/src/core/popupUpdatePosition.js +17 -0
  217. package/src/core/pruneNativeResources.js +20 -0
  218. package/src/core/putNativeMesh.js +36 -0
  219. package/src/core/quadNativeMesh.js +20 -0
  220. package/src/core/readyNativeGPU.js +9 -0
  221. package/src/core/redrawPath.js +6 -0
  222. package/src/core/refreshNativeEvent.js +5 -0
  223. package/src/core/refreshNativeLayer.js +34 -0
  224. package/src/core/refreshNativeLayerContract.js +8 -0
  225. package/src/core/rejectNativeReady.js +4 -0
  226. package/src/core/removeImageState.js +9 -0
  227. package/src/core/removeLayer.js +22 -0
  228. package/src/core/removeNativeEvents.js +17 -0
  229. package/src/core/removeTargets.js +12 -0
  230. package/src/core/reorderNativeLayer.js +9 -0
  231. package/src/core/resolveNativeReady.js +4 -0
  232. package/src/core/restoreNativeEvents.js +6 -0
  233. package/src/core/runGridFades.js +19 -0
  234. package/src/core/runMarkerPanFrame.js +14 -0
  235. package/src/core/scheduleGridFade.js +14 -0
  236. package/src/core/scheduleMarkerPan.js +11 -0
  237. package/src/core/setRotation.js +5 -0
  238. package/src/core/styleNativeMesh.js +14 -0
  239. package/src/core/syncGridLayer.js +29 -0
  240. package/src/core/syncImageOverlay.js +9 -0
  241. package/src/core/syncMarker.js +14 -0
  242. package/src/core/syncVectorLayer.js +29 -0
  243. package/src/core/synchronizeNativeLayer.js +26 -0
  244. package/src/core/textureFor.js +46 -0
  245. package/src/core/tooltipGetEvents.js +8 -0
  246. package/src/core/tooltipSetPosition.js +11 -0
  247. package/src/core/transformNativePoint.js +7 -0
  248. package/src/core/updateGridOpacity.js +27 -0
  249. package/src/core/updateNativeHover.js +7 -0
  250. package/src/core/updateNativeLayerView.js +9 -0
  251. package/src/core/uploadCanvasTexture.js +22 -0
  252. package/src/core/uploadNativeImage.js +13 -0
  253. package/src/geometry/addBridges.js +29 -0
  254. package/src/geometry/below.js +3 -0
  255. package/src/geometry/box.js +8 -0
  256. package/src/geometry/bridgeEdge.js +11 -0
  257. package/src/geometry/bridgeElevation.js +21 -0
  258. package/src/geometry/bridgeFaces.js +15 -0
  259. package/src/geometry/bridgeLocal.js +5 -0
  260. package/src/geometry/bridgePaths.js +11 -0
  261. package/src/geometry/bridgePolygon.js +31 -0
  262. package/src/geometry/bridgeSides.js +11 -0
  263. package/src/geometry/build.js +23 -0
  264. package/src/geometry/circleAt.js +7 -0
  265. package/src/geometry/circleGeometry.js +34 -0
  266. package/src/geometry/clipLine.js +23 -0
  267. package/src/geometry/clipSegment.js +23 -0
  268. package/src/geometry/computeBounds.js +38 -0
  269. package/src/geometry/conformModelToTerrain.js +72 -0
  270. package/src/geometry/cross.js +7 -0
  271. package/src/geometry/dashValues.js +14 -0
  272. package/src/geometry/dashedSegment.js +16 -0
  273. package/src/geometry/disk.js +11 -0
  274. package/src/geometry/diskAt.js +6 -0
  275. package/src/geometry/dot.js +6 -0
  276. package/src/geometry/emitter.js +8 -0
  277. package/src/geometry/indexBridge.js +29 -0
  278. package/src/geometry/lampPostGeometry.js +30 -0
  279. package/src/geometry/lampRing.js +14 -0
  280. package/src/geometry/lightGeometry.js +15 -0
  281. package/src/geometry/line.js +21 -0
  282. package/src/geometry/lineJoin.js +26 -0
  283. package/src/geometry/nativeGeometry.js +21 -0
  284. package/src/geometry/nativeTriangle.js +3 -0
  285. package/src/geometry/polygon.js +23 -0
  286. package/src/geometry/push.js +3 -0
  287. package/src/geometry/quad.js +9 -0
  288. package/src/geometry/roofCoverage.js +23 -0
  289. package/src/geometry/roofFootprint.js +29 -0
  290. package/src/geometry/samePoint.js +3 -0
  291. package/src/geometry/segment.js +22 -0
  292. package/src/geometry/setVertexColor.js +17 -0
  293. package/src/geometry/sub.js +6 -0
  294. package/src/geometry/subtractRoofTile.js +19 -0
  295. package/src/geometry/surface.js +18 -0
  296. package/src/geometry/treeGeometry.js +30 -0
  297. package/src/geometry/treeRing.js +15 -0
  298. package/src/geometry/triangle.js +13 -0
  299. package/src/geometry/validateTree.js +7 -0
  300. package/src/geometry/vertexNormals.js +26 -0
  301. package/src/geometry/visit.js +10 -0
  302. package/src/globals/CELL.js +3 -0
  303. package/src/globals/Compass.js +1 -0
  304. package/src/globals/ContainerResize.js +1 -0
  305. package/src/globals/HEIGHT.js +1 -0
  306. package/src/globals/L.js +1 -0
  307. package/src/globals/PitchDrag.js +1 -0
  308. package/src/globals/ShiftRotate.js +1 -0
  309. package/src/globals/TILE_RADIUS.js +1 -0
  310. package/src/globals/TILE_SIZE.js +1 -0
  311. package/src/globals/TouchMode.js +1 -0
  312. package/src/globals/alphaBlend.js +12 -0
  313. package/src/globals/archiveDecoder.js +1 -0
  314. package/src/globals/archiveNorthWest.js +1 -0
  315. package/src/globals/archiveSouthEast.js +1 -0
  316. package/src/globals/atmosphereColor.js +1 -0
  317. package/src/globals/atmosphereStops.js +22 -0
  318. package/src/globals/blobParts.js +1 -0
  319. package/src/globals/boundsMethods.js +1 -0
  320. package/src/globals/cameraAngles.js +1 -0
  321. package/src/globals/cameraAnimatedOptions.js +3 -0
  322. package/src/globals/cameraAnimationFrame.js +1 -0
  323. package/src/globals/cameraAnimations.js +1 -0
  324. package/src/globals/cameraBearingSensitivity.js +1 -0
  325. package/src/globals/cameraByMap.js +1 -0
  326. package/src/globals/cameraDragSensitivity.js +1 -0
  327. package/src/globals/cameraDrags.js +1 -0
  328. package/src/globals/cameraEmptyOptions.js +1 -0
  329. package/src/globals/cameraFocusOptions.js +3 -0
  330. package/src/globals/cameraFov.js +3 -0
  331. package/src/globals/cameraListenerOptions.js +4 -0
  332. package/src/globals/cameraTouchStates.js +1 -0
  333. package/src/globals/cameraZeroPadding.js +1 -0
  334. package/src/globals/closestMethods.js +1 -0
  335. package/src/globals/cogTags.js +1 -0
  336. package/src/globals/colliders.js +1 -0
  337. package/src/globals/colorLayout.js +8 -0
  338. package/src/globals/coreEventTypes.js +4 -0
  339. package/src/globals/coreMatrixKeys.js +4 -0
  340. package/src/globals/coreQuadIndices.js +1 -0
  341. package/src/globals/coreQuadUV.js +1 -0
  342. package/src/globals/coreSampler.js +4 -0
  343. package/src/globals/coreWhite.js +1 -0
  344. package/src/globals/cosObliquity.js +3 -0
  345. package/src/globals/coverageTiles.js +1 -0
  346. package/src/globals/dark.js +1 -0
  347. package/src/globals/defaultMaterial.js +1 -0
  348. package/src/globals/degrees.js +1 -0
  349. package/src/globals/demBuffer.js +4 -0
  350. package/src/globals/demLayout.js +3 -0
  351. package/src/globals/demSize.js +1 -0
  352. package/src/globals/demTarget.js +3 -0
  353. package/src/globals/demTexture.js +5 -0
  354. package/src/globals/depthBindGroup.js +9 -0
  355. package/src/globals/depthTexture.js +5 -0
  356. package/src/globals/directoryReader.js +4 -0
  357. package/src/globals/disabledShadow.js +1 -0
  358. package/src/globals/dragByHandler.js +1 -0
  359. package/src/globals/dragStates.js +1 -0
  360. package/src/globals/drawEntries.js +1 -0
  361. package/src/globals/drawFrameEntry.js +7 -0
  362. package/src/globals/drawMeshEntry.js +7 -0
  363. package/src/globals/drawSamplerEntries.js +18 -0
  364. package/src/globals/drawTerrainEntry.js +4 -0
  365. package/src/globals/drawTextureEntries.js +18 -0
  366. package/src/globals/earthCirc.js +1 -0
  367. package/src/globals/elevationWGSL.js +27 -0
  368. package/src/globals/fragmentShader.js +3 -0
  369. package/src/globals/frameBuffer.js +4 -0
  370. package/src/globals/frameCommands.js +1 -0
  371. package/src/globals/frameLayoutEntry.js +7 -0
  372. package/src/globals/geometryDecoder.js +1 -0
  373. package/src/globals/geometryEmpty.js +1 -0
  374. package/src/globals/geometryImageOptions.js +4 -0
  375. package/src/globals/geometryPixelStates.js +1 -0
  376. package/src/globals/geometryQuaternion.js +1 -0
  377. package/src/globals/geometryScale.js +1 -0
  378. package/src/globals/geometrySemantics.js +5 -0
  379. package/src/globals/geometryTranslation.js +1 -0
  380. package/src/globals/glass.js +1 -0
  381. package/src/globals/gridEvents.js +1 -0
  382. package/src/globals/gridFadeFrame.js +1 -0
  383. package/src/globals/gridInitializers.js +1 -0
  384. package/src/globals/halfRadians.js +1 -0
  385. package/src/globals/headerBounds.js +1 -0
  386. package/src/globals/headerFlags.js +1 -0
  387. package/src/globals/headerOffsets.js +5 -0
  388. package/src/globals/hull.js +10 -0
  389. package/src/globals/imageStates.js +1 -0
  390. package/src/globals/instanceLayout.js +9 -0
  391. package/src/globals/lampDirections.js +8 -0
  392. package/src/globals/layerCallInitHooks.js +1 -0
  393. package/src/globals/layerProto.js +1 -0
  394. package/src/globals/lightScale.js +1 -0
  395. package/src/globals/limbs.js +8 -0
  396. package/src/globals/loading.js +1 -0
  397. package/src/globals/mapMethods.js +1 -0
  398. package/src/globals/markerMethods.js +1 -0
  399. package/src/globals/markerPanFrame.js +1 -0
  400. package/src/globals/meshBindGroup.js +4 -0
  401. package/src/globals/meshBuffer.js +4 -0
  402. package/src/globals/meshCopySize.js +1 -0
  403. package/src/globals/meshImage.js +4 -0
  404. package/src/globals/meshLayoutEntry.js +8 -0
  405. package/src/globals/meshOffsets.js +1 -0
  406. package/src/globals/meshPipeline.js +27 -0
  407. package/src/globals/meshStack.js +3 -0
  408. package/src/globals/meshTarget.js +3 -0
  409. package/src/globals/nativeEventMaps.js +1 -0
  410. package/src/globals/nativeMethodHandlers.js +31 -0
  411. package/src/globals/nativeRenderByLayer.js +1 -0
  412. package/src/globals/nextId.js +1 -0
  413. package/src/globals/normalLayout.js +8 -0
  414. package/src/globals/parts.js +24 -0
  415. package/src/globals/pendingGridFades.js +1 -0
  416. package/src/globals/pendingInitializations.js +1 -0
  417. package/src/globals/pendingMapChanges.js +1 -0
  418. package/src/globals/pendingMarkerPan.js +1 -0
  419. package/src/globals/pendingPlacements.js +1 -0
  420. package/src/globals/pendingRasterLoads.js +1 -0
  421. package/src/globals/pendingUpdates.js +1 -0
  422. package/src/globals/pendingZoomAnimations.js +1 -0
  423. package/src/globals/pipelineLayout.js +3 -0
  424. package/src/globals/popupEvents.js +1 -0
  425. package/src/globals/popupPan.js +1 -0
  426. package/src/globals/popupPosition.js +1 -0
  427. package/src/globals/positionLayout.js +8 -0
  428. package/src/globals/programEntries.js +1 -0
  429. package/src/globals/programLayout.js +3 -0
  430. package/src/globals/radians.js +1 -0
  431. package/src/globals/rasterBuffer.js +4 -0
  432. package/src/globals/rasterIndices.js +1 -0
  433. package/src/globals/rasterNormals.js +1 -0
  434. package/src/globals/rasterPoint.js +4 -0
  435. package/src/globals/rasterPositions.js +1 -0
  436. package/src/globals/rasterSampler.js +6 -0
  437. package/src/globals/rasterTexture.js +5 -0
  438. package/src/globals/rasterUVs.js +1 -0
  439. package/src/globals/removeLayer.js +1 -0
  440. package/src/globals/renderEmpty.js +1 -0
  441. package/src/globals/rendererDevices.js +1 -0
  442. package/src/globals/ringDirections.js +49 -0
  443. package/src/globals/roofBindGroup.js +17 -0
  444. package/src/globals/roofBlitSampler.js +4 -0
  445. package/src/globals/roofBuffer.js +4 -0
  446. package/src/globals/roofCommands.js +1 -0
  447. package/src/globals/roofCopySize.js +1 -0
  448. package/src/globals/roofImage.js +3 -0
  449. package/src/globals/roofMin.js +4 -0
  450. package/src/globals/roofOpacities.js +1 -0
  451. package/src/globals/roofPass.js +13 -0
  452. package/src/globals/roofPipeline.js +29 -0
  453. package/src/globals/roofSampler.js +4 -0
  454. package/src/globals/roofShader.js +16 -0
  455. package/src/globals/roofSignatures.js +1 -0
  456. package/src/globals/roofSize.js +4 -0
  457. package/src/globals/roofTarget.js +3 -0
  458. package/src/globals/roofTexture.js +5 -0
  459. package/src/globals/roofTiles.js +1 -0
  460. package/src/globals/roundProfile.js +7 -0
  461. package/src/globals/samplerLayoutEntries.js +36 -0
  462. package/src/globals/sceneByLayer.js +1 -0
  463. package/src/globals/sceneCleanupFields.js +1 -0
  464. package/src/globals/sceneEmptyOptions.js +1 -0
  465. package/src/globals/scenePass.js +19 -0
  466. package/src/globals/sceneSunlightUniforms.js +3 -0
  467. package/src/globals/sceneTransferFields.js +1 -0
  468. package/src/globals/sceneWalkHandlers.js +1 -0
  469. package/src/globals/shadowBindGroup.js +10 -0
  470. package/src/globals/shadowBounds.js +4 -0
  471. package/src/globals/shadowCamera.js +15 -0
  472. package/src/globals/shadowDepthLayout.js +9 -0
  473. package/src/globals/shadowHigh.js +1 -0
  474. package/src/globals/shadowInstanceLayouts.js +4 -0
  475. package/src/globals/shadowLayouts.js +3 -0
  476. package/src/globals/shadowLow.js +1 -0
  477. package/src/globals/shadowMeshLayout.js +10 -0
  478. package/src/globals/shadowOffsets.js +1 -0
  479. package/src/globals/shadowPass.js +9 -0
  480. package/src/globals/shadowPipeline.js +24 -0
  481. package/src/globals/shadowPipelineLayout.js +3 -0
  482. package/src/globals/shadowShader.js +3 -0
  483. package/src/globals/shadowTexture.js +5 -0
  484. package/src/globals/shadowValues.js +1 -0
  485. package/src/globals/shirt.js +1 -0
  486. package/src/globals/sinObliquity.js +3 -0
  487. package/src/globals/sizes.js +6 -0
  488. package/src/globals/skin.js +2 -0
  489. package/src/globals/sunBindGroup.js +20 -0
  490. package/src/globals/sunByMap.js +1 -0
  491. package/src/globals/sunlightByControl.js +1 -0
  492. package/src/globals/tau.js +1 -0
  493. package/src/globals/terrainLayoutEntry.js +8 -0
  494. package/src/globals/textureLayoutEntries.js +41 -0
  495. package/src/globals/tiledBounds.js +1 -0
  496. package/src/globals/tooltipEvents.js +1 -0
  497. package/src/globals/tooltipPosition.js +1 -0
  498. package/src/globals/touchByContainer.js +1 -0
  499. package/src/globals/trafficByLayer.js +1 -0
  500. package/src/globals/trafficClocks.js +1 -0
  501. package/src/globals/trafficEmptyList.js +1 -0
  502. package/src/globals/trafficEmptyOptions.js +1 -0
  503. package/src/globals/trafficRouteMaterial.js +1 -0
  504. package/src/globals/trafficShader.js +49 -0
  505. package/src/globals/triangleContexts.js +1 -0
  506. package/src/globals/trousers.js +1 -0
  507. package/src/globals/tyre.js +1 -0
  508. package/src/globals/uVLayout.js +8 -0
  509. package/src/globals/vehicles.js +55 -0
  510. package/src/globals/vertexShader.js +3 -0
  511. package/src/globals/walkByMap.js +1 -0
  512. package/src/globals/wantedTiles.js +1 -0
  513. package/src/index.js +48 -328
  514. package/src/lighting/cacheLightGrid.js +32 -0
  515. package/src/lighting/collectLightMeshes.js +9 -0
  516. package/src/lighting/lightGrid.js +43 -0
  517. package/src/lighting/updatePointLights.js +38 -0
  518. package/src/lighting/visitCells.js +8 -0
  519. package/src/lighting/visitLightCells.js +13 -0
  520. package/src/lighting/worldLights.js +25 -0
  521. package/src/lighting/writeLightCell.js +5 -0
  522. package/src/models/applyModelTransform.js +13 -0
  523. package/src/models/buildModelNodes.js +14 -0
  524. package/src/models/createModelContext.js +15 -0
  525. package/src/models/createModelGeometry.js +40 -0
  526. package/src/models/decodeModel.js +48 -0
  527. package/src/models/hasUnsupportedPrimitives.js +10 -0
  528. package/src/models/loadBuffer.js +6 -0
  529. package/src/models/loadImage.js +19 -0
  530. package/src/models/loadModel.js +44 -0
  531. package/src/models/loadModelResources.js +19 -0
  532. package/src/models/materialFor.js +21 -0
  533. package/src/models/modelNode.js +49 -0
  534. package/src/models/nodeMatrix.js +27 -0
  535. package/src/models/normalizeAccessor.js +11 -0
  536. package/src/models/readAccessor.js +33 -0
  537. package/src/models/readAccessorValue.js +7 -0
  538. package/src/models/readAccessorValues.js +20 -0
  539. package/src/models/readModelAttributes.js +20 -0
  540. package/src/models/readModelIndices.js +16 -0
  541. package/src/models/readSparseAccessor.js +19 -0
  542. package/src/models/releaseModelResources.js +10 -0
  543. package/src/models/textureFor.js +38 -0
  544. package/src/models/textureSampler.js +10 -0
  545. package/src/picking/collectVisibleMesh.js +4 -0
  546. package/src/picking/findFeature.js +52 -0
  547. package/src/picking/hit.js +24 -0
  548. package/src/picking/hitColliderCell.js +19 -0
  549. package/src/picking/hitMesh.js +26 -0
  550. package/src/picking/onClick.js +16 -0
  551. package/src/picking/onPointerLeave.js +14 -0
  552. package/src/picking/onPointerMove.js +18 -0
  553. package/src/picking/pointerClick.js +5 -0
  554. package/src/picking/pointerLeave.js +5 -0
  555. package/src/picking/pointerMove.js +5 -0
  556. package/src/picking/raycast.js +66 -0
  557. package/src/picking/setHighlight.js +20 -0
  558. package/src/picking/shouldSkipOther.js +6 -0
  559. package/src/picking/showFeature.js +37 -0
  560. package/src/picking/validateCameraInverse.js +8 -0
  561. package/src/raster/addRasterTile.js +69 -0
  562. package/src/raster/comparePendingTiles.js +5 -0
  563. package/src/raster/createGeometry.js +29 -0
  564. package/src/raster/createRasterMesh.js +76 -0
  565. package/src/raster/finishAttachment.js +15 -0
  566. package/src/raster/finishRasterTile.js +61 -0
  567. package/src/raster/getRasterEvents.js +6 -0
  568. package/src/raster/getRasterTileSize.js +7 -0
  569. package/src/raster/initRaster.js +33 -0
  570. package/src/raster/isLoading.js +7 -0
  571. package/src/raster/loadRasterTile.js +13 -0
  572. package/src/raster/onPMTileAdd.js +13 -0
  573. package/src/raster/onPMTileRemove.js +11 -0
  574. package/src/raster/pruneRasterTiles.js +40 -0
  575. package/src/raster/pumpRasterTiles.js +26 -0
  576. package/src/raster/rasterTileRange.js +23 -0
  577. package/src/raster/readyRaster.js +16 -0
  578. package/src/raster/registerTerrainTile.js +15 -0
  579. package/src/raster/releaseRasterTile.js +21 -0
  580. package/src/raster/releaseRasterTiles.js +18 -0
  581. package/src/raster/removeRasterTile.js +16 -0
  582. package/src/raster/reportError.js +6 -0
  583. package/src/raster/retainRasterTiles.js +15 -0
  584. package/src/raster/setPMTileOpacity.js +7 -0
  585. package/src/raster/setPMTileZIndex.js +7 -0
  586. package/src/raster/setRasterOpacity.js +14 -0
  587. package/src/raster/setRasterTerrain.js +25 -0
  588. package/src/raster/setRasterZIndex.js +14 -0
  589. package/src/raster/terrainTileGeometry.js +16 -0
  590. package/src/raster/updateAttachedTiles.js +13 -0
  591. package/src/raster/updateRasterTiles.js +51 -0
  592. package/src/rendering/bindMeshTextures.js +50 -0
  593. package/src/rendering/collectFrameMeshes.js +38 -0
  594. package/src/rendering/collectMeshes.js +14 -0
  595. package/src/rendering/collectRoofTiles.js +15 -0
  596. package/src/rendering/collectVisibleMesh.js +27 -0
  597. package/src/rendering/compareMeshDepth.js +6 -0
  598. package/src/rendering/compareMeshes.js +8 -0
  599. package/src/rendering/compareRoofTiles.js +4 -0
  600. package/src/rendering/composeRoofAtlas.js +69 -0
  601. package/src/rendering/createMesh.js +44 -0
  602. package/src/rendering/createProgram.js +75 -0
  603. package/src/rendering/createProgramLayout.js +36 -0
  604. package/src/rendering/createProgramUniforms.js +17 -0
  605. package/src/rendering/destroyAfterSubmission.js +8 -0
  606. package/src/rendering/destroyTexture.js +9 -0
  607. package/src/rendering/disposeMesh.js +14 -0
  608. package/src/rendering/drawGeometry.js +41 -0
  609. package/src/rendering/drawPipeline.js +34 -0
  610. package/src/rendering/drawSceneMeshes.js +48 -0
  611. package/src/rendering/ensureRoofBlit.js +20 -0
  612. package/src/rendering/prepareFrameBuffer.js +17 -0
  613. package/src/rendering/prepareFrameMeshes.js +37 -0
  614. package/src/rendering/prepareFrameUniforms.js +44 -0
  615. package/src/rendering/prepareMeshCutout.js +12 -0
  616. package/src/rendering/prepareMeshTextures.js +23 -0
  617. package/src/rendering/prepareMeshUniforms.js +25 -0
  618. package/src/rendering/rebuildRoofAtlas.js +52 -0
  619. package/src/rendering/render.js +69 -0
  620. package/src/rendering/reportCompilation.js +17 -0
  621. package/src/rendering/resizeRenderer.js +24 -0
  622. package/src/rendering/resizeRoofTexture.js +24 -0
  623. package/src/rendering/revealRoofMesh.js +15 -0
  624. package/src/rendering/sortMeshes.js +6 -0
  625. package/src/rendering/synchronizeZoomView.js +26 -0
  626. package/src/rendering/textureBinding.js +7 -0
  627. package/src/rendering/updateMapCamera.js +46 -0
  628. package/src/rendering/updateRoofAtlas.js +20 -0
  629. package/src/rendering/updateRoofRaster.js +25 -0
  630. package/src/rendering/updateZoomCamera.js +18 -0
  631. package/src/rendering/uploadMeshTexture.js +26 -0
  632. package/src/rendering/uploadRoofTile.js +23 -0
  633. package/src/scene/addSceneLayer.js +17 -0
  634. package/src/scene/attach.js +54 -0
  635. package/src/scene/attachLayer.js +13 -0
  636. package/src/scene/callLayer.js +26 -0
  637. package/src/scene/cancelUpdate.js +13 -0
  638. package/src/scene/composeLocalTransform.js +16 -0
  639. package/src/scene/createLayer.js +7 -0
  640. package/src/scene/createSceneCamera.js +21 -0
  641. package/src/scene/emptyEvents.js +3 -0
  642. package/src/scene/emptyNode.js +12 -0
  643. package/src/scene/endZoom.js +23 -0
  644. package/src/scene/failAttachment.js +12 -0
  645. package/src/scene/get3DEvents.js +16 -0
  646. package/src/scene/getLocation.js +7 -0
  647. package/src/scene/init3D.js +43 -0
  648. package/src/scene/initializeLayer.js +22 -0
  649. package/src/scene/initializeRendererResources.js +35 -0
  650. package/src/scene/initializeSharedRenderer.js +45 -0
  651. package/src/scene/initializerFor.js +16 -0
  652. package/src/scene/isNativeLayer.js +12 -0
  653. package/src/scene/layerCountTitle.js +4 -0
  654. package/src/scene/layerInitialize.js +48 -0
  655. package/src/scene/layerLayerAdd.js +43 -0
  656. package/src/scene/mountRenderer.js +25 -0
  657. package/src/scene/onAdd3DLayer.js +39 -0
  658. package/src/scene/onMapChange.js +18 -0
  659. package/src/scene/onRemove3DLayer.js +63 -0
  660. package/src/scene/onZoomAnim.js +18 -0
  661. package/src/scene/placeEntry.js +13 -0
  662. package/src/scene/placeEntryElement.js +22 -0
  663. package/src/scene/placeUnderEntry.js +8 -0
  664. package/src/scene/ready.js +9 -0
  665. package/src/scene/ready3D.js +35 -0
  666. package/src/scene/releaseRenderer.js +14 -0
  667. package/src/scene/releaseSharedScene.js +25 -0
  668. package/src/scene/removeEntry.js +8 -0
  669. package/src/scene/removeLayerEvents.js +9 -0
  670. package/src/scene/removeSceneLayer.js +15 -0
  671. package/src/scene/renderLayerCount.js +13 -0
  672. package/src/scene/renderPendingMapChange.js +15 -0
  673. package/src/scene/renderPendingUpdates.js +23 -0
  674. package/src/scene/renderPendingZoomAnimation.js +11 -0
  675. package/src/scene/rendererDeviceError.js +14 -0
  676. package/src/scene/rendererDeviceLost.js +14 -0
  677. package/src/scene/replaceEntry.js +9 -0
  678. package/src/scene/reportError.js +3 -0
  679. package/src/scene/requestAdapter.js +12 -0
  680. package/src/scene/requestDevice.js +9 -0
  681. package/src/scene/resolveNextInitialization.js +13 -0
  682. package/src/scene/restoreGeometry.js +23 -0
  683. package/src/scene/restoreMaterialTextures.js +16 -0
  684. package/src/scene/restoreObject.js +35 -0
  685. package/src/scene/runPlacements.js +9 -0
  686. package/src/scene/showWebGPUWarning.js +16 -0
  687. package/src/scene/startZoom.js +8 -0
  688. package/src/scene/traverse.js +7 -0
  689. package/src/scene/underEntry.js +16 -0
  690. package/src/scene/update.js +23 -0
  691. package/src/scene/updateCamera.js +57 -0
  692. package/src/scene/updateLayerCount.js +22 -0
  693. package/src/scene/updateWorldMatrix.js +43 -0
  694. package/src/scene/worldMatrixChanged.js +18 -0
  695. package/src/shaders/materialBaseShader.js +17 -0
  696. package/src/shaders/materialShaders.js +130 -0
  697. package/src/shaders/materialSurfaceShader.js +47 -0
  698. package/src/shaders/materialVertexShader.js +72 -0
  699. package/src/shaders/roofVertexShader.js +9 -0
  700. package/src/shaders/validateRoofMaterial.js +10 -0
  701. package/src/shadows/bindSunlight.js +21 -0
  702. package/src/shadows/drawShadowMeshes.js +58 -0
  703. package/src/shadows/ensureShadowPipeline.js +64 -0
  704. package/src/shadows/meshShadowBounds.js +24 -0
  705. package/src/shadows/renderSunlight.js +48 -0
  706. package/src/shadows/resizeSunlight.js +21 -0
  707. package/src/shadows/shadowBounds.js +23 -0
  708. package/src/shadows/shadowCacheMatches.js +17 -0
  709. package/src/shadows/shadowMatrix.js +49 -0
  710. package/src/shadows/shadowMeshMatches.js +11 -0
  711. package/src/sources/addGeneratedTriangle.js +7 -0
  712. package/src/sources/addTriangle.js +17 -0
  713. package/src/sources/attachAreaMesh.js +64 -0
  714. package/src/sources/buildArea.js +46 -0
  715. package/src/sources/buildAreaFeature.js +36 -0
  716. package/src/sources/buildAreaPoint.js +25 -0
  717. package/src/sources/buildAreaPolygon.js +29 -0
  718. package/src/sources/compareAreaDistance.js +3 -0
  719. package/src/sources/extrusionStyle.js +10 -0
  720. package/src/sources/featureAnchor.js +9 -0
  721. package/src/sources/generateTreeGeometry.js +13 -0
  722. package/src/sources/groundOffset.js +3 -0
  723. package/src/sources/initializeGeoJSON.js +10 -0
  724. package/src/sources/instanceAreaGeometry.js +31 -0
  725. package/src/sources/pendingSourceAreas.js +20 -0
  726. package/src/sources/projectRing.js +27 -0
  727. package/src/sources/projectedTree.js +19 -0
  728. package/src/sources/pump.js +44 -0
  729. package/src/sources/releaseArea.js +25 -0
  730. package/src/sources/setGeoJSONData.js +15 -0
  731. package/src/sources/setGeoJSONLayerData.js +5 -0
  732. package/src/sources/sourceAreaContext.js +19 -0
  733. package/src/sources/updateArea.js +52 -0
  734. package/src/sources/updateStatus.js +15 -0
  735. package/src/sunlight/addTimeLayer.js +6 -0
  736. package/src/sunlight/addTo.js +11 -0
  737. package/src/sunlight/atmosphere.js +25 -0
  738. package/src/sunlight/createSun.js +54 -0
  739. package/src/sunlight/horizontalPosition.js +16 -0
  740. package/src/sunlight/initSunlight.js +17 -0
  741. package/src/sunlight/initialize.js +14 -0
  742. package/src/sunlight/mix.js +7 -0
  743. package/src/sunlight/moonPosition.js +18 -0
  744. package/src/sunlight/onAdd.js +5 -0
  745. package/src/sunlight/onAddSun.js +27 -0
  746. package/src/sunlight/onRemoveSun.js +10 -0
  747. package/src/sunlight/projectCelestialBody.js +13 -0
  748. package/src/sunlight/remove.js +8 -0
  749. package/src/sunlight/removeSun.js +21 -0
  750. package/src/sunlight/removeTimeLayer.js +7 -0
  751. package/src/sunlight/render.js +9 -0
  752. package/src/sunlight/rgb.js +8 -0
  753. package/src/sunlight/solarPosition.js +18 -0
  754. package/src/sunlight/solarTime.js +11 -0
  755. package/src/sunlight/styleTimeControl.js +7 -0
  756. package/src/sunlight/tickSun.js +5 -0
  757. package/src/sunlight/updateCelestialDisc.js +12 -0
  758. package/src/sunlight/updateSky.js +17 -0
  759. package/src/sunlight/updateSun.js +40 -0
  760. package/src/sunlight/useLiveTime.js +6 -0
  761. package/src/sunlight/useSelectedTime.js +23 -0
  762. package/src/terrain/applyTerrain.js +21 -0
  763. package/src/terrain/clearLayerTerrain.js +8 -0
  764. package/src/terrain/copyTerrainTile.js +12 -0
  765. package/src/terrain/getElevation.js +14 -0
  766. package/src/terrain/initTerrain.js +23 -0
  767. package/src/terrain/loadReadyTerrain.js +5 -0
  768. package/src/terrain/loadTerrain.js +43 -0
  769. package/src/terrain/loadTerrainTiles.js +17 -0
  770. package/src/terrain/onTerrainAdd.js +25 -0
  771. package/src/terrain/onTerrainChange.js +17 -0
  772. package/src/terrain/onTerrainRemove.js +45 -0
  773. package/src/terrain/rasterProgram.js +51 -0
  774. package/src/terrain/readBridges.js +4 -0
  775. package/src/terrain/sample.js +7 -0
  776. package/src/terrain/setLayerTerrain.js +8 -0
  777. package/src/terrain/setTerrainHeight.js +14 -0
  778. package/src/terrain/terrainAtlas.js +17 -0
  779. package/src/terrain/terrainBuffers.js +27 -0
  780. package/src/terrain/terrainElevation.js +15 -0
  781. package/src/terrain/terrainGrid.js +32 -0
  782. package/src/terrain/terrainTileQueue.js +25 -0
  783. package/src/traffic/addTraffic.js +10 -0
  784. package/src/traffic/along.js +20 -0
  785. package/src/traffic/appendRouteDash.js +15 -0
  786. package/src/traffic/appendRouteSegment.js +15 -0
  787. package/src/traffic/clockMinutes.js +6 -0
  788. package/src/traffic/compareDepartures.js +5 -0
  789. package/src/traffic/createTrafficMesh.js +7 -0
  790. package/src/traffic/destroyTrafficGpu.js +7 -0
  791. package/src/traffic/disposeTrafficObject.js +16 -0
  792. package/src/traffic/drawTrafficRoute.js +9 -0
  793. package/src/traffic/failTraffic.js +6 -0
  794. package/src/traffic/failedTrafficLoad.js +5 -0
  795. package/src/traffic/fetchTrafficLanes.js +10 -0
  796. package/src/traffic/groundTraffic.js +19 -0
  797. package/src/traffic/initTraffic.js +66 -0
  798. package/src/traffic/loadTraffic.js +15 -0
  799. package/src/traffic/loadedTrafficLanes.js +16 -0
  800. package/src/traffic/locateTraffic.js +11 -0
  801. package/src/traffic/moveTraffic.js +15 -0
  802. package/src/traffic/placeTraffic.js +21 -0
  803. package/src/traffic/prepareTraffic.js +30 -0
  804. package/src/traffic/readyTraffic.js +6 -0
  805. package/src/traffic/rebaseTraffic.js +60 -0
  806. package/src/traffic/rebuildTrafficMesh.js +32 -0
  807. package/src/traffic/refreshTrafficTrips.js +32 -0
  808. package/src/traffic/removeTraffic.js +20 -0
  809. package/src/traffic/routeColor.js +6 -0
  810. package/src/traffic/routeGeometry.js +21 -0
  811. package/src/traffic/scheduledTrips.js +51 -0
  812. package/src/traffic/startTraffic.js +8 -0
  813. package/src/traffic/tickTraffic.js +26 -0
  814. package/src/traffic/toLanes.js +24 -0
  815. package/src/traffic/tooltip.js +9 -0
  816. package/src/traffic/trafficBounds.js +21 -0
  817. package/src/traffic/trafficNow.js +10 -0
  818. package/src/traffic/trafficStatusText.js +5 -0
  819. package/src/traffic/trafficStorage.js +5 -0
  820. package/src/traffic/tripsAt.js +27 -0
  821. package/src/traffic/updateTraffic.js +11 -0
  822. package/src/traffic/updateTrafficLights.js +16 -0
  823. package/src/traffic/updateTrafficPose.js +8 -0
  824. package/src/traffic/updateTrafficTerrain.js +12 -0
  825. package/src/traffic/uploadTrafficLanes.js +21 -0
  826. package/src/traffic/vehicleOffsets.js +12 -0
  827. package/src/triangulation/area.js +9 -0
  828. package/src/triangulation/clean.js +18 -0
  829. package/src/triangulation/clipEars.js +23 -0
  830. package/src/triangulation/connectHole.js +18 -0
  831. package/src/triangulation/containsVertex.js +11 -0
  832. package/src/triangulation/cross.js +3 -0
  833. package/src/triangulation/crossesBoundary.js +8 -0
  834. package/src/triangulation/crossesRing.js +9 -0
  835. package/src/triangulation/equal.js +3 -0
  836. package/src/triangulation/inside.js +10 -0
  837. package/src/triangulation/insideHole.js +7 -0
  838. package/src/triangulation/intersects.js +11 -0
  839. package/src/triangulation/isClockWise.js +13 -0
  840. package/src/triangulation/mergeHoles.js +11 -0
  841. package/src/triangulation/minimumX.js +6 -0
  842. package/src/triangulation/on.js +4 -0
  843. package/src/triangulation/polygonRings.js +14 -0
  844. package/src/triangulation/sortHoles.js +21 -0
  845. package/src/triangulation/triangulate.js +48 -0
  846. package/src/triangulation/validateArea.js +10 -0
  847. package/src/utils/channel.js +2 -2
  848. package/src/utils/compareDistance.js +3 -0
  849. package/src/utils/noOperation.js +1 -0
  850. package/src/utils/parseColor.js +4 -4
  851. package/src/utils/toSRGB.js +3 -1
  852. package/src/utils/wrap.js +3 -1
  853. package/src/vehicles/bicycleModel.js +24 -0
  854. package/src/vehicles/boatBenches.js +9 -0
  855. package/src/vehicles/boatModel.js +35 -0
  856. package/src/vehicles/busModel.js +6 -0
  857. package/src/vehicles/carModel.js +38 -0
  858. package/src/vehicles/carriage.js +20 -0
  859. package/src/vehicles/metroModel.js +9 -0
  860. package/src/vehicles/mirror.js +8 -0
  861. package/src/vehicles/pedestrianModel.js +18 -0
  862. package/src/vehicles/tramModel.js +9 -0
  863. package/src/walk/blocked.js +6 -0
  864. package/src/walk/createWalk.js +66 -0
  865. package/src/walk/initWalk.js +19 -0
  866. package/src/walk/initialize.js +7 -0
  867. package/src/walk/land.js +32 -0
  868. package/src/walk/local.js +18 -0
  869. package/src/walk/moveWalker.js +23 -0
  870. package/src/walk/onAdd.js +29 -0
  871. package/src/walk/onBlur.js +3 -0
  872. package/src/walk/onKey.js +15 -0
  873. package/src/walk/onPointer.js +18 -0
  874. package/src/walk/onRemove.js +12 -0
  875. package/src/walk/onTerrain.js +5 -0
  876. package/src/walk/place.js +20 -0
  877. package/src/walk/start.js +46 -0
  878. package/src/walk/step.js +45 -0
  879. package/src/walk/stepWalkerHeight.js +11 -0
  880. package/src/walk/stop.js +30 -0
  881. package/src/walk/toggle.js +6 -0
  882. package/src/walk/updateWalkerView.js +22 -0
  883. package/dist/utils/CELL.js +0 -2
  884. package/dist/utils/CELL.js.map +0 -7
  885. package/dist/utils/addBridges.js +0 -2
  886. package/dist/utils/addBridges.js.map +0 -7
  887. package/dist/utils/addRasterTile.js +0 -2
  888. package/dist/utils/addRasterTile.js.map +0 -7
  889. package/dist/utils/along.js +0 -2
  890. package/dist/utils/along.js.map +0 -7
  891. package/dist/utils/atmosphere.js +0 -2
  892. package/dist/utils/atmosphere.js.map +0 -7
  893. package/dist/utils/attach.js +0 -2
  894. package/dist/utils/attach.js.map +0 -7
  895. package/dist/utils/bindSunlight.js +0 -2
  896. package/dist/utils/bindSunlight.js.map +0 -7
  897. package/dist/utils/box.js +0 -2
  898. package/dist/utils/box.js.map +0 -7
  899. package/dist/utils/bridgeElevation.js +0 -2
  900. package/dist/utils/bridgeElevation.js.map +0 -7
  901. package/dist/utils/build.js +0 -2
  902. package/dist/utils/build.js.map +0 -7
  903. package/dist/utils/cameraControls.js +0 -2
  904. package/dist/utils/cameraControls.js.map +0 -7
  905. package/dist/utils/channel.js +0 -2
  906. package/dist/utils/channel.js.map +0 -7
  907. package/dist/utils/collider.js +0 -2
  908. package/dist/utils/collider.js.map +0 -7
  909. package/dist/utils/colliders.js +0 -2
  910. package/dist/utils/colliders.js.map +0 -7
  911. package/dist/utils/computeBounds.js +0 -2
  912. package/dist/utils/computeBounds.js.map +0 -7
  913. package/dist/utils/conformModelToTerrain.js +0 -2
  914. package/dist/utils/conformModelToTerrain.js.map +0 -7
  915. package/dist/utils/createMesh.js +0 -2
  916. package/dist/utils/createMesh.js.map +0 -7
  917. package/dist/utils/createProgram.js +0 -3
  918. package/dist/utils/createProgram.js.map +0 -7
  919. package/dist/utils/decodeDirectory.js +0 -2
  920. package/dist/utils/decodeDirectory.js.map +0 -7
  921. package/dist/utils/decodeHeader.js +0 -2
  922. package/dist/utils/decodeHeader.js.map +0 -7
  923. package/dist/utils/decodeModel.js +0 -2
  924. package/dist/utils/decodeModel.js.map +0 -7
  925. package/dist/utils/decompress.js +0 -2
  926. package/dist/utils/decompress.js.map +0 -7
  927. package/dist/utils/destroyTexture.js +0 -2
  928. package/dist/utils/destroyTexture.js.map +0 -7
  929. package/dist/utils/disposeMesh.js +0 -2
  930. package/dist/utils/disposeMesh.js.map +0 -7
  931. package/dist/utils/drawGeometry.js +0 -2
  932. package/dist/utils/drawGeometry.js.map +0 -7
  933. package/dist/utils/elevationWGSL.js +0 -24
  934. package/dist/utils/elevationWGSL.js.map +0 -7
  935. package/dist/utils/emptyNode.js +0 -2
  936. package/dist/utils/emptyNode.js.map +0 -7
  937. package/dist/utils/endZoom.js +0 -2
  938. package/dist/utils/endZoom.js.map +0 -7
  939. package/dist/utils/findFeature.js +0 -2
  940. package/dist/utils/findFeature.js.map +0 -7
  941. package/dist/utils/geometry.js +0 -1
  942. package/dist/utils/geometry.js.map +0 -7
  943. package/dist/utils/getElevation.js +0 -2
  944. package/dist/utils/getElevation.js.map +0 -7
  945. package/dist/utils/getHeader.js +0 -2
  946. package/dist/utils/getHeader.js.map +0 -7
  947. package/dist/utils/getZxy.js +0 -2
  948. package/dist/utils/getZxy.js.map +0 -7
  949. package/dist/utils/glass.js +0 -2
  950. package/dist/utils/glass.js.map +0 -7
  951. package/dist/utils/headlight.js +0 -2
  952. package/dist/utils/headlight.js.map +0 -7
  953. package/dist/utils/hit.js +0 -2
  954. package/dist/utils/hit.js.map +0 -7
  955. package/dist/utils/horizontalPosition.js +0 -2
  956. package/dist/utils/horizontalPosition.js.map +0 -7
  957. package/dist/utils/horizontalRay.js +0 -2
  958. package/dist/utils/horizontalRay.js.map +0 -7
  959. package/dist/utils/hull.js +0 -2
  960. package/dist/utils/hull.js.map +0 -7
  961. package/dist/utils/initSunlight.js +0 -2
  962. package/dist/utils/initSunlight.js.map +0 -7
  963. package/dist/utils/initTerrain.js +0 -2
  964. package/dist/utils/initTerrain.js.map +0 -7
  965. package/dist/utils/initTraffic.js +0 -40
  966. package/dist/utils/initTraffic.js.map +0 -7
  967. package/dist/utils/initWalk.js +0 -2
  968. package/dist/utils/initWalk.js.map +0 -7
  969. package/dist/utils/intersectMeshes.js +0 -2
  970. package/dist/utils/intersectMeshes.js.map +0 -7
  971. package/dist/utils/isClockWise.js +0 -2
  972. package/dist/utils/isClockWise.js.map +0 -7
  973. package/dist/utils/lampPostGeometry.js +0 -2
  974. package/dist/utils/lampPostGeometry.js.map +0 -7
  975. package/dist/utils/lightGeometry.js +0 -2
  976. package/dist/utils/lightGeometry.js.map +0 -7
  977. package/dist/utils/lightGrid.js +0 -2
  978. package/dist/utils/lightGrid.js.map +0 -7
  979. package/dist/utils/limbs.js +0 -2
  980. package/dist/utils/limbs.js.map +0 -7
  981. package/dist/utils/loadModel.js +0 -2
  982. package/dist/utils/loadModel.js.map +0 -7
  983. package/dist/utils/loadSource.js +0 -2
  984. package/dist/utils/loadSource.js.map +0 -7
  985. package/dist/utils/loadTerrain.js +0 -2
  986. package/dist/utils/loadTerrain.js.map +0 -7
  987. package/dist/utils/mapCamera.js +0 -2
  988. package/dist/utils/mapCamera.js.map +0 -7
  989. package/dist/utils/materialShaders.js +0 -211
  990. package/dist/utils/materialShaders.js.map +0 -7
  991. package/dist/utils/mirror.js +0 -2
  992. package/dist/utils/mirror.js.map +0 -7
  993. package/dist/utils/moonPosition.js +0 -2
  994. package/dist/utils/moonPosition.js.map +0 -7
  995. package/dist/utils/moves.js +0 -2
  996. package/dist/utils/moves.js.map +0 -7
  997. package/dist/utils/nativeEvents.js +0 -2
  998. package/dist/utils/nativeEvents.js.map +0 -7
  999. package/dist/utils/nativeGeometry.js +0 -2
  1000. package/dist/utils/nativeGeometry.js.map +0 -7
  1001. package/dist/utils/nativeLayer.js +0 -2
  1002. package/dist/utils/nativeLayer.js.map +0 -7
  1003. package/dist/utils/nodeMatrix.js +0 -2
  1004. package/dist/utils/nodeMatrix.js.map +0 -7
  1005. package/dist/utils/onAdd3DLayer.js +0 -2
  1006. package/dist/utils/onAdd3DLayer.js.map +0 -7
  1007. package/dist/utils/onAddSun.js +0 -2
  1008. package/dist/utils/onAddSun.js.map +0 -7
  1009. package/dist/utils/onClick.js +0 -2
  1010. package/dist/utils/onClick.js.map +0 -7
  1011. package/dist/utils/onMapChange.js +0 -2
  1012. package/dist/utils/onMapChange.js.map +0 -7
  1013. package/dist/utils/onPMTileAdd.js +0 -2
  1014. package/dist/utils/onPMTileAdd.js.map +0 -7
  1015. package/dist/utils/onPMTileRemove.js +0 -2
  1016. package/dist/utils/onPMTileRemove.js.map +0 -7
  1017. package/dist/utils/onPointerLeave.js +0 -2
  1018. package/dist/utils/onPointerLeave.js.map +0 -7
  1019. package/dist/utils/onPointerMove.js +0 -2
  1020. package/dist/utils/onPointerMove.js.map +0 -7
  1021. package/dist/utils/onRemove3DLayer.js +0 -2
  1022. package/dist/utils/onRemove3DLayer.js.map +0 -7
  1023. package/dist/utils/onRemoveSun.js +0 -2
  1024. package/dist/utils/onRemoveSun.js.map +0 -7
  1025. package/dist/utils/onTerrainAdd.js +0 -2
  1026. package/dist/utils/onTerrainAdd.js.map +0 -7
  1027. package/dist/utils/onTerrainChange.js +0 -2
  1028. package/dist/utils/onTerrainChange.js.map +0 -7
  1029. package/dist/utils/onTerrainRemove.js +0 -2
  1030. package/dist/utils/onTerrainRemove.js.map +0 -7
  1031. package/dist/utils/onZoomAnim.js +0 -2
  1032. package/dist/utils/onZoomAnim.js.map +0 -7
  1033. package/dist/utils/paints.js +0 -2
  1034. package/dist/utils/paints.js.map +0 -7
  1035. package/dist/utils/parseColor.js +0 -2
  1036. package/dist/utils/parseColor.js.map +0 -7
  1037. package/dist/utils/parts.js +0 -2
  1038. package/dist/utils/parts.js.map +0 -7
  1039. package/dist/utils/projectCelestialBody.js +0 -2
  1040. package/dist/utils/projectCelestialBody.js.map +0 -7
  1041. package/dist/utils/pump.js +0 -2
  1042. package/dist/utils/pump.js.map +0 -7
  1043. package/dist/utils/rasterTiles.js +0 -2
  1044. package/dist/utils/rasterTiles.js.map +0 -7
  1045. package/dist/utils/raycast.js +0 -2
  1046. package/dist/utils/raycast.js.map +0 -7
  1047. package/dist/utils/read.js +0 -2
  1048. package/dist/utils/read.js.map +0 -7
  1049. package/dist/utils/readAccessor.js +0 -2
  1050. package/dist/utils/readAccessor.js.map +0 -7
  1051. package/dist/utils/releaseArea.js +0 -2
  1052. package/dist/utils/releaseArea.js.map +0 -7
  1053. package/dist/utils/removeRasterTile.js +0 -2
  1054. package/dist/utils/removeRasterTile.js.map +0 -7
  1055. package/dist/utils/render.js +0 -15
  1056. package/dist/utils/render.js.map +0 -7
  1057. package/dist/utils/renderSunlight.js +0 -13
  1058. package/dist/utils/renderSunlight.js.map +0 -7
  1059. package/dist/utils/renderers.js +0 -2
  1060. package/dist/utils/renderers.js.map +0 -7
  1061. package/dist/utils/resizeSunlight.js +0 -2
  1062. package/dist/utils/resizeSunlight.js.map +0 -7
  1063. package/dist/utils/roofCoverage.js +0 -2
  1064. package/dist/utils/roofCoverage.js.map +0 -7
  1065. package/dist/utils/routeGeometry.js +0 -2
  1066. package/dist/utils/routeGeometry.js.map +0 -7
  1067. package/dist/utils/scheduledTrips.js +0 -2
  1068. package/dist/utils/scheduledTrips.js.map +0 -7
  1069. package/dist/utils/setGeoJSONData.js +0 -2
  1070. package/dist/utils/setGeoJSONData.js.map +0 -7
  1071. package/dist/utils/setHighlight.js +0 -2
  1072. package/dist/utils/setHighlight.js.map +0 -7
  1073. package/dist/utils/setPMTileOpacity.js +0 -2
  1074. package/dist/utils/setPMTileOpacity.js.map +0 -7
  1075. package/dist/utils/setPMTileZIndex.js +0 -2
  1076. package/dist/utils/setPMTileZIndex.js.map +0 -7
  1077. package/dist/utils/setParent.js +0 -2
  1078. package/dist/utils/setParent.js.map +0 -7
  1079. package/dist/utils/setTerrainHeight.js +0 -2
  1080. package/dist/utils/setTerrainHeight.js.map +0 -7
  1081. package/dist/utils/setVertexColor.js +0 -2
  1082. package/dist/utils/setVertexColor.js.map +0 -7
  1083. package/dist/utils/showFeature.js +0 -2
  1084. package/dist/utils/showFeature.js.map +0 -7
  1085. package/dist/utils/sizes.js +0 -2
  1086. package/dist/utils/sizes.js.map +0 -7
  1087. package/dist/utils/skin.js +0 -2
  1088. package/dist/utils/skin.js.map +0 -7
  1089. package/dist/utils/solarPosition.js +0 -2
  1090. package/dist/utils/solarPosition.js.map +0 -7
  1091. package/dist/utils/sortMeshes.js +0 -2
  1092. package/dist/utils/sortMeshes.js.map +0 -7
  1093. package/dist/utils/speed.js +0 -2
  1094. package/dist/utils/speed.js.map +0 -7
  1095. package/dist/utils/startZoom.js +0 -2
  1096. package/dist/utils/startZoom.js.map +0 -7
  1097. package/dist/utils/taillight.js +0 -2
  1098. package/dist/utils/taillight.js.map +0 -7
  1099. package/dist/utils/terrainAtlas.js +0 -2
  1100. package/dist/utils/terrainAtlas.js.map +0 -7
  1101. package/dist/utils/terrainElevation.js +0 -2
  1102. package/dist/utils/terrainElevation.js.map +0 -7
  1103. package/dist/utils/terrainGrid.js +0 -2
  1104. package/dist/utils/terrainGrid.js.map +0 -7
  1105. package/dist/utils/textureSampler.js +0 -2
  1106. package/dist/utils/textureSampler.js.map +0 -7
  1107. package/dist/utils/tileId.js +0 -2
  1108. package/dist/utils/tileId.js.map +0 -7
  1109. package/dist/utils/toLanes.js +0 -2
  1110. package/dist/utils/toLanes.js.map +0 -7
  1111. package/dist/utils/toSRGB.js +0 -2
  1112. package/dist/utils/toSRGB.js.map +0 -7
  1113. package/dist/utils/tooltip.js +0 -3
  1114. package/dist/utils/tooltip.js.map +0 -7
  1115. package/dist/utils/traffic.js +0 -2
  1116. package/dist/utils/traffic.js.map +0 -7
  1117. package/dist/utils/traverse.js +0 -2
  1118. package/dist/utils/traverse.js.map +0 -7
  1119. package/dist/utils/treeGeometry.js +0 -2
  1120. package/dist/utils/treeGeometry.js.map +0 -7
  1121. package/dist/utils/triangulate.js +0 -2
  1122. package/dist/utils/triangulate.js.map +0 -7
  1123. package/dist/utils/tripsAt.js +0 -2
  1124. package/dist/utils/tripsAt.js.map +0 -7
  1125. package/dist/utils/types.js +0 -2
  1126. package/dist/utils/types.js.map +0 -7
  1127. package/dist/utils/underEntry.js +0 -2
  1128. package/dist/utils/underEntry.js.map +0 -7
  1129. package/dist/utils/update.js +0 -2
  1130. package/dist/utils/update.js.map +0 -7
  1131. package/dist/utils/updateArea.js +0 -2
  1132. package/dist/utils/updateArea.js.map +0 -7
  1133. package/dist/utils/updateCamera.js +0 -2
  1134. package/dist/utils/updateCamera.js.map +0 -7
  1135. package/dist/utils/updatePointLights.js +0 -2
  1136. package/dist/utils/updatePointLights.js.map +0 -7
  1137. package/dist/utils/updateWorldMatrix.js +0 -2
  1138. package/dist/utils/updateWorldMatrix.js.map +0 -7
  1139. package/dist/utils/vehicleOffsets.js +0 -2
  1140. package/dist/utils/vehicleOffsets.js.map +0 -7
  1141. package/dist/utils/vehicles.js +0 -2
  1142. package/dist/utils/vehicles.js.map +0 -7
  1143. package/dist/utils/vertexNormals.js +0 -2
  1144. package/dist/utils/vertexNormals.js.map +0 -7
  1145. package/dist/utils/walk.js +0 -2
  1146. package/dist/utils/walk.js.map +0 -7
  1147. package/dist/utils/white.js +0 -2
  1148. package/dist/utils/white.js.map +0 -7
  1149. package/dist/utils/worldLights.js +0 -2
  1150. package/dist/utils/worldLights.js.map +0 -7
  1151. package/dist/utils/wrap.js +0 -2
  1152. package/dist/utils/wrap.js.map +0 -7
  1153. package/src/utils/CELL.js +0 -4
  1154. package/src/utils/addBridges.js +0 -66
  1155. package/src/utils/addRasterTile.js +0 -112
  1156. package/src/utils/along.js +0 -9
  1157. package/src/utils/atmosphere.js +0 -20
  1158. package/src/utils/attach.js +0 -255
  1159. package/src/utils/bindSunlight.js +0 -12
  1160. package/src/utils/box.js +0 -1
  1161. package/src/utils/bridgeElevation.js +0 -18
  1162. package/src/utils/build.js +0 -20
  1163. package/src/utils/cameraControls.js +0 -287
  1164. package/src/utils/collider.js +0 -62
  1165. package/src/utils/colliders.js +0 -2
  1166. package/src/utils/computeBounds.js +0 -17
  1167. package/src/utils/conformModelToTerrain.js +0 -69
  1168. package/src/utils/createMesh.js +0 -31
  1169. package/src/utils/createProgram.js +0 -92
  1170. package/src/utils/decodeDirectory.js +0 -40
  1171. package/src/utils/decodeHeader.js +0 -15
  1172. package/src/utils/decodeModel.js +0 -43
  1173. package/src/utils/decompress.js +0 -5
  1174. package/src/utils/destroyTexture.js +0 -7
  1175. package/src/utils/disposeMesh.js +0 -13
  1176. package/src/utils/drawGeometry.js +0 -122
  1177. package/src/utils/elevationWGSL.js +0 -27
  1178. package/src/utils/emptyNode.js +0 -9
  1179. package/src/utils/endZoom.js +0 -15
  1180. package/src/utils/findFeature.js +0 -49
  1181. package/src/utils/geometry.js +0 -2
  1182. package/src/utils/getElevation.js +0 -10
  1183. package/src/utils/getHeader.js +0 -9
  1184. package/src/utils/getZxy.js +0 -76
  1185. package/src/utils/glass.js +0 -1
  1186. package/src/utils/hit.js +0 -41
  1187. package/src/utils/horizontalPosition.js +0 -16
  1188. package/src/utils/hull.js +0 -1
  1189. package/src/utils/initSunlight.js +0 -9
  1190. package/src/utils/initTerrain.js +0 -19
  1191. package/src/utils/initTraffic.js +0 -93
  1192. package/src/utils/initWalk.js +0 -72
  1193. package/src/utils/intersectMeshes.js +0 -121
  1194. package/src/utils/isClockWise.js +0 -12
  1195. package/src/utils/lampPostGeometry.js +0 -26
  1196. package/src/utils/lightGeometry.js +0 -22
  1197. package/src/utils/lightGrid.js +0 -50
  1198. package/src/utils/limbs.js +0 -9
  1199. package/src/utils/loadModel.js +0 -217
  1200. package/src/utils/loadSource.js +0 -17
  1201. package/src/utils/loadTerrain.js +0 -65
  1202. package/src/utils/mapCamera.js +0 -432
  1203. package/src/utils/materialShaders.js +0 -243
  1204. package/src/utils/mirror.js +0 -6
  1205. package/src/utils/moonPosition.js +0 -17
  1206. package/src/utils/nativeEvents.js +0 -77
  1207. package/src/utils/nativeGeometry.js +0 -131
  1208. package/src/utils/nativeLayer.js +0 -317
  1209. package/src/utils/nodeMatrix.js +0 -22
  1210. package/src/utils/onAdd3DLayer.js +0 -31
  1211. package/src/utils/onAddSun.js +0 -147
  1212. package/src/utils/onClick.js +0 -13
  1213. package/src/utils/onMapChange.js +0 -16
  1214. package/src/utils/onPMTileAdd.js +0 -15
  1215. package/src/utils/onPMTileRemove.js +0 -8
  1216. package/src/utils/onPointerLeave.js +0 -11
  1217. package/src/utils/onPointerMove.js +0 -15
  1218. package/src/utils/onRemove3DLayer.js +0 -78
  1219. package/src/utils/onRemoveSun.js +0 -3
  1220. package/src/utils/onTerrainAdd.js +0 -18
  1221. package/src/utils/onTerrainChange.js +0 -13
  1222. package/src/utils/onTerrainRemove.js +0 -40
  1223. package/src/utils/onZoomAnim.js +0 -14
  1224. package/src/utils/parts.js +0 -16
  1225. package/src/utils/projectCelestialBody.js +0 -13
  1226. package/src/utils/pump.js +0 -226
  1227. package/src/utils/rasterTiles.js +0 -285
  1228. package/src/utils/raycast.js +0 -60
  1229. package/src/utils/read.js +0 -29
  1230. package/src/utils/readAccessor.js +0 -68
  1231. package/src/utils/releaseArea.js +0 -34
  1232. package/src/utils/removeRasterTile.js +0 -13
  1233. package/src/utils/render.js +0 -406
  1234. package/src/utils/renderSunlight.js +0 -170
  1235. package/src/utils/resizeSunlight.js +0 -15
  1236. package/src/utils/roofCoverage.js +0 -47
  1237. package/src/utils/routeGeometry.js +0 -22
  1238. package/src/utils/scheduledTrips.js +0 -29
  1239. package/src/utils/setGeoJSONData.js +0 -11
  1240. package/src/utils/setHighlight.js +0 -13
  1241. package/src/utils/setPMTileOpacity.js +0 -7
  1242. package/src/utils/setPMTileZIndex.js +0 -7
  1243. package/src/utils/setTerrainHeight.js +0 -10
  1244. package/src/utils/setVertexColor.js +0 -14
  1245. package/src/utils/showFeature.js +0 -27
  1246. package/src/utils/sizes.js +0 -1
  1247. package/src/utils/skin.js +0 -2
  1248. package/src/utils/solarPosition.js +0 -17
  1249. package/src/utils/sortMeshes.js +0 -12
  1250. package/src/utils/startZoom.js +0 -5
  1251. package/src/utils/terrainAtlas.js +0 -21
  1252. package/src/utils/terrainElevation.js +0 -20
  1253. package/src/utils/terrainGrid.js +0 -23
  1254. package/src/utils/textureSampler.js +0 -10
  1255. package/src/utils/tileId.js +0 -18
  1256. package/src/utils/toLanes.js +0 -7
  1257. package/src/utils/tooltip.js +0 -6
  1258. package/src/utils/traffic.js +0 -315
  1259. package/src/utils/traverse.js +0 -6
  1260. package/src/utils/treeGeometry.js +0 -45
  1261. package/src/utils/triangulate.js +0 -100
  1262. package/src/utils/tripsAt.js +0 -16
  1263. package/src/utils/underEntry.js +0 -17
  1264. package/src/utils/update.js +0 -18
  1265. package/src/utils/updateArea.js +0 -40
  1266. package/src/utils/updateCamera.js +0 -32
  1267. package/src/utils/updatePointLights.js +0 -38
  1268. package/src/utils/updateWorldMatrix.js +0 -47
  1269. package/src/utils/vehicleOffsets.js +0 -8
  1270. package/src/utils/vehicles.js +0 -65
  1271. package/src/utils/vertexNormals.js +0 -30
  1272. package/src/utils/walk.js +0 -187
  1273. package/src/utils/worldLights.js +0 -25
  1274. /package/src/{utils → collision}/horizontalRay.js +0 -0
  1275. /package/src/{utils → globals}/headlight.js +0 -0
  1276. /package/src/{utils → globals}/moves.js +0 -0
  1277. /package/src/{utils → globals}/paints.js +0 -0
  1278. /package/src/{utils → globals}/renderers.js +0 -0
  1279. /package/src/{utils → globals}/speed.js +0 -0
  1280. /package/src/{utils → globals}/taillight.js +0 -0
  1281. /package/src/{utils → globals}/types.js +0 -0
  1282. /package/src/{utils → globals}/white.js +0 -0
  1283. /package/src/{utils → scene}/setParent.js +0 -0
@@ -0,0 +1,1128 @@
1
+ // Leaflet-compatible classes backed by OpenLayers. Load after ol.js and before the plugin.
2
+ (() => {
3
+ if (!window.ol) throw new Error('Unable to load OpenLayers');
4
+
5
+ const style = document.createElement('style');
6
+ style.dataset.openlayersBindings = '';
7
+ style.textContent = `
8
+ .openlayers-city-mapper {
9
+ position: relative;
10
+ overflow: hidden;
11
+ touch-action: none;
12
+ }
13
+ .ol-viewport {
14
+ position: absolute !important;
15
+ inset: 0;
16
+ }
17
+ .ol-overlaycontainer-stopevent { z-index: 1000 !important; }
18
+ .ol-city-corner {
19
+ position: absolute;
20
+ display: flex;
21
+ flex-direction: column;
22
+ gap: .5em;
23
+ pointer-events: none;
24
+ }
25
+ .ol-city-topleft { top: 5em; left: .5em; }
26
+ .ol-city-topright { top: 10px; right: 10px; }
27
+ .ol-city-bottomleft { bottom: .5em; left: .5em; }
28
+ .ol-city-bottomright { bottom: 4em; right: .5em; }
29
+ .ol-attribution {
30
+ text-align: justify;
31
+ border-radius: 0 !important;
32
+ left: 0;
33
+ right: 0 !important;
34
+ max-width: unset;
35
+ font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
36
+ font-size: .75rem;
37
+ line-height: 1.5;
38
+ }
39
+ .ol-attribution a { color: #0078A8; }
40
+ .ol-attribution * { text-shadow: none !important; }
41
+ .ol-city-control {
42
+ position: static;
43
+ pointer-events: auto;
44
+ font: 13px/1.5 sans-serif;
45
+ }
46
+ .ol-city-rotate {
47
+ padding: 0;
48
+ border: 1px solid #0003;
49
+ border-radius: 4px;
50
+ background: #fff;
51
+ background-clip: padding-box;
52
+ }
53
+ .ol-city-rotate a {
54
+ display: block;
55
+ width: 30px;
56
+ height: 30px;
57
+ border-radius: 2px;
58
+ color: #000;
59
+ text-decoration: none;
60
+ }
61
+ .ol-city-rotate a:hover { background: #f4f4f4; }
62
+ .ol-city-rotate a:focus-visible { outline: 2px solid #2675c9; }
63
+ .ol-city-layers {
64
+ max-height: calc(100vh - 5em);
65
+ overflow: auto;
66
+ border-radius: 4px;
67
+ }
68
+ .ol-city-layers section { padding: .5em; background: var(--ol-background-color); }
69
+ .ol-city-layers label { display: block; cursor: pointer; white-space: nowrap; }
70
+ .ol-city-layers input { vertical-align: middle; }
71
+ .ol-city-layers hr { border: 0; border-top: 1px solid #ccc; }
72
+ .ol-city-layers .ol-control { background: transparent; }
73
+ .ol-city-layers .sunlight-time button { width: auto; padding: 0 .4em; flex-shrink: 0; }
74
+ .openlayers-city-mapper .leaflet-pane {
75
+ position: absolute;
76
+ inset: 0;
77
+ pointer-events: none;
78
+ }
79
+ .ol-zoom button { width: 30px; height: 30px; }
80
+ .openlayers-city-mapper .leaflet-marker-icon,
81
+ .openlayers-city-mapper .leaflet-marker-shadow {
82
+ position: absolute;
83
+ top: 0;
84
+ left: 0;
85
+ }
86
+ .openlayers-city-mapper .leaflet-marker-icon { pointer-events: auto; cursor: pointer; }
87
+ .openlayers-city-mapper .leaflet-div-icon { background: #fff; border: 1px solid #666; }
88
+ .ol-city-popup {
89
+ padding: 10px;
90
+ background: white;
91
+ border: 1px solid #888;
92
+ border-radius: 4px;
93
+ font: 14px sans-serif;
94
+ }
95
+ .ol-city-popup button { float: right; margin-left: 12px; }
96
+ .ol-city-tooltip {
97
+ position: absolute;
98
+ z-index: 1100;
99
+ padding: 4px 8px;
100
+ background: white;
101
+ border: 1px solid #888;
102
+ pointer-events: none;
103
+ }
104
+ `;
105
+ document.head.appendChild(style);
106
+
107
+ const L = window.L = { version: '1.9.4-openlayers', control: {} };
108
+ let lastId = 0;
109
+ const stamp = object => object._leaflet_id ||= ++lastId;
110
+ const setOptions = (object, options) => object.options = { ...object.options, ...options };
111
+ const zoomTiming = new Animation(new KeyframeEffect(null, [], {
112
+ duration: 1, fill: 'both', easing: 'cubic-bezier(0,0,0.25,1)',
113
+ }));
114
+
115
+ function Class(...args) {
116
+ this.initialize?.(...args);
117
+ this.callInitHooks();
118
+ }
119
+ Class.extend = function (properties) {
120
+ function Child(...args) {
121
+ this.initialize?.(...args);
122
+ this.callInitHooks();
123
+ }
124
+ Object.setPrototypeOf(Child, this);
125
+ Child.prototype = Object.create(this.prototype);
126
+ Object.assign(Child.prototype, properties, { constructor: Child });
127
+ Child.prototype.options = { ...this.prototype.options, ...properties.options };
128
+ Child.prototype._initHooks = [];
129
+ return Child;
130
+ };
131
+ Class.include = function (properties) { Object.assign(this.prototype, properties); return this; };
132
+ Class.mergeOptions = function (options) {
133
+ this.prototype.options = { ...this.prototype.options, ...options };
134
+ return this;
135
+ };
136
+ Class.addInitHook = function (hook, ...args) {
137
+ if (!Object.hasOwn(this.prototype, '_initHooks')) this.prototype._initHooks = [];
138
+ this.prototype._initHooks.push(typeof hook === 'function' ? hook : function () { this[hook](...args); });
139
+ return this;
140
+ };
141
+ Class.prototype.callInitHooks = function () {
142
+ if (this._initHooksCalled) return;
143
+ this._initHooksCalled = true;
144
+ const prototypes = [];
145
+ for (let proto = Object.getPrototypeOf(this); proto; proto = Object.getPrototypeOf(proto)) prototypes.unshift(proto);
146
+ for (const proto of prototypes) {
147
+ if (Object.hasOwn(proto, '_initHooks')) for (const hook of proto._initHooks) hook.call(this);
148
+ }
149
+ };
150
+ L.Evented = Class.extend({
151
+ on(types, fn, context) {
152
+ if (typeof types === 'object') {
153
+ for (const [type, handler] of Object.entries(types)) this.on(type, handler, fn);
154
+ } else {
155
+ this._events ||= {};
156
+ for (const type of types.split(/\s+/)) {
157
+ const events = this._events[type] ||= [];
158
+ if (!events.some(event => event.fn === fn && event.context === context)) events.push({ fn, context });
159
+ }
160
+ }
161
+ return this;
162
+ },
163
+ off(types, fn, context) {
164
+ if (!types) this._events = {};
165
+ else if (typeof types === 'object') {
166
+ for (const [type, handler] of Object.entries(types)) this.off(type, handler, fn);
167
+ } else {
168
+ for (const type of types.split(/\s+/)) {
169
+ if (this._events?.[type]) this._events[type] = fn
170
+ ? this._events[type].filter(event => event.fn !== fn || event.context !== context) : [];
171
+ }
172
+ }
173
+ return this;
174
+ },
175
+ once(types, fn, context) {
176
+ const handler = event => { this.off(types, handler); fn.call(context || this, event); };
177
+ return this.on(types, handler);
178
+ },
179
+ fire(type, data) {
180
+ for (const event of [...this._events?.[type] || []]) {
181
+ event.fn.call(event.context || this, { ...data, type, target: this, sourceTarget: this });
182
+ }
183
+ return this;
184
+ },
185
+ listens(type) { return Boolean(this._events?.[type]?.length); },
186
+ });
187
+ L.Util = {
188
+ stamp, setOptions,
189
+ throttle(fn, interval, context) {
190
+ let timer, pending;
191
+ const run = (...args) => {
192
+ if (timer) { pending = args; return; }
193
+ fn.apply(context, args);
194
+ timer = setTimeout(() => {
195
+ timer = null;
196
+ if (pending) { const args = pending; pending = null; run(...args); }
197
+ }, interval);
198
+ };
199
+ return run;
200
+ },
201
+ };
202
+
203
+ L.Point = function (x, y, round) {
204
+ this.x = round ? Math.round(x) : x;
205
+ this.y = round ? Math.round(y) : y;
206
+ };
207
+ const point = value => value instanceof L.Point ? value
208
+ : Array.isArray(value) ? new L.Point(...value) : new L.Point(value.x, value.y);
209
+ L.Point.prototype = {
210
+ clone() { return new L.Point(this.x, this.y); },
211
+ add(value) { return this.clone()._add(point(value)); },
212
+ _add(value) { this.x += value.x; this.y += value.y; return this; },
213
+ subtract(value) { return this.clone()._subtract(point(value)); },
214
+ _subtract(value) { this.x -= value.x; this.y -= value.y; return this; },
215
+ multiplyBy(value) { return new L.Point(this.x * value, this.y * value); },
216
+ divideBy(value) { return new L.Point(this.x / value, this.y / value); },
217
+ scaleBy(value) { return new L.Point(this.x * value.x, this.y * value.y); },
218
+ unscaleBy(value) { return new L.Point(this.x / value.x, this.y / value.y); },
219
+ round() { return new L.Point(Math.round(this.x), Math.round(this.y)); },
220
+ floor() { return new L.Point(Math.floor(this.x), Math.floor(this.y)); },
221
+ ceil() { return new L.Point(Math.ceil(this.x), Math.ceil(this.y)); },
222
+ distanceTo(value) { value = point(value); return Math.hypot(this.x - value.x, this.y - value.y); },
223
+ equals(value) { value = point(value); return this.x === value.x && this.y === value.y; },
224
+ contains(value) { value = point(value); return Math.abs(value.x) <= Math.abs(this.x) && Math.abs(value.y) <= Math.abs(this.y); },
225
+ };
226
+ L.LatLng = function (lat, lng, alt) {
227
+ if (!Number.isFinite(Number(lat)) || !Number.isFinite(Number(lng))) throw new Error('Invalid LatLng');
228
+ this.lat = Number(lat); this.lng = Number(lng);
229
+ if (alt !== undefined) this.alt = alt;
230
+ };
231
+ const latLng = value => value instanceof L.LatLng ? value
232
+ : Array.isArray(value) ? new L.LatLng(...value) : new L.LatLng(value.lat, value.lng);
233
+ L.LatLng.prototype = {
234
+ equals(value, margin = 1e-9) {
235
+ value = latLng(value);
236
+ return Math.max(Math.abs(this.lat - value.lat), Math.abs(this.lng - value.lng)) <= margin;
237
+ },
238
+ distanceTo(value) { value = latLng(value); return ol.sphere.getDistance([this.lng, this.lat], [value.lng, value.lat]); },
239
+ wrap() { return new L.LatLng(this.lat, ((this.lng + 180) % 360 + 360) % 360 - 180, this.alt); },
240
+ };
241
+ L.Bounds = function (a, b) {
242
+ if (a) for (const value of b ? [a, b] : Array.isArray(a) ? a : [a]) this.extend(value);
243
+ };
244
+ L.Bounds.prototype = {
245
+ extend(value) {
246
+ if (value instanceof L.Bounds) { this.extend(value.min); this.extend(value.max); return this; }
247
+ value = point(value);
248
+ if (!this.min) { this.min = value.clone(); this.max = value.clone(); }
249
+ else {
250
+ this.min.x = Math.min(this.min.x, value.x); this.min.y = Math.min(this.min.y, value.y);
251
+ this.max.x = Math.max(this.max.x, value.x); this.max.y = Math.max(this.max.y, value.y);
252
+ }
253
+ return this;
254
+ },
255
+ getCenter() { return this.min.add(this.max).divideBy(2); },
256
+ getSize() { return this.max.subtract(this.min); },
257
+ contains(value) {
258
+ const min = value.min || point(value), max = value.max || min;
259
+ return min.x >= this.min.x && max.x <= this.max.x && min.y >= this.min.y && max.y <= this.max.y;
260
+ },
261
+ intersects(value) {
262
+ return value.max.x >= this.min.x && value.min.x <= this.max.x && value.max.y >= this.min.y && value.min.y <= this.max.y;
263
+ },
264
+ };
265
+ L.LatLngBounds = function (a, b) {
266
+ if (a) for (const value of b ? [a, b] : a) this.extend(value);
267
+ };
268
+ L.LatLngBounds.prototype = {
269
+ extend(value) {
270
+ if (value instanceof L.LatLngBounds) { this.extend(value._southWest); this.extend(value._northEast); return this; }
271
+ value = latLng(value);
272
+ if (!this._southWest) {
273
+ this._southWest = new L.LatLng(value.lat, value.lng);
274
+ this._northEast = new L.LatLng(value.lat, value.lng);
275
+ } else {
276
+ this._southWest.lat = Math.min(this._southWest.lat, value.lat);
277
+ this._southWest.lng = Math.min(this._southWest.lng, value.lng);
278
+ this._northEast.lat = Math.max(this._northEast.lat, value.lat);
279
+ this._northEast.lng = Math.max(this._northEast.lng, value.lng);
280
+ }
281
+ return this;
282
+ },
283
+ getSouthWest() { return this._southWest; },
284
+ getNorthEast() { return this._northEast; },
285
+ getNorthWest() { return new L.LatLng(this.getNorth(), this.getWest()); },
286
+ getSouthEast() { return new L.LatLng(this.getSouth(), this.getEast()); },
287
+ getNorth() { return this._northEast.lat; },
288
+ getSouth() { return this._southWest.lat; },
289
+ getEast() { return this._northEast.lng; },
290
+ getWest() { return this._southWest.lng; },
291
+ getCenter() { return new L.LatLng((this.getNorth() + this.getSouth()) / 2, (this.getEast() + this.getWest()) / 2); },
292
+ contains(value) {
293
+ value = latLng(value);
294
+ return value.lat >= this.getSouth() && value.lat <= this.getNorth() && value.lng >= this.getWest() && value.lng <= this.getEast();
295
+ },
296
+ isValid() { return Boolean(this._southWest && this._northEast); },
297
+ };
298
+
299
+ const radius = 6378137, circumference = 2 * Math.PI * radius;
300
+ const crs = {
301
+ scale: zoom => 256 * 2 ** zoom,
302
+ zoom: scale => Math.log2(scale / 256),
303
+ project(value) { value = latLng(value); return point(ol.proj.fromLonLat([value.lng, Math.max(-85.0511287798, Math.min(85.0511287798, value.lat))])); },
304
+ unproject(value) { const [lng, lat] = ol.proj.toLonLat([value.x, value.y]); return new L.LatLng(lat, lng); },
305
+ transformation: {
306
+ transform(value, scale) { return new L.Point((value.x / circumference + 0.5) * scale, (0.5 - value.y / circumference) * scale); },
307
+ untransform(value, scale) { return new L.Point((value.x / scale - 0.5) * circumference, (0.5 - value.y / scale) * circumference); },
308
+ },
309
+ };
310
+
311
+ L.DomUtil = {
312
+ create(tag, className = '', parent) {
313
+ const element = document.createElement(tag);
314
+ element.className = className; parent?.append(element); return element;
315
+ },
316
+ setPosition(element, value) { element._leaflet_pos = point(value); element.style.transform = `translate(${value.x}px,${value.y}px)`; },
317
+ getPosition(element) { return element._leaflet_pos || new L.Point(0, 0); },
318
+ };
319
+ const domListeners = new WeakMap();
320
+ function domEvent(add, element, types, fn, context) {
321
+ if (typeof types === 'object') {
322
+ for (const [type, handler] of Object.entries(types)) domEvent(add, element, type, handler, fn);
323
+ return L.DomEvent;
324
+ }
325
+ let listeners = domListeners.get(element);
326
+ if (!listeners) domListeners.set(element, listeners = []);
327
+ for (const type of types.split(/\s+/)) {
328
+ const existing = listeners.find(item => item.type === type && item.fn === fn && item.context === context);
329
+ if (add && !existing) {
330
+ const handler = context ? fn.bind(context) : fn;
331
+ listeners.push({ type, fn, context, handler });
332
+ element.addEventListener(type, handler, { passive: false });
333
+ } else if (!add && existing) {
334
+ element.removeEventListener(type, existing.handler);
335
+ listeners.splice(listeners.indexOf(existing), 1);
336
+ }
337
+ }
338
+ return L.DomEvent;
339
+ }
340
+ const stopPropagation = event => event.stopPropagation();
341
+ L.DomEvent = {
342
+ on: (...args) => domEvent(true, ...args),
343
+ off: (...args) => domEvent(false, ...args),
344
+ stop(event) { event.preventDefault(); event.stopPropagation(); },
345
+ disableClickPropagation(element) {
346
+ element.classList.add('leaflet-control');
347
+ L.DomEvent.on(element, 'click dblclick pointerdown mousedown touchstart contextmenu', stopPropagation);
348
+ return this;
349
+ },
350
+ disableScrollPropagation(element) { return this.on(element, 'wheel', stopPropagation); },
351
+ };
352
+ L.Handler = Class.extend({
353
+ initialize(map) { this._map = map; },
354
+ enable() { if (!this._enabled) { this._enabled = true; this.addHooks?.(); } return this; },
355
+ disable() { if (this._enabled) { this._enabled = false; this.removeHooks?.(); } return this; },
356
+ enabled() { return Boolean(this._enabled); },
357
+ moving() { return Boolean(this._moving); },
358
+ });
359
+ L.Layer = L.Evented.extend({
360
+ initialize(options) { setOptions(this, options); },
361
+ addTo(map) { map.addLayer(this); return this; },
362
+ remove() { return this.removeFrom(this._map || this._mapToAdd); },
363
+ removeFrom(map) { map?.removeLayer(this); return this; },
364
+ getAttribution() { return this.options.attribution; },
365
+ getPane(name) { return this._map.getPane(name || this.options.pane); },
366
+ _layerAdd({ target: map }) {
367
+ if (!map.hasLayer(this)) return;
368
+ this._map = map;
369
+ if (this.getEvents) { this._mapEvents = this.getEvents(); map.on(this._mapEvents, this); }
370
+ this.onAdd?.(map);
371
+ this.fire('add'); map.fire('layeradd', { layer: this });
372
+ },
373
+ });
374
+ L.LayerGroup = L.Layer.extend({
375
+ initialize(layers = [], options) {
376
+ setOptions(this, options); this._layers = {};
377
+ for (const layer of layers) this.addLayer(layer);
378
+ },
379
+ addLayer(layer) { this._layers[stamp(layer)] = layer; this._map?.addLayer(layer); return this; },
380
+ removeLayer(layer) { delete this._layers[stamp(layer)]; this._map?.removeLayer(layer); return this; },
381
+ hasLayer(layer) { return stamp(layer) in this._layers; },
382
+ eachLayer(fn, context) { for (const layer of Object.values(this._layers)) fn.call(context || this, layer); return this; },
383
+ onAdd(map) { this.eachLayer(map.addLayer, map); },
384
+ onRemove(map) { this.eachLayer(map.removeLayer, map); },
385
+ });
386
+ // Declare the hierarchy before the plugin installs its instanceof checks and hooks.
387
+ for (const [name, parent] of [
388
+ ['GridLayer', L.Layer], ['Marker', L.Layer], ['Path', L.Layer],
389
+ ['Polyline', null], ['Polygon', null], ['CircleMarker', null], ['Circle', null],
390
+ ['ImageOverlay', L.Layer], ['VideoOverlay', null], ['SVGOverlay', null],
391
+ ['Popup', L.Layer], ['Tooltip', L.Layer], ['DivIcon', Class],
392
+ ]) {
393
+ const base = parent || ({ Polyline: L.Path, Polygon: L.Polyline, CircleMarker: L.Path,
394
+ Circle: L.CircleMarker, VideoOverlay: L.ImageOverlay, SVGOverlay: L.ImageOverlay })[name];
395
+ L[name] = base.extend({
396
+ initialize() { throw new Error(`L.${name} is not supported by the OpenLayers bindings; use L.Layer with a source`); },
397
+ getEvents() { return {}; },
398
+ });
399
+ }
400
+
401
+ L.Map = L.Evented.extend({
402
+ options: { crs, minZoom: 0, maxZoom: 24, zoomSnap: 1, touchZoom: true,
403
+ scrollWheelZoom: true, keyboard: true, doubleClickZoom: true,
404
+ wheelDebounceTime: 40, wheelPxPerZoomLevel: 60 },
405
+ initialize(target, options) {
406
+ setOptions(this, options);
407
+ this._container = typeof target === 'string' ? document.getElementById(target) : target;
408
+ if (!this._container) throw new Error('Map container not found');
409
+ stamp(this._container);
410
+ this._container.classList.add('openlayers-city-mapper');
411
+ this._layers = {}; this._panes = {}; this._handlers = []; this._controls = new Set();
412
+ const center = crs.project(this.options.center || [0, 0]);
413
+ this.ol = new ol.Map({
414
+ target: this._container, controls: [new ol.control.Zoom(), new ol.control.Attribution({collapsible: false })],
415
+ interactions: [],
416
+ view: new ol.View({ center: [center.x, center.y], zoom: this.options.zoom || 0,
417
+ minZoom: this.getMinZoom(), maxZoom: this.getMaxZoom() }),
418
+ });
419
+ for (const control of this.ol.getControls().getArray()) {
420
+ control.element.classList.add('leaflet-control');
421
+ for (const button of control.element.querySelectorAll('button[title]')) button.setAttribute('aria-label', button.title);
422
+ if (control instanceof ol.control.Zoom) {
423
+ for (const [selector, delta] of [['.ol-zoom-in', 1], ['.ol-zoom-out', -1]]) {
424
+ control.element.querySelector(selector).addEventListener('click', event => {
425
+ L.DomEvent.stop(event);
426
+ event.stopImmediatePropagation();
427
+ this._zoomBy(delta * (event.shiftKey ? 3 : 1));
428
+ }, true);
429
+ }
430
+ }
431
+ }
432
+ this._loaded = true;
433
+ this._zoomAnimated = false;
434
+ this.dragging = new L.Handler(this).enable();
435
+ this.touchZoom = new L.Handler(this);
436
+ if (this.options.touchZoom) this.touchZoom.enable();
437
+ this._handlers.push(this.dragging, this.touchZoom);
438
+ for (const name of ['scrollWheelZoom', 'keyboard', 'doubleClickZoom']) this.addHandler(name, L.Handler);
439
+ if (!this._container.hasAttribute('tabindex')) this._container.tabIndex = 0;
440
+ const view = this.ol.getView();
441
+ this._viewZoom = view.getZoom();
442
+ view.on(['change:center', 'change:resolution'], () => {
443
+ if (this._settingView) return;
444
+ const zoomChanged = view.getZoom() !== this._viewZoom;
445
+ if (!this._viewMoving) { this._viewMoving = true; this.fire('movestart'); }
446
+ if (zoomChanged && !this._viewZooming) { this._viewZooming = true; this.fire('zoomstart'); }
447
+ this.fire('move');
448
+ if (zoomChanged) this.fire('zoom');
449
+ this._viewZoom = view.getZoom();
450
+ if (!view.getAnimating() && !view.getInteracting()) this._endViewChange();
451
+ });
452
+ this.ol.on('moveend', () => this._endViewChange());
453
+ // OpenLayers interactions need the pitched ground coordinate, not the flat viewport.
454
+ this.ol.getCoordinateFromPixel = pixel => {
455
+ const coordinate = crs.project(this.containerPointToLatLng(point(pixel)));
456
+ return [coordinate.x, coordinate.y];
457
+ };
458
+ this._wheelDelta = 0;
459
+ this.ol.addInteraction(new ol.interaction.Interaction({
460
+ handleEvent: event => {
461
+ const original = event.originalEvent;
462
+ if (original.target.closest('.ol-control')) return true;
463
+ if (event.type === 'dblclick' && this.doubleClickZoom.enabled()) {
464
+ this._zoomBy(original.shiftKey ? -1 : 1, point(event.pixel));
465
+ } else if (event.type === 'wheel' && this.scrollWheelZoom.enabled() && !original.shiftKey) {
466
+ const ratio = window.devicePixelRatio || 1;
467
+ const factor = /Linux/.test(navigator.platform) && /Chrome/.test(navigator.userAgent) ? ratio
468
+ : /Mac/.test(navigator.platform) ? 3 * ratio : 2 * ratio;
469
+ this._wheelDelta -= original.deltaY * (original.deltaMode === 1 ? 20
470
+ : original.deltaMode === 2 ? 60 : 1 / factor);
471
+ this._wheelPixel = point(event.pixel);
472
+ this._wheelStart ??= performance.now();
473
+ clearTimeout(this._wheelTimer);
474
+ this._wheelTimer = setTimeout(() => {
475
+ const magnitude = 4 * Math.log2(2 / (1 + Math.exp(-Math.abs(this._wheelDelta /
476
+ (this.options.wheelPxPerZoomLevel * 4)))));
477
+ const snap = this.options.zoomSnap;
478
+ const delta = Math.sign(this._wheelDelta) * (snap ? Math.ceil(magnitude / snap) * snap : magnitude);
479
+ this._wheelDelta = 0;
480
+ this._wheelStart = null;
481
+ if (this._loaded && this.scrollWheelZoom.enabled()) this._zoomBy(delta,
482
+ this.options.scrollWheelZoom === 'center' ? undefined : this._wheelPixel);
483
+ }, Math.max(0, this.options.wheelDebounceTime - (performance.now() - this._wheelStart)));
484
+ } else return true;
485
+ original.preventDefault();
486
+ return false;
487
+ },
488
+ }));
489
+ this._controlCorners = {};
490
+ for (const position of ['topleft', 'topright', 'bottomleft', 'bottomright']) {
491
+ this._controlCorners[position] = L.DomUtil.create('div',
492
+ `ol-city-corner ol-city-${position}`, this.ol.getOverlayContainerStopEvent());
493
+ }
494
+ const attributionSource = new ol.source.Vector();
495
+ this.ol.addLayer(new ol.layer.Vector({ source: attributionSource }));
496
+ const updateAttribution = () => {
497
+ const values = new Set(['<a href="https://openlayers.org/">OpenLayers</a>']);
498
+ this.eachLayer(layer => { if (layer.getAttribution?.()) values.add(layer.getAttribution()); });
499
+ attributionSource.setAttributions([...values]);
500
+ };
501
+ this.on('layeradd layerremove', updateAttribution);
502
+ updateAttribution();
503
+ let anchor, pointerId;
504
+ const pixel = event => {
505
+ const rect = this._container.getBoundingClientRect();
506
+ return new L.Point(event.clientX - rect.left, event.clientY - rect.top);
507
+ };
508
+ this._onPointer = event => {
509
+ if (event.type === 'pointerdown') {
510
+ if (!this.dragging.enabled() || event.button !== 0 || !event.isPrimary || event.target.closest('.ol-control')) return;
511
+ anchor = this.containerPointToLatLng(pixel(event)); pointerId = event.pointerId;
512
+ this._moved = this.dragging._moving = false;
513
+ this._container.focus({ preventScroll: true });
514
+ this._container.setPointerCapture(pointerId);
515
+ } else if (event.pointerId === pointerId && event.type === 'pointermove' && this.dragging.enabled()) {
516
+ const delta = this.project(anchor).subtract(this.project(this.containerPointToLatLng(pixel(event))));
517
+ if (Math.hypot(delta.x, delta.y) > 1) this._moved = this.dragging._moving = true;
518
+ this.setView(this.unproject(this.project(this.getCenter()).add(delta)), this.getZoom());
519
+ } else if (event.pointerId === pointerId && event.type !== 'pointermove') {
520
+ if (this._container.hasPointerCapture(pointerId)) this._container.releasePointerCapture(pointerId);
521
+ anchor = null; pointerId = null;
522
+ this.dragging._moving = false;
523
+ }
524
+ };
525
+ this._onKey = event => {
526
+ if (!this.keyboard.enabled() || event.target !== this._container || event.altKey || event.ctrlKey || event.metaKey) return;
527
+ const offsets = { ArrowLeft: [-80, 0], ArrowRight: [80, 0], ArrowUp: [0, -80], ArrowDown: [0, 80] };
528
+ if (offsets[event.key]) this.panBy(offsets[event.key]);
529
+ else if (['+', '=', '-', '_'].includes(event.key)) this._zoomBy(
530
+ (['-', '_'].includes(event.key) ? -1 : 1) * (event.shiftKey ? 3 : 1));
531
+ else return;
532
+ event.preventDefault();
533
+ };
534
+ L.DomEvent.on(this._container, 'pointerdown pointermove pointerup pointercancel', this._onPointer);
535
+ L.DomEvent.on(this._container, 'keydown', this._onKey);
536
+ this.ol.on('change:size', () => this.fire('resize', { newSize: this.getSize() }));
537
+ this.ol.updateSize();
538
+ },
539
+ getContainer() { return this._container; },
540
+ getSize() { return point(this.ol.getSize() || [this._container.clientWidth, this._container.clientHeight]); },
541
+ getCenter() { return crs.unproject(point(this.ol.getView().getCenter())); },
542
+ getZoom() { return this.ol.getView().getZoom(); },
543
+ getMinZoom() { return this.options.minZoom; },
544
+ getMaxZoom() { return this.options.maxZoom; },
545
+ getZoomScale(to, from = this.getZoom()) { return 2 ** (to - from); },
546
+ getScaleZoom(scale, from = this.getZoom()) { return from + Math.log2(scale); },
547
+ _limitZoom(zoom) { return Math.max(this.getMinZoom(), Math.min(this.getMaxZoom(), zoom)); },
548
+ project(value, zoom = this.getZoom()) { return crs.transformation.transform(crs.project(value), crs.scale(zoom)); },
549
+ unproject(value, zoom = this.getZoom()) { return crs.unproject(crs.transformation.untransform(point(value), crs.scale(zoom))); },
550
+ getPixelOrigin() { return this.project(this.getCenter()).subtract(this.getSize().divideBy(2)); },
551
+ _getMapPanePos() { return new L.Point(0, 0); },
552
+ latLngToLayerPoint(value) { return this.project(value).subtract(this.getPixelOrigin()); },
553
+ layerPointToLatLng(value) { return this.unproject(point(value).add(this.getPixelOrigin())); },
554
+ layerPointToContainerPoint(value) { return point(value).clone(); },
555
+ containerPointToLayerPoint(value) { return point(value).clone(); },
556
+ latLngToContainerPoint(value) { return this.layerPointToContainerPoint(this.latLngToLayerPoint(value)); },
557
+ containerPointToLatLng(value) { return this.layerPointToLatLng(this.containerPointToLayerPoint(value)); },
558
+ getBounds() { return new L.LatLngBounds(this.containerPointToLatLng([0, 0]), this.containerPointToLatLng(this.getSize())); },
559
+ _endViewChange() {
560
+ if (!this._viewMoving) return;
561
+ const zooming = this._viewZooming;
562
+ this._viewMoving = this._viewZooming = false;
563
+ if (zooming) this.fire('zoomend');
564
+ this.fire('moveend');
565
+ },
566
+ _zoomBy(delta, pixel) {
567
+ if (!delta || this.ol.getView().getAnimating()) return this;
568
+ const zoom = this._limitZoom(this.getZoom() + delta);
569
+ return pixel ? this.setZoomAround(pixel, zoom, { animate: true })
570
+ : this.setZoom(zoom, { animate: true });
571
+ },
572
+ setView(center, zoom = this.getZoom(), options = {}) {
573
+ center = latLng(center); zoom = this._limitZoom(zoom);
574
+ if ((options.animate === true || options.zoom?.animate === true) && zoom !== this.getZoom()) {
575
+ const scale = this.getZoomScale(zoom), projected = crs.project(center);
576
+ // Leaflet animates CSS scale, not resolution; convert the same native CSS easing.
577
+ this.ol.getView().animate({
578
+ center: [projected.x, projected.y], zoom, duration: 250,
579
+ easing: time => {
580
+ zoomTiming.currentTime = time;
581
+ const progress = zoomTiming.effect.getComputedTiming().progress;
582
+ return (1 - 1 / (1 + (scale - 1) * progress)) / (1 - 1 / scale);
583
+ },
584
+ });
585
+ return this;
586
+ }
587
+ this.ol.getView().cancelAnimations();
588
+ this._endViewChange();
589
+ const zoomChanged = zoom !== this.getZoom(), moved = !center.equals(this.getCenter());
590
+ if (!zoomChanged && !moved) return this;
591
+ this.fire('movestart');
592
+ if (zoomChanged) this.fire('zoomstart');
593
+ this._settingView = true;
594
+ const projected = crs.project(center);
595
+ this.ol.getView().setCenter([projected.x, projected.y]);
596
+ this.ol.getView().setZoom(zoom);
597
+ this._viewZoom = this.getZoom();
598
+ this._settingView = false;
599
+ if (zoomChanged) this.fire('zoom');
600
+ this.fire('move').fire('viewreset');
601
+ if (zoomChanged) this.fire('zoomend');
602
+ return this.fire('moveend');
603
+ },
604
+ setZoom(zoom, options) { return this.setView(this.getCenter(), zoom, options); },
605
+ panTo(center) { return this.setView(center); },
606
+ panBy(offset) { return this.panTo(this.unproject(this.project(this.getCenter()).add(point(offset)))); },
607
+ setZoomAround(value, zoom, options) {
608
+ const anchor = value instanceof L.Point ? value : this.latLngToContainerPoint(value);
609
+ const half = this.getSize().divideBy(2), scale = this.getZoomScale(zoom);
610
+ return this.setView(this.unproject(this.project(this.getCenter()).add(anchor.subtract(half).multiplyBy(1 - 1 / scale))), zoom, options);
611
+ },
612
+ getBoundsZoom(bounds, inside, padding = [0, 0]) {
613
+ const size = this.project(bounds.getSouthEast()).subtract(this.project(bounds.getNorthWest()));
614
+ const available = this.getSize().subtract(point(padding));
615
+ const scale = Math[inside ? 'max' : 'min'](available.x / size.x, available.y / size.y);
616
+ return this._limitZoom(this.getScaleZoom(scale));
617
+ },
618
+ _getBoundsCenterZoom(bounds, options = {}) { return { center: bounds.getCenter(), zoom: this.getBoundsZoom(bounds, false, options.padding) }; },
619
+ fitBounds(bounds, options) { const view = this._getBoundsCenterZoom(bounds, options); return this.setView(view.center, view.zoom); },
620
+ _limitCenter(center) { return center; },
621
+ _limitOffset(offset) { return offset; },
622
+ _tryAnimatedPan() { return false; },
623
+ panInside(value) { if (!this.getBounds().contains(value)) this.panTo(value); return this; },
624
+ whenReady(fn, context) { if (this._loaded) fn.call(context || this, { target: this }); else this.once('load', fn, context); return this; },
625
+ addLayer(layer) {
626
+ const id = stamp(layer);
627
+ if (this._layers[id]) return this;
628
+ this._layers[id] = layer; layer._mapToAdd = this;
629
+ layer.beforeAdd?.(this);
630
+ this.whenReady(layer._layerAdd, layer);
631
+ return this;
632
+ },
633
+ removeLayer(layer) {
634
+ if (!this.hasLayer(layer)) return this;
635
+ layer.onRemove?.(this);
636
+ if (layer._mapEvents) this.off(layer._mapEvents, layer);
637
+ delete this._layers[stamp(layer)];
638
+ this.fire('layerremove', { layer }); layer.fire('remove');
639
+ layer._map = layer._mapToAdd = null;
640
+ return this;
641
+ },
642
+ hasLayer(layer) { return Boolean(this._layers[stamp(layer)]); },
643
+ eachLayer(fn, context) { for (const layer of Object.values(this._layers)) fn.call(context || this, layer); return this; },
644
+ createPane(name, parent = this._container) { return this._panes[name] = L.DomUtil.create('div', `leaflet-pane leaflet-${name}`, parent); },
645
+ getPane(name = 'overlayPane') { return this._panes[name]; },
646
+ addHandler(name, Handler) { this[name] = new Handler(this); this._handlers.push(this[name]); if (this.options[name]) this[name].enable(); return this; },
647
+ invalidateSize() { this.ol.updateSize(); return this; },
648
+ _draggableMoved() { return Boolean(this._moved); },
649
+ remove() {
650
+ clearTimeout(this._wheelTimer);
651
+ this.ol.getView().cancelAnimations();
652
+ this.fire('unload');
653
+ for (const control of [...this._controls]) control.remove();
654
+ this.eachLayer(this.removeLayer, this);
655
+ for (const handler of this._handlers) handler.disable();
656
+ L.DomEvent.off(this._container, 'pointerdown pointermove pointerup pointercancel', this._onPointer);
657
+ L.DomEvent.off(this._container, 'keydown', this._onKey);
658
+ this.ol.setTarget(undefined); this.ol.dispose();
659
+ for (const corner of Object.values(this._controlCorners)) corner.remove();
660
+ for (const pane of Object.values(this._panes)) pane.remove();
661
+ this._loaded = false;
662
+ delete this._container._leaflet_id;
663
+ return this.off();
664
+ },
665
+ });
666
+
667
+ L.Control = Class.extend({
668
+ options: { position: 'topright' },
669
+ initialize(options) { setOptions(this, options); },
670
+ getPosition() { return this.options.position; },
671
+ getContainer() { return this._container; },
672
+ addTo(map) {
673
+ this.remove(); this._map = map;
674
+ this._container = this.onAdd(map);
675
+ if (L.Control.Rotate && this instanceof L.Control.Rotate) {
676
+ this._container.classList.add('ol-city-rotate');
677
+ }
678
+ this._container.classList.add('leaflet-control', 'ol-control', 'ol-city-control');
679
+ this._olControl = new ol.control.Control({
680
+ element: this._container, target: map._controlCorners[this.getPosition()],
681
+ });
682
+ map.ol.addControl(this._olControl);
683
+ map._controls.add(this);
684
+ return this;
685
+ },
686
+ remove() {
687
+ if (!this._map) return this;
688
+ const map = this._map;
689
+ this.onRemove?.(map); this._container?.remove();
690
+ map.ol.removeControl(this._olControl);
691
+ map._controls.delete(this); this._map = null;
692
+ return this;
693
+ },
694
+ });
695
+ L.Control.Layers = L.Control.extend({
696
+ options: { collapsed: true },
697
+ initialize(base = {}, overlays = {}, options) {
698
+ setOptions(this, options); this._layers = [];
699
+ for (const [name, layer] of Object.entries(base)) this._layers.push({ name, layer, overlay: false });
700
+ for (const [name, layer] of Object.entries(overlays)) this._layers.push({ name, layer, overlay: true });
701
+ },
702
+ onAdd(map) {
703
+ const container = L.DomUtil.create('div', 'ol-city-layers');
704
+ L.DomEvent.disableClickPropagation(container); L.DomEvent.disableScrollPropagation(container);
705
+ const list = L.DomUtil.create('section', '', container);
706
+ list.setAttribute('aria-label', 'Map layers');
707
+ const base = L.DomUtil.create('div', '', list);
708
+ L.DomUtil.create('hr', '', list);
709
+ const overlays = L.DomUtil.create('div', '', list);
710
+ this._inputs = [];
711
+ for (const entry of this._layers) {
712
+ const label = L.DomUtil.create('label', '', entry.overlay ? overlays : base);
713
+ const input = L.DomUtil.create('input', 'leaflet-control-layers-selector', label);
714
+ input.type = entry.overlay ? 'checkbox' : 'radio';
715
+ input.name = `base-${stamp(this)}`; input.layerId = stamp(entry.layer);
716
+ input.checked = map.hasLayer(entry.layer);
717
+ label.append(document.createTextNode(` ${entry.name}`));
718
+ this._inputs.push(input);
719
+ input.onchange = () => {
720
+ const checked = input.checked;
721
+ if (!entry.overlay) for (const other of this._layers) {
722
+ if (!other.overlay && other !== entry) map.removeLayer(other.layer);
723
+ }
724
+ if (checked) map.addLayer(entry.layer); else map.removeLayer(entry.layer);
725
+ };
726
+ }
727
+ map.on('layeradd layerremove', this._update, this);
728
+ return container;
729
+ },
730
+ _update() { for (const input of this._inputs) input.checked = Boolean(this._map._layers[input.layerId]); },
731
+ onRemove(map) { map.off('layeradd layerremove', this._update, this); },
732
+ });
733
+
734
+ // Native layer contracts consumed by the plugin's WebGPU renderer.
735
+ const bounds = value => value instanceof L.LatLngBounds ? value : new L.LatLngBounds(value);
736
+ const coordinates = values => values.map(value => Array.isArray(value) && typeof value[0] !== 'number'
737
+ ? coordinates(value) : latLng(value));
738
+ const image = (url, options, className) => {
739
+ const element = document.createElement('img');
740
+ element.className = className;
741
+ if (options.crossOrigin) element.crossOrigin = options.crossOrigin === true ? '' : options.crossOrigin;
742
+ element.src = url;
743
+ element.draggable = false;
744
+ return element;
745
+ };
746
+
747
+ L.Layer.include({
748
+ bindPopup(content) {
749
+ this._popupContent = content;
750
+ this.off('click', this.openPopup, this).on('click', this.openPopup, this);
751
+ this.once('remove', this.closePopup, this);
752
+ if (this instanceof L.LayerGroup) this.eachLayer(layer => layer.bindPopup(content));
753
+ return this;
754
+ },
755
+ openPopup(event) {
756
+ if (!this._map) return this;
757
+ this.closePopup();
758
+ const location = event?.latlng || this.getLatLng?.() || this.getBounds?.().getCenter();
759
+ if (!location) throw new Error('Popup requires a location');
760
+ const element = L.DomUtil.create('div', 'ol-city-popup leaflet-popup');
761
+ element.setAttribute('role', 'dialog');
762
+ const close = L.DomUtil.create('button', '', element);
763
+ close.type = 'button'; close.textContent = '\u00d7'; close.setAttribute('aria-label', 'Close popup');
764
+ close.onclick = () => this.closePopup();
765
+ const content = L.DomUtil.create('div', '', element);
766
+ const value = typeof this._popupContent === 'function' ? this._popupContent(this) : this._popupContent;
767
+ if (value instanceof Node) content.append(value); else content.innerHTML = value;
768
+ L.DomEvent.disableClickPropagation(element);
769
+ this._popupOverlay = new ol.Overlay({ element, positioning: 'bottom-center', offset: [0, -12] });
770
+ this._map.ol.addOverlay(this._popupOverlay);
771
+ this._popupLocation = latLng(location);
772
+ this._map.on('move zoom rotate pitch', this._positionPopup, this);
773
+ this._positionPopup();
774
+ return this;
775
+ },
776
+ _positionPopup() {
777
+ const screen = this._map.latLngToContainerPoint(this._popupLocation);
778
+ this._popupOverlay.setPosition(this._map.ol.getCoordinateFromPixelInternal([screen.x, screen.y]));
779
+ },
780
+ closePopup() {
781
+ if (this._popupOverlay) {
782
+ this._map?.off('move zoom rotate pitch', this._positionPopup, this);
783
+ this._map?.ol.removeOverlay(this._popupOverlay);
784
+ this._popupOverlay = null;
785
+ }
786
+ return this;
787
+ },
788
+ bindTooltip(content) {
789
+ this._tooltipContent = content;
790
+ this.on('mouseover', this._showTooltip, this).on('mouseout remove', this._hideTooltip, this);
791
+ if (this instanceof L.LayerGroup) this.eachLayer(layer => layer.bindTooltip(content));
792
+ return this;
793
+ },
794
+ _showTooltip(event) {
795
+ this._hideTooltip();
796
+ if (!this._map || !event.latlng) return;
797
+ const element = this._tooltipElement = L.DomUtil.create('div', 'ol-city-tooltip leaflet-tooltip', this._map.getContainer());
798
+ element.setAttribute('role', 'tooltip');
799
+ const value = typeof this._tooltipContent === 'function' ? this._tooltipContent(this) : this._tooltipContent;
800
+ if (value instanceof Node) element.append(value); else element.innerHTML = value;
801
+ const pixel = this._map.latLngToContainerPoint(event.latlng);
802
+ element.style.left = `${pixel.x + 12}px`; element.style.top = `${pixel.y + 12}px`;
803
+ },
804
+ _hideTooltip() { this._tooltipElement?.remove(); this._tooltipElement = null; },
805
+ });
806
+ L.LayerGroup.include({
807
+ getLayers() { return Object.values(this._layers); },
808
+ getBounds() {
809
+ const result = new L.LatLngBounds();
810
+ this.eachLayer(layer => result.extend(layer.getBounds?.() || layer.getLatLng()));
811
+ return result;
812
+ },
813
+ });
814
+ L.FeatureGroup = L.LayerGroup.extend({});
815
+
816
+ L.Path.include({
817
+ options: { pane: 'overlayPane', interactive: true, stroke: true, color: '#3388ff',
818
+ weight: 3, opacity: 1, lineCap: 'round', lineJoin: 'round', fill: false, fillOpacity: 0.2 },
819
+ initialize(options) { L.Util.setOptions(this, options); },
820
+ setStyle(options) { L.Util.setOptions(this, options); return this.redraw(); },
821
+ redraw() { return this; },
822
+ bringToFront() { return this; },
823
+ bringToBack() { return this; },
824
+ });
825
+ L.Polyline.include({
826
+ initialize(values, options) { L.Util.setOptions(this, options); this.setLatLngs(values); },
827
+ getLatLngs() { return this._latlngs; },
828
+ setLatLngs(values) { this._latlngs = coordinates(values); return this.redraw(); },
829
+ addLatLng(value) { this._latlngs.push(latLng(value)); return this.redraw(); },
830
+ getBounds() {
831
+ const result = new L.LatLngBounds();
832
+ const visit = values => { for (const value of values) Array.isArray(value) ? visit(value) : result.extend(value); };
833
+ visit(this._latlngs);
834
+ return result;
835
+ },
836
+ _project() {
837
+ this._rings = [];
838
+ const visit = values => {
839
+ if (!values.length) return;
840
+ if (Array.isArray(values[0])) values.forEach(visit);
841
+ else this._rings.push(values.map(value => this._map.latLngToLayerPoint(value)));
842
+ };
843
+ visit(this._latlngs);
844
+ },
845
+ closestLayerPoint(value) {
846
+ this._project();
847
+ const paths = this._rings.map(ring => ring.map(value => [value.x, value.y]));
848
+ const closest = new ol.geom.MultiLineString(paths).getClosestPoint([value.x, value.y]);
849
+ return point(closest);
850
+ },
851
+ });
852
+ L.Polyline.mergeOptions(L.Path.prototype.options);
853
+ L.Polygon.include({ initialize: L.Polyline.prototype.initialize });
854
+ L.Polygon.mergeOptions(L.Path.prototype.options);
855
+ L.Polygon.mergeOptions({ fill: true });
856
+ L.Rectangle = L.Polygon.extend({
857
+ initialize(value, options) { L.Util.setOptions(this, options); this.setBounds(value); },
858
+ setBounds(value) {
859
+ value = bounds(value);
860
+ return this.setLatLngs([value.getSouthWest(), value.getNorthWest(), value.getNorthEast(), value.getSouthEast()]);
861
+ },
862
+ });
863
+ L.CircleMarker.include({
864
+ options: { ...L.Path.prototype.options, fill: true, radius: 10 },
865
+ initialize(value, options) { L.Util.setOptions(this, options); this._latlng = latLng(value); },
866
+ getLatLng() { return this._latlng; },
867
+ setLatLng(value) { this._latlng = latLng(value); this.fire('move', { latlng: this._latlng }); return this.redraw(); },
868
+ getRadius() { return this.options.radius; },
869
+ setRadius(radius) { this.options.radius = radius; return this.redraw(); },
870
+ });
871
+ L.Circle.include({
872
+ initialize: L.CircleMarker.prototype.initialize,
873
+ _project() {
874
+ this._point = this._map.latLngToLayerPoint(this._latlng);
875
+ this._radius = this._radiusY = this.getRadius() * this._map.options.crs.scale(this._map.getZoom()) /
876
+ (2 * Math.PI * 6378137 * Math.cos(this._latlng.lat * Math.PI / 180));
877
+ },
878
+ getBounds() {
879
+ const north = this.getRadius() / 6378137 * 180 / Math.PI;
880
+ const east = north / Math.cos(this._latlng.lat * Math.PI / 180);
881
+ return new L.LatLngBounds([this._latlng.lat - north, this._latlng.lng - east],
882
+ [this._latlng.lat + north, this._latlng.lng + east]);
883
+ },
884
+ });
885
+ L.Circle.mergeOptions(L.CircleMarker.prototype.options);
886
+ L.GeoJSON = L.FeatureGroup.extend({
887
+ initialize(data, options) {
888
+ L.LayerGroup.prototype.initialize.call(this, [], options);
889
+ if (data) this.addData(data);
890
+ },
891
+ addData(data) {
892
+ const features = new ol.format.GeoJSON().readFeatures(data);
893
+ const convert = (geometry, feature) => {
894
+ const values = geometry.getCoordinates();
895
+ const locations = value => typeof value[0] === 'number' ? [value[1], value[0]] : value.map(locations);
896
+ switch (geometry.getType()) {
897
+ case 'Point': return this.options.pointToLayer
898
+ ? this.options.pointToLayer(feature, latLng(locations(values))) : new L.Marker(locations(values));
899
+ case 'MultiPoint': return new L.FeatureGroup(values.map(value => convert(new ol.geom.Point(value), feature)));
900
+ case 'LineString': case 'MultiLineString': return new L.Polyline(locations(values), this.options);
901
+ case 'Polygon': case 'MultiPolygon': return new L.Polygon(locations(values), this.options);
902
+ default: throw new Error(`Unsupported GeoJSON geometry: ${geometry.getType()}`);
903
+ }
904
+ };
905
+ for (const feature of features) {
906
+ const layer = convert(feature.getGeometry(), new ol.format.GeoJSON().writeFeatureObject(feature));
907
+ this.addLayer(layer);
908
+ }
909
+ return this;
910
+ },
911
+ });
912
+
913
+ L.GridLayer.include({
914
+ options: { pane: 'tilePane', tileSize: 256, opacity: 1, minZoom: 0, maxZoom: 24, updateInterval: 200 },
915
+ initialize(options) { L.Util.setOptions(this, options); this._tiles = {}; },
916
+ getTileSize() { return typeof this.options.tileSize === 'number'
917
+ ? new L.Point(this.options.tileSize, this.options.tileSize) : point(this.options.tileSize); },
918
+ getEvents() { return { moveend: this._onMoveEnd, zoomend: this._onMoveEnd, resize: this._onMoveEnd }; },
919
+ _initContainer() { this._container = L.DomUtil.create('div', '', this.getPane()); },
920
+ onAdd() { this._initContainer(); this._onMoveEnd(); },
921
+ onRemove() {
922
+ for (const tile of Object.values(this._tiles)) this.fire('tileunload', { tile: tile.el, coords: tile.coords });
923
+ this._tiles = {}; this._container?.remove();
924
+ },
925
+ _getTiledPixelBounds() {
926
+ return new L.Bounds(this._map.project(this._map.getBounds().getNorthWest(), this._tileZoom),
927
+ this._map.project(this._map.getBounds().getSouthEast(), this._tileZoom));
928
+ },
929
+ _onMoveEnd() {
930
+ if (!this._map) return;
931
+ this._tileZoom = Math.max(this.options.minZoom, Math.min(this.options.maxZoom, Math.round(this._map.getZoom())));
932
+ const size = this.getTileSize(), extent = this._getTiledPixelBounds(this._map.getCenter());
933
+ const min = extent.min.unscaleBy(size).floor(), max = extent.max.unscaleBy(size).floor();
934
+ const retained = new Set(), limit = 2 ** this._tileZoom;
935
+ for (let x = min.x; x <= max.x; x++) for (let y = min.y; y <= max.y; y++) {
936
+ if (y < 0 || y >= limit) continue;
937
+ const key = `${this._tileZoom}:${x}:${y}`;
938
+ retained.add(key);
939
+ if (this._tiles[key]) continue;
940
+ const coords = new L.Point(x, y); coords.z = this._tileZoom;
941
+ const tile = this._tiles[key] = { coords, current: true, loaded: 0 };
942
+ const done = (error, element) => {
943
+ if (this._tiles[key] !== tile) return;
944
+ tile.el = element;
945
+ if (error) { this.fire('tileerror', { error, tile: element, coords }); return; }
946
+ tile.loaded = Date.now();
947
+ this.fire('tileload', { tile: element, coords });
948
+ this.fire('load');
949
+ };
950
+ tile.el = this.createTile(coords, done);
951
+ if (this.createTile.length < 2) done(null, tile.el);
952
+ }
953
+ for (const [key, tile] of Object.entries(this._tiles)) {
954
+ if (retained.has(key)) continue;
955
+ delete this._tiles[key];
956
+ this.fire('tileunload', { tile: tile.el, coords: tile.coords });
957
+ }
958
+ },
959
+ _tileCoordsToNwSe(coords) {
960
+ const size = this.getTileSize(), nw = new L.Point(coords.x * size.x, coords.y * size.y);
961
+ return [this._map.unproject(nw, coords.z), this._map.unproject(nw.add(size), coords.z)];
962
+ },
963
+ setOpacity(opacity) { this.options.opacity = opacity; return this; },
964
+ setZIndex(zIndex) { this.options.zIndex = zIndex; return this; },
965
+ redraw() { if (this._map) { this.onRemove(); this._onMoveEnd(); } return this; },
966
+ });
967
+ L.TileLayer = L.GridLayer.extend({
968
+ initialize(url, options) {
969
+ L.GridLayer.prototype.initialize.call(this, options); this.setUrl(url);
970
+ },
971
+ setUrl(url) { this._url = url; this._source = new ol.source.XYZ({ url, crossOrigin: 'anonymous' }); return this.redraw(); },
972
+ createTile(coords, done) {
973
+ const url = this._source.getTileUrlFunction()([coords.z, coords.x, coords.y], 1, ol.proj.get('EPSG:3857'));
974
+ const tile = image(url, this.options, '');
975
+ tile.onload = () => done(null, tile);
976
+ tile.onerror = () => done(new Error(`Unable to load tile: ${url}`), tile);
977
+ return tile;
978
+ },
979
+ });
980
+ L.TileLayer.WMS = L.TileLayer.extend({
981
+ setUrl(url) {
982
+ this._url = url;
983
+ this._source = new ol.source.TileWMS({ url, crossOrigin: 'anonymous', params: {
984
+ LAYERS: this.options.layers, FORMAT: this.options.format || 'image/png',
985
+ TRANSPARENT: this.options.transparent || false,
986
+ } });
987
+ return this.redraw();
988
+ },
989
+ });
990
+ L.ImageOverlay.include({
991
+ options: { pane: 'overlayPane', opacity: 1, interactive: false },
992
+ initialize(url, value, options) { L.Util.setOptions(this, options); this._url = url; this._bounds = bounds(value); },
993
+ _initImage() {
994
+ this._image = image(this._url, this.options, '');
995
+ this._image.onload = () => this.fire('load');
996
+ this._image.onerror = () => this.fire('error', { error: new Error(`Unable to load image: ${this._url}`) });
997
+ },
998
+ getBounds() { return this._bounds; },
999
+ setBounds(value) { this._bounds = bounds(value); return this; },
1000
+ setUrl(url) { this._url = url; if (this._image) this._image.src = url; return this; },
1001
+ setOpacity(opacity) { this.options.opacity = opacity; return this; },
1002
+ setZIndex(zIndex) { this.options.zIndex = zIndex; return this; },
1003
+ });
1004
+
1005
+ L.Icon = L.Evented.extend({
1006
+ initialize(options) { L.Util.setOptions(this, options); },
1007
+ createIcon() { return this._create('icon'); },
1008
+ createShadow() { return this.options.shadowUrl ? this._create('shadow') : null; },
1009
+ _create(kind) {
1010
+ const element = image(this.options[`${kind}Url`], this.options, `leaflet-marker-${kind}`);
1011
+ const size = this.options[`${kind}Size`], anchor = this.options[`${kind}Anchor`] || this.options.iconAnchor;
1012
+ if (size) { element.style.width = `${size[0]}px`; element.style.height = `${size[1]}px`; }
1013
+ if (anchor) { element.style.marginLeft = `${-anchor[0]}px`; element.style.marginTop = `${-anchor[1]}px`; }
1014
+ return element;
1015
+ },
1016
+ });
1017
+ L.Icon.Default = L.Icon.extend({
1018
+ options: {
1019
+ iconUrl: 'https://unpkg.com/leaflet@1.9/dist/images/marker-icon.png',
1020
+ shadowUrl: 'https://unpkg.com/leaflet@1.9/dist/images/marker-shadow.png',
1021
+ iconSize: [25, 41], iconAnchor: [12, 41], shadowSize: [41, 41], shadowAnchor: [12, 41],
1022
+ },
1023
+ });
1024
+ L.DivIcon = L.Icon.extend({
1025
+ createIcon() {
1026
+ const element = L.DomUtil.create('div', `leaflet-marker-icon ${this.options.className || ''}`);
1027
+ if (this.options.html instanceof Node) element.append(this.options.html); else element.innerHTML = this.options.html || '';
1028
+ const size = this.options.iconSize || [12, 12], anchor = this.options.iconAnchor || size.map(value => value / 2);
1029
+ element.style.cssText = `width:${size[0]}px;height:${size[1]}px;margin-left:${-anchor[0]}px;margin-top:${-anchor[1]}px`;
1030
+ return element;
1031
+ },
1032
+ createShadow() { return null; },
1033
+ });
1034
+ L.Marker.include({
1035
+ options: { pane: 'markerPane', icon: new L.Icon.Default(), opacity: 1, interactive: true, zIndexOffset: 0 },
1036
+ initialize(value, options) { L.Util.setOptions(this, options); this._latlng = latLng(value); },
1037
+ getLatLng() { return this._latlng; },
1038
+ setLatLng(value) { this._latlng = latLng(value); this.update(); return this.fire('move', { latlng: this._latlng }); },
1039
+ setIcon(icon) { this.options.icon = icon; if (this._map) { this.onRemove(); this.onAdd(); } return this; },
1040
+ getEvents() { return { zoom: this.update, viewreset: this.update }; },
1041
+ onAdd() {
1042
+ this._icon = this.options.icon.createIcon(); this._shadow = this.options.icon.createShadow();
1043
+ this._icon.tabIndex = 0; this._icon.setAttribute('role', 'button');
1044
+ this._icon.setAttribute('aria-label', this.options.title || 'Marker');
1045
+ this._icon.title = this.options.title || '';
1046
+ for (const element of [this._shadow, this._icon]) if (element) this.getPane().append(element);
1047
+ this._initInteraction(); this.update();
1048
+ },
1049
+ onRemove() { this.dragging?.disable(); this._icon?.remove(); this._shadow?.remove(); },
1050
+ update() { if (this._map && this._icon) this._setPos(this._map.latLngToLayerPoint(this._latlng)); return this; },
1051
+ _setPos(value) {
1052
+ for (const element of [this._icon, this._shadow]) if (element) L.DomUtil.setPosition(element, value);
1053
+ this._zIndex = value.y + this.options.zIndexOffset; this._updateZIndex(0);
1054
+ },
1055
+ _updateZIndex(offset) { if (this._icon) this._icon.style.zIndex = this._zIndex + offset; },
1056
+ setOpacity(opacity) { this.options.opacity = opacity; return this; },
1057
+ setZIndexOffset(value) { this.options.zIndexOffset = value; return this.update(); },
1058
+ _initInteraction() {
1059
+ this._icon._cityLayer = this;
1060
+ const drag = this.dragging = new L.Handler(this._map);
1061
+ const icon = this._icon;
1062
+ L.DomEvent.on(icon, 'pointerdown', event => {
1063
+ this._map._moved = false;
1064
+ event.stopPropagation();
1065
+ });
1066
+ L.DomEvent.on(icon, 'keydown', event => {
1067
+ if (event.key !== 'Enter' && event.key !== ' ') return;
1068
+ L.DomEvent.stop(event);
1069
+ this.fire('click', { latlng: this._latlng, originalEvent: event });
1070
+ });
1071
+ drag._marker = this;
1072
+ drag._draggable = new L.Evented();
1073
+ drag._onDrag = function () {
1074
+ const marker = this._marker;
1075
+ marker._latlng = marker._map.layerPointToLatLng(L.DomUtil.getPosition(marker._icon));
1076
+ marker.fire('move', { latlng: marker._latlng }).fire('drag', { latlng: marker._latlng });
1077
+ };
1078
+ drag._adjustPan = function () {};
1079
+ drag._draggable.on('drag', drag._onDrag, drag);
1080
+ let pointer, anchor, origin, moved;
1081
+ const handle = event => {
1082
+ if (!drag.enabled()) return;
1083
+ if (event.type === 'pointerdown') {
1084
+ if (event.button !== 0) return;
1085
+ event.preventDefault(); event.stopPropagation();
1086
+ pointer = event.pointerId; anchor = [event.clientX, event.clientY];
1087
+ origin = this._map.latLngToContainerPoint(this._latlng); moved = false;
1088
+ icon.setPointerCapture(pointer);
1089
+ this.fire('dragstart');
1090
+ } else if (event.pointerId === pointer && event.type === 'pointermove') {
1091
+ const value = new L.Point(origin.x + event.clientX - anchor[0], origin.y + event.clientY - anchor[1]);
1092
+ L.DomUtil.setPosition(icon, value);
1093
+ drag._draggable._newPos = value;
1094
+ drag._draggable.fire('drag', { originalEvent: event });
1095
+ moved = true;
1096
+ } else if (event.pointerId === pointer) {
1097
+ if (icon.hasPointerCapture(pointer)) icon.releasePointerCapture(pointer);
1098
+ pointer = null; this.fire('dragend'); this._map._moved = moved;
1099
+ }
1100
+ };
1101
+ drag.addHooks = () => L.DomEvent.on(icon, 'pointerdown pointermove pointerup pointercancel', handle);
1102
+ drag.removeHooks = () => L.DomEvent.off(icon, 'pointerdown pointermove pointerup pointercancel', handle);
1103
+ if (this.options.draggable) drag.enable();
1104
+ },
1105
+ });
1106
+
1107
+ L.Map.include({
1108
+ _fireDOMEvent(event, type = event.type, targets) {
1109
+ const rect = this.getContainer().getBoundingClientRect();
1110
+ const pixel = new L.Point(event.clientX - rect.left, event.clientY - rect.top);
1111
+ const location = this.containerPointToLatLng(pixel);
1112
+ const layer = event.target.closest?.('.leaflet-marker-icon')?._cityLayer;
1113
+ if (type === 'click' && this._draggableMoved(layer)) return;
1114
+ for (const target of targets || (layer ? [layer] : [this])) {
1115
+ target.fire(type, { originalEvent: event, latlng: location, containerPoint: pixel,
1116
+ layerPoint: this.containerPointToLayerPoint(pixel) });
1117
+ }
1118
+ },
1119
+ });
1120
+ L.Map.addInitHook(function () {
1121
+ for (const [name, order] of [['tilePane', 200], ['overlayPane', 400], ['markerPane', 600]]) {
1122
+ this.createPane(name).style.zIndex = order;
1123
+ }
1124
+ const handler = event => this._fireDOMEvent(event);
1125
+ L.DomEvent.on(this.getContainer(), 'click mousemove mouseout mouseover', handler);
1126
+ this.once('unload', () => L.DomEvent.off(this.getContainer(), 'click mousemove mouseout mouseover', handler));
1127
+ });
1128
+ })();