leaflet-city-mapper 0.0.3 → 0.0.5

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 (1085) hide show
  1. package/README.md +44 -36
  2. package/cucumber.mjs +9 -9
  3. package/dist/leaflet-city-mapper-src.js +16302 -0
  4. package/dist/leaflet-city-mapper-src.js.map +7 -0
  5. package/dist/leaflet-city-mapper-worker-src.js +955 -0
  6. package/dist/leaflet-city-mapper-worker-src.js.map +7 -0
  7. package/dist/leaflet-city-mapper-worker.js +2 -0
  8. package/dist/leaflet-city-mapper-worker.js.map +7 -0
  9. package/dist/leaflet-city-mapper.js +4 -3
  10. package/dist/leaflet-city-mapper.js.map +4 -4
  11. package/libs/leaflet-lens.js +122 -0
  12. package/libs/leaflet.js +76 -0
  13. package/libs/openlayers-bindings.js +1128 -0
  14. package/libs/openlayers-bindings.min.js +99 -0
  15. package/libs/openlayers-bindings.min.js.map +7 -0
  16. package/package.json +6 -4
  17. package/src/animations/cancelCameraAnimation.js +17 -0
  18. package/src/animations/cancelGridFade.js +15 -0
  19. package/src/animations/endZoom.js +27 -0
  20. package/src/animations/mapAnimateCamera.js +26 -0
  21. package/src/animations/mapStopPitchBearingAnimation.js +6 -0
  22. package/src/animations/onZoomAnim.js +19 -0
  23. package/src/animations/renderPendingZoomAnimation.js +13 -0
  24. package/src/animations/runCameraAnimations.js +33 -0
  25. package/src/animations/runGridFades.js +20 -0
  26. package/src/animations/runMarkerPanFrame.js +14 -0
  27. package/src/animations/scheduleCameraAnimation.js +14 -0
  28. package/src/animations/scheduleGridFade.js +16 -0
  29. package/src/animations/scheduleMarkerPan.js +11 -0
  30. package/src/{scene → animations}/startZoom.js +5 -1
  31. package/src/animations/synchronizeZoomView.js +28 -0
  32. package/src/animations/updateZoomCamera.js +21 -0
  33. package/src/archives/decodeDirectory.js +44 -26
  34. package/src/archives/decodeHeader.js +15 -11
  35. package/src/archives/decompress.js +7 -2
  36. package/src/archives/findDirectoryEntry.js +9 -0
  37. package/src/archives/findTile.js +31 -0
  38. package/src/archives/getDirectoryEntries.js +19 -0
  39. package/src/archives/getHeader.js +12 -4
  40. package/src/archives/getTileData.js +13 -0
  41. package/src/archives/getZxy.js +10 -65
  42. package/src/archives/loadDirectory.js +3 -3
  43. package/src/archives/loadSource.js +25 -10
  44. package/src/archives/readArchiveRange.js +34 -0
  45. package/src/archives/readVarint.js +19 -0
  46. package/src/archives/tileId.js +7 -3
  47. package/src/astronomy/horizontalPosition.js +16 -0
  48. package/src/astronomy/moonPosition.js +18 -0
  49. package/src/astronomy/solarPosition.js +18 -0
  50. package/src/astronomy/solarTime.js +11 -0
  51. package/src/camera/cameraMapReady.js +5 -1
  52. package/src/camera/cleanupCameraMap.js +10 -5
  53. package/src/camera/createSceneCamera.js +21 -0
  54. package/src/camera/fitCameraBounds.js +36 -26
  55. package/src/camera/getBearing.js +5 -0
  56. package/src/camera/getPitch.js +5 -0
  57. package/src/camera/initializeCameraMap.js +10 -3
  58. package/src/camera/mapCamera.js +23 -43
  59. package/src/camera/mapContainerPointToLayerPoint.js +6 -4
  60. package/src/camera/mapGetBearing.js +5 -1
  61. package/src/camera/mapGetBounds.js +14 -8
  62. package/src/camera/mapGetBoundsCenterZoom.js +6 -3
  63. package/src/camera/mapGetBoundsZoom.js +19 -9
  64. package/src/camera/mapGetCenterLayerPoint.js +3 -2
  65. package/src/camera/mapGetPitch.js +5 -1
  66. package/src/camera/mapLayerPointToContainerPoint.js +5 -4
  67. package/src/camera/mapLimitCenter.js +13 -8
  68. package/src/camera/mapLimitOffset.js +7 -3
  69. package/src/camera/mapPanBy.js +5 -4
  70. package/src/camera/mapPanInside.js +17 -11
  71. package/src/camera/mapResetNorth.js +4 -1
  72. package/src/camera/mapResetNorthPitch.js +4 -1
  73. package/src/camera/mapSetBearing.js +3 -1
  74. package/src/camera/mapSetPitch.js +3 -1
  75. package/src/camera/mapSetPitchAndBearing.js +21 -11
  76. package/src/camera/mapSetZoomAround.js +12 -8
  77. package/src/camera/mapTryAnimatedPan.js +3 -2
  78. package/src/camera/mapUpdateCameraOverlays.js +3 -2
  79. package/src/camera/updateMapCamera.js +50 -0
  80. package/src/camera/updateSceneCamera.js +57 -0
  81. package/src/camera/updateSky.js +21 -14
  82. package/src/cog/decodeCogTile.js +24 -0
  83. package/src/cog/finiteCogValues.js +5 -0
  84. package/src/cog/getCogAssetEntry.js +15 -0
  85. package/src/cog/getCogBase.js +10 -0
  86. package/src/cog/getCogHeader.js +3 -0
  87. package/src/cog/getCogProfile.js +16 -0
  88. package/src/cog/getCogTile.js +12 -0
  89. package/src/cog/getColorTile.js +25 -0
  90. package/src/cog/getElevationTile.js +16 -0
  91. package/src/cog/hasCogProjection.js +9 -0
  92. package/src/cog/initCog.js +7 -0
  93. package/src/cog/invalidCogFullResponse.js +3 -0
  94. package/src/cog/openCog.js +30 -0
  95. package/src/cog/openCogAsset.js +14 -0
  96. package/src/cog/readCog.js +25 -0
  97. package/src/cog/readCogBlock.js +8 -0
  98. package/src/cog/readCogBody.js +20 -0
  99. package/src/cog/readCogDirectories.js +20 -0
  100. package/src/cog/readCogDirectory.js +21 -0
  101. package/src/cog/readCogLevel.js +27 -0
  102. package/src/cog/readCogTag.js +15 -0
  103. package/src/cog/validCogDimensions.js +6 -0
  104. package/src/cog/validCogEncoding.js +5 -0
  105. package/src/cog/validCogGeoArrays.js +8 -0
  106. package/src/cog/validCogGrid.js +9 -0
  107. package/src/cog/validCogTileCoordinates.js +4 -0
  108. package/src/cog/validateCogContainer.js +9 -0
  109. package/src/cog/validateCogContentRange.js +8 -0
  110. package/src/cog/validateCogOffsets.js +10 -0
  111. package/src/cog/validateCogRange.js +7 -0
  112. package/src/cog/validateCogResponse.js +15 -0
  113. package/src/collision/collider.js +31 -24
  114. package/src/collision/hiddenLightHit.js +8 -0
  115. package/src/collision/indexTriangle.js +11 -0
  116. package/src/collision/insideMesh.js +53 -0
  117. package/src/collision/insideWalker.js +46 -0
  118. package/src/collision/intersectMeshes.js +32 -133
  119. package/src/collision/localRay.js +21 -0
  120. package/src/collision/mergeHits.js +11 -0
  121. package/src/collision/rayBounds.js +19 -0
  122. package/src/collision/readTriangle.js +20 -0
  123. package/src/collision/sortHits.js +5 -11
  124. package/src/collision/trafficCollision.js +60 -0
  125. package/src/collision/transformTriangle.js +9 -0
  126. package/src/collision/triangleDistance.js +21 -0
  127. package/src/collision/worldHit.js +18 -0
  128. package/src/colors/formatRGB.js +8 -0
  129. package/src/colors/mixColor.js +7 -0
  130. package/src/{utils → colors}/parseColor.js +5 -5
  131. package/src/controls/addCameraHandler.js +11 -0
  132. package/src/controls/adjustCameraDrag.js +9 -3
  133. package/src/controls/cameraControls.js +56 -22
  134. package/src/controls/cameraDragClick.js +8 -7
  135. package/src/controls/cameraDragContextMenu.js +3 -2
  136. package/src/controls/cameraDragDown.js +21 -18
  137. package/src/controls/cameraDragEnd.js +3 -2
  138. package/src/controls/cameraDragMove.js +11 -6
  139. package/src/controls/changeCameraTouch.js +8 -2
  140. package/src/controls/cleanupCameraTouch.js +23 -16
  141. package/src/controls/compassAddHooks.js +13 -10
  142. package/src/controls/compassOrientation.js +2 -1
  143. package/src/controls/containerResizeAddHooks.js +3 -3
  144. package/src/controls/dragCamera.js +18 -14
  145. package/src/controls/endAllCameraDrags.js +4 -2
  146. package/src/controls/endAllCameraTouches.js +4 -2
  147. package/src/controls/endCameraTouch.js +3 -2
  148. package/src/controls/endCameraTouchEvent.js +5 -2
  149. package/src/controls/failCompassPermission.js +4 -0
  150. package/src/controls/finishCompassPermission.js +10 -9
  151. package/src/controls/loadCameraControls.js +2 -2
  152. package/src/controls/moveCameraTouch.js +18 -9
  153. package/src/controls/pitchDragAddHooks.js +3 -1
  154. package/src/controls/refreshRotateControl.js +9 -6
  155. package/src/controls/removeCameraDrag.js +7 -4
  156. package/src/controls/rotateButtonClick.js +8 -4
  157. package/src/controls/rotateButtonKeydown.js +8 -4
  158. package/src/controls/rotateControl.js +3 -2
  159. package/src/controls/rotateOnAdd.js +32 -28
  160. package/src/controls/shiftRotateAddHooks.js +6 -4
  161. package/src/controls/shiftRotateWheel.js +4 -2
  162. package/src/controls/startCameraTouch.js +34 -22
  163. package/src/core/adjustCameraMarkerPan.js +26 -20
  164. package/src/core/cameraCircleBounds.js +3 -2
  165. package/src/core/cameraMarkerDrag.js +16 -13
  166. package/src/core/cameraMarkerOnDrag.js +7 -2
  167. package/src/core/closestCameraLayerPoint.js +3 -2
  168. package/src/core/fireRasterLoad.js +3 -2
  169. package/src/core/gridlayerGetEvents.js +7 -4
  170. package/src/core/gridlayerGetTiledPixelBounds.js +8 -4
  171. package/src/core/initializeGridContainer.js +3 -2
  172. package/src/core/initializeNativeLayer.js +19 -20
  173. package/src/core/layerCallInitHooks.js +15 -0
  174. package/src/core/markerGetEvents.js +6 -2
  175. package/src/core/markerInitInteraction.js +4 -2
  176. package/src/core/markerSetIcon.js +6 -3
  177. package/src/core/markerSetPos.js +11 -6
  178. package/src/core/markerSetRotation.js +9 -7
  179. package/src/core/markerUpdateZIndex.js +10 -5
  180. package/src/core/popupAdjustPan.js +25 -19
  181. package/src/core/popupGetEvents.js +5 -2
  182. package/src/core/popupUpdatePosition.js +6 -3
  183. package/src/core/redrawPath.js +6 -0
  184. package/src/core/removeLayer.js +23 -0
  185. package/src/core/setRotation.js +5 -0
  186. package/src/core/tooltipGetEvents.js +5 -2
  187. package/src/core/tooltipSetPosition.js +6 -3
  188. package/src/core/updateGridOpacity.js +9 -5
  189. package/src/core/whenReady.js +11 -0
  190. package/src/geometry/addBridges.js +33 -87
  191. package/src/geometry/addGeneratedTriangle.js +7 -0
  192. package/src/{sources/addTriangle.js → geometry/appendAreaTriangle.js} +5 -5
  193. package/src/geometry/appendRouteDash.js +15 -0
  194. package/src/geometry/appendRouteSegment.js +15 -0
  195. package/src/geometry/assembleAreaGeometry.js +41 -0
  196. package/src/geometry/boundsQuad.js +12 -0
  197. package/src/geometry/box.js +6 -1
  198. package/src/geometry/bridgeEdge.js +11 -0
  199. package/src/geometry/bridgeElevation.js +3 -1
  200. package/src/geometry/bridgeFaces.js +15 -0
  201. package/src/geometry/bridgePaths.js +11 -0
  202. package/src/geometry/bridgePolygon.js +31 -0
  203. package/src/geometry/bridgeSides.js +11 -0
  204. package/src/geometry/buildExtrudedPolygon.js +10 -0
  205. package/src/geometry/{build.js → buildGeometryParts.js} +10 -6
  206. package/src/geometry/buildProjectedPoint.js +21 -0
  207. package/src/{sources/buildAreaPolygon.js → geometry/buildProjectedPolygon.js} +25 -29
  208. package/src/geometry/circleAt.js +4 -2
  209. package/src/geometry/circleGeometry.js +34 -0
  210. package/src/geometry/clipLine.js +1 -1
  211. package/src/geometry/clipSegment.js +11 -7
  212. package/src/geometry/computeBounds.js +28 -12
  213. package/src/geometry/conformModelToTerrain.js +25 -14
  214. package/src/geometry/createLampRing.js +14 -0
  215. package/src/geometry/createModelGeometry.js +41 -0
  216. package/src/geometry/createRasterQuadGeometry.js +29 -0
  217. package/src/geometry/createTreeRing.js +15 -0
  218. package/src/geometry/crossVector.js +7 -0
  219. package/src/geometry/dashValues.js +14 -0
  220. package/src/geometry/dashedSegment.js +16 -0
  221. package/src/geometry/disk.js +1 -1
  222. package/src/geometry/diskAt.js +4 -2
  223. package/src/geometry/emitter.js +2 -2
  224. package/src/{sources → geometry}/generateTreeGeometry.js +5 -3
  225. package/src/geometry/indexBridge.js +30 -0
  226. package/src/{sources → geometry}/instanceAreaGeometry.js +9 -7
  227. package/src/{traffic/along.js → geometry/interpolateRoute.js} +8 -2
  228. package/src/geometry/lampPostGeometry.js +14 -8
  229. package/src/geometry/lightGeometry.js +3 -3
  230. package/src/geometry/line.js +21 -54
  231. package/src/geometry/lineJoin.js +26 -0
  232. package/src/geometry/markerImageBounds.js +11 -0
  233. package/src/geometry/markerQuadCorners.js +51 -0
  234. package/src/geometry/meshShadowBounds.js +24 -0
  235. package/src/geometry/nativeGeometry.js +11 -45
  236. package/src/geometry/offsetBelowGround.js +3 -0
  237. package/src/geometry/polygon.js +5 -4
  238. package/src/geometry/quad.js +8 -3
  239. package/src/geometry/restoreGeometry.js +23 -0
  240. package/src/geometry/roofCoverage.js +26 -52
  241. package/src/geometry/roofFootprint.js +32 -0
  242. package/src/geometry/routeGeometry.js +21 -0
  243. package/src/geometry/segment.js +3 -2
  244. package/src/geometry/setVertexColor.js +3 -1
  245. package/src/geometry/shadowBounds.js +23 -0
  246. package/src/geometry/subtractRoofTile.js +19 -0
  247. package/src/geometry/subtractVector.js +6 -0
  248. package/src/geometry/surface.js +3 -2
  249. package/src/geometry/terrainBuffers.js +29 -0
  250. package/src/geometry/terrainGrid.js +32 -0
  251. package/src/geometry/terrainTileGeometry.js +19 -0
  252. package/src/geometry/treeGeometry.js +7 -8
  253. package/src/geometry/triangle.js +8 -7
  254. package/src/geometry/validateTree.js +7 -0
  255. package/src/geometry/vertexNormals.js +10 -16
  256. package/src/geometry/{visit.js → visitNativeCoordinates.js} +2 -1
  257. package/src/{constants → globals}/CELL.js +0 -1
  258. package/src/globals/Compass.js +1 -0
  259. package/src/globals/ContainerResize.js +1 -0
  260. package/src/{constants → globals}/HEIGHT.js +1 -1
  261. package/src/globals/L.js +1 -0
  262. package/src/globals/PitchDrag.js +1 -0
  263. package/src/globals/ShiftRotate.js +1 -0
  264. package/src/globals/TouchMode.js +1 -0
  265. package/src/globals/alphaBlend.js +12 -0
  266. package/src/globals/archiveDecoder.js +1 -0
  267. package/src/globals/archiveNorthWest.js +1 -0
  268. package/src/globals/archiveSouthEast.js +1 -0
  269. package/src/globals/atmosphereColor.js +1 -0
  270. package/src/globals/atmosphereStops.js +22 -0
  271. package/src/globals/blobParts.js +1 -0
  272. package/src/globals/cameraAngles.js +1 -0
  273. package/src/globals/cameraAnimatedOptions.js +3 -0
  274. package/src/globals/cameraAnimationFrame.js +1 -0
  275. package/src/globals/cameraAnimations.js +1 -0
  276. package/src/globals/cameraBearingSensitivity.js +1 -0
  277. package/src/globals/cameraDragSensitivity.js +1 -0
  278. package/src/globals/cameraDrags.js +1 -0
  279. package/src/globals/cameraEmptyOptions.js +1 -0
  280. package/src/globals/cameraFocusOptions.js +3 -0
  281. package/src/globals/cameraFov.js +3 -0
  282. package/src/globals/cameraListenerOptions.js +4 -0
  283. package/src/globals/cameraTouchStates.js +1 -0
  284. package/src/globals/cameraZeroPadding.js +1 -0
  285. package/src/globals/cogTags.js +1 -0
  286. package/src/globals/colorLayout.js +8 -0
  287. package/src/globals/coreEventTypes.js +4 -0
  288. package/src/globals/coreMatrixKeys.js +4 -0
  289. package/src/globals/coreQuadIndices.js +1 -0
  290. package/src/globals/coreQuadUV.js +1 -0
  291. package/src/globals/coreSampler.js +4 -0
  292. package/src/globals/coreWhite.js +1 -0
  293. package/src/globals/cosObliquity.js +3 -0
  294. package/src/globals/coverageTiles.js +1 -0
  295. package/src/globals/defaultMaterial.js +1 -0
  296. package/src/globals/degrees.js +1 -0
  297. package/src/globals/demBuffer.js +4 -0
  298. package/src/globals/demLayout.js +3 -0
  299. package/src/globals/demSize.js +1 -0
  300. package/src/globals/demTarget.js +3 -0
  301. package/src/globals/demTexture.js +5 -0
  302. package/src/globals/depthBindGroup.js +9 -0
  303. package/src/globals/depthTexture.js +5 -0
  304. package/src/globals/directoryReader.js +4 -0
  305. package/src/globals/disabledShadow.js +1 -0
  306. package/src/globals/drawEntries.js +1 -0
  307. package/src/globals/drawFrameEntry.js +7 -0
  308. package/src/globals/drawMeshEntry.js +7 -0
  309. package/src/globals/drawSamplerEntries.js +18 -0
  310. package/src/globals/drawTerrainEntry.js +4 -0
  311. package/src/globals/drawTextureEntries.js +18 -0
  312. package/src/globals/earthCirc.js +1 -0
  313. package/src/{constants → globals}/elevationWGSL.js +1 -1
  314. package/src/globals/fragmentShader.js +3 -0
  315. package/src/globals/frameBuffer.js +4 -0
  316. package/src/globals/frameCommands.js +1 -0
  317. package/src/globals/frameLayoutEntry.js +7 -0
  318. package/src/globals/geometryDecoder.js +1 -0
  319. package/src/globals/geometryEmpty.js +1 -0
  320. package/src/globals/geometryImageOptions.js +4 -0
  321. package/src/globals/geometryPixelStates.js +1 -0
  322. package/src/globals/geometryQuaternion.js +1 -0
  323. package/src/globals/geometryScale.js +1 -0
  324. package/src/globals/geometrySemantics.js +5 -0
  325. package/src/globals/geometryTranslation.js +1 -0
  326. package/src/globals/geometryWorkerUrl.js +3 -0
  327. package/src/globals/gridEvents.js +1 -0
  328. package/src/globals/gridFadeFrame.js +1 -0
  329. package/src/globals/halfRadians.js +1 -0
  330. package/src/globals/headerBounds.js +1 -0
  331. package/src/globals/headerFlags.js +1 -0
  332. package/src/globals/headerOffsets.js +5 -0
  333. package/src/globals/hull.js +10 -0
  334. package/src/globals/instanceLayout.js +9 -0
  335. package/src/globals/lampDirections.js +8 -0
  336. package/src/globals/layerCallInitHooks.js +1 -0
  337. package/src/globals/layerProto.js +1 -0
  338. package/src/globals/lightScale.js +1 -0
  339. package/src/{constants → globals}/limbs.js +0 -1
  340. package/src/globals/loading.js +1 -0
  341. package/src/globals/mapMethods.js +1 -0
  342. package/src/globals/markerMethods.js +1 -0
  343. package/src/globals/markerPanFrame.js +1 -0
  344. package/src/globals/meshBindGroup.js +4 -0
  345. package/src/globals/meshBuffer.js +4 -0
  346. package/src/globals/meshCopySize.js +1 -0
  347. package/src/globals/meshImage.js +4 -0
  348. package/src/globals/meshLayoutEntry.js +8 -0
  349. package/src/globals/meshOffsets.js +1 -0
  350. package/src/globals/meshPipeline.js +27 -0
  351. package/src/globals/meshStack.js +3 -0
  352. package/src/globals/meshTarget.js +3 -0
  353. package/src/globals/nativeMethodHandlers.js +31 -0
  354. package/src/globals/nextId.js +1 -0
  355. package/src/globals/normalLayout.js +8 -0
  356. package/src/globals/parts.js +24 -0
  357. package/src/globals/pendingGridFades.js +1 -0
  358. package/src/globals/pendingInitializations.js +1 -0
  359. package/src/globals/pendingMapChanges.js +1 -0
  360. package/src/globals/pendingMarkerPan.js +1 -0
  361. package/src/globals/pendingPlacements.js +1 -0
  362. package/src/globals/pendingRasterLoads.js +1 -0
  363. package/src/globals/pendingZoomAnimations.js +1 -0
  364. package/src/globals/pipelineLayout.js +3 -0
  365. package/src/globals/popupEvents.js +1 -0
  366. package/src/globals/popupPan.js +1 -0
  367. package/src/globals/popupPosition.js +1 -0
  368. package/src/globals/positionLayout.js +8 -0
  369. package/src/globals/programEntries.js +1 -0
  370. package/src/globals/programLayout.js +3 -0
  371. package/src/globals/radians.js +1 -0
  372. package/src/globals/rasterBuffer.js +4 -0
  373. package/src/globals/rasterIndices.js +1 -0
  374. package/src/globals/rasterNormals.js +1 -0
  375. package/src/globals/rasterPoint.js +4 -0
  376. package/src/globals/rasterPositions.js +1 -0
  377. package/src/globals/rasterSampler.js +6 -0
  378. package/src/globals/rasterTexture.js +5 -0
  379. package/src/globals/rasterUVs.js +1 -0
  380. package/src/globals/removeLayer.js +1 -0
  381. package/src/globals/renderEmpty.js +1 -0
  382. package/src/globals/ringDirections.js +49 -0
  383. package/src/globals/roofBindGroup.js +17 -0
  384. package/src/globals/roofBlitSampler.js +4 -0
  385. package/src/globals/roofBuffer.js +4 -0
  386. package/src/globals/roofCommands.js +1 -0
  387. package/src/globals/roofCopySize.js +1 -0
  388. package/src/globals/roofImage.js +3 -0
  389. package/src/globals/roofMin.js +4 -0
  390. package/src/globals/roofOpacities.js +1 -0
  391. package/src/globals/roofPass.js +13 -0
  392. package/src/globals/roofPipeline.js +29 -0
  393. package/src/globals/roofSampler.js +4 -0
  394. package/src/globals/roofShader.js +16 -0
  395. package/src/globals/roofSignatures.js +1 -0
  396. package/src/globals/roofSize.js +4 -0
  397. package/src/globals/roofTarget.js +3 -0
  398. package/src/globals/roofTexture.js +5 -0
  399. package/src/globals/roofTiles.js +1 -0
  400. package/src/globals/roundProfile.js +7 -0
  401. package/src/globals/samplerLayoutEntries.js +36 -0
  402. package/src/globals/sceneCleanupFields.js +1 -0
  403. package/src/globals/sceneEmptyOptions.js +1 -0
  404. package/src/globals/scenePass.js +19 -0
  405. package/src/globals/sceneSunlightUniforms.js +3 -0
  406. package/src/globals/sceneTransferFields.js +1 -0
  407. package/src/globals/sceneWalkHandlers.js +1 -0
  408. package/src/globals/shadowBindGroup.js +10 -0
  409. package/src/globals/shadowBounds.js +4 -0
  410. package/src/globals/shadowCamera.js +15 -0
  411. package/src/globals/shadowDepthLayout.js +9 -0
  412. package/src/globals/shadowHigh.js +1 -0
  413. package/src/globals/shadowInstanceLayouts.js +4 -0
  414. package/src/globals/shadowLayouts.js +3 -0
  415. package/src/globals/shadowLow.js +1 -0
  416. package/src/globals/shadowMeshLayout.js +10 -0
  417. package/src/globals/shadowOffsets.js +1 -0
  418. package/src/globals/shadowPass.js +9 -0
  419. package/src/globals/shadowPipeline.js +24 -0
  420. package/src/globals/shadowPipelineLayout.js +3 -0
  421. package/src/globals/shadowShader.js +3 -0
  422. package/src/globals/shadowTexture.js +5 -0
  423. package/src/globals/shadowValues.js +1 -0
  424. package/src/globals/sinObliquity.js +3 -0
  425. package/src/globals/sizes.js +6 -0
  426. package/src/globals/sunBindGroup.js +20 -0
  427. package/src/globals/tau.js +1 -0
  428. package/src/globals/terrainLayoutEntry.js +8 -0
  429. package/src/globals/textureLayoutEntries.js +41 -0
  430. package/src/globals/tiledBounds.js +1 -0
  431. package/src/globals/tooltipEvents.js +1 -0
  432. package/src/globals/tooltipPosition.js +1 -0
  433. package/src/globals/trafficClocks.js +1 -0
  434. package/src/globals/trafficEmptyList.js +1 -0
  435. package/src/globals/trafficEmptyOptions.js +1 -0
  436. package/src/globals/trafficRouteMaterial.js +1 -0
  437. package/src/{constants → globals}/trafficShader.js +49 -49
  438. package/src/globals/triangleContexts.js +1 -0
  439. package/src/globals/uVLayout.js +8 -0
  440. package/src/{constants → globals}/vehicles.js +24 -9
  441. package/src/globals/vertexShader.js +3 -0
  442. package/src/globals/wantedTiles.js +1 -0
  443. package/src/gpu/initializeRendererResources.js +36 -0
  444. package/src/gpu/initializeSharedRenderer.js +52 -0
  445. package/src/gpu/mountRenderer.js +26 -0
  446. package/src/{scene → gpu}/releaseRenderer.js +2 -2
  447. package/src/gpu/rendererDeviceError.js +16 -0
  448. package/src/gpu/rendererDeviceLost.js +16 -0
  449. package/src/gpu/reportShaderCompilation.js +17 -0
  450. package/src/gpu/requestAdapter.js +12 -0
  451. package/src/gpu/requestDevice.js +9 -0
  452. package/src/index.js +34 -37
  453. package/src/layer-controls/layerCountTitle.js +6 -0
  454. package/src/{scene → layer-controls}/placeEntry.js +3 -1
  455. package/src/layer-controls/placeEntryElement.js +22 -0
  456. package/src/{scene → layer-controls}/removeEntry.js +2 -0
  457. package/src/layer-controls/renderLayerCount.js +20 -0
  458. package/src/{scene → layer-controls}/replaceEntry.js +4 -2
  459. package/src/{scene → layer-controls}/runPlacements.js +4 -2
  460. package/src/{scene → layer-controls}/underEntry.js +2 -3
  461. package/src/layer-controls/updateLayerCount.js +24 -0
  462. package/src/lighting/cacheLightGrid.js +14 -5
  463. package/src/lighting/collectLightMeshes.js +4 -1
  464. package/src/lighting/lightGrid.js +10 -9
  465. package/src/lighting/updatePointLights.js +19 -12
  466. package/src/lighting/visitLightCells.js +13 -0
  467. package/src/lighting/visitLightGridCells.js +8 -0
  468. package/src/lighting/worldLights.js +10 -12
  469. package/src/lighting/writeLightCell.js +5 -0
  470. package/src/materials/createProgram.js +76 -0
  471. package/src/materials/createProgramLayout.js +36 -0
  472. package/src/materials/createProgramUniforms.js +17 -0
  473. package/src/materials/modelMaterialFor.js +21 -0
  474. package/src/materials/prepareMeshCutout.js +12 -0
  475. package/src/materials/terrainRasterProgram.js +58 -0
  476. package/src/materials/validateRoofMaterial.js +10 -0
  477. package/src/models/applyModelTransform.js +14 -0
  478. package/src/models/buildModelNodes.js +14 -0
  479. package/src/models/createModelContext.js +15 -0
  480. package/src/models/decodeModel.js +9 -6
  481. package/src/models/loadBuffer.js +2 -2
  482. package/src/models/loadModel.js +31 -51
  483. package/src/models/loadModelResources.js +20 -0
  484. package/src/models/modelNode.js +26 -71
  485. package/src/models/normalizeAccessor.js +11 -0
  486. package/src/models/readAccessor.js +11 -31
  487. package/src/models/readAccessorValue.js +7 -0
  488. package/src/models/readAccessorValues.js +10 -6
  489. package/src/models/readModelAttributes.js +20 -0
  490. package/src/models/readModelIndices.js +16 -0
  491. package/src/models/readSparseAccessor.js +19 -0
  492. package/src/models/releaseModelResources.js +10 -0
  493. package/src/{core → native}/beforeNativeRender.js +1 -1
  494. package/src/native/bypassNativeEvent.js +11 -0
  495. package/src/{core → native}/disposeNativeLayer.js +14 -10
  496. package/src/native/forwardNativeError.js +3 -0
  497. package/src/native/handleNativeMapEvent.js +28 -0
  498. package/src/{core → native}/hideTargets.js +6 -4
  499. package/src/{core → native}/initNativeGPU.js +14 -7
  500. package/src/native/isCurrentNativeLayer.js +7 -0
  501. package/src/native/nativeEventSource.js +18 -0
  502. package/src/{core → native}/nativeEvents.js +8 -3
  503. package/src/native/nativeLayer.js +79 -0
  504. package/src/{core → native}/nativeLayerMethod.js +17 -3
  505. package/src/native/pruneNativeResources.js +20 -0
  506. package/src/{core → native}/putNativeMesh.js +12 -9
  507. package/src/native/quadNativeMesh.js +20 -0
  508. package/src/native/readyNativeGPU.js +10 -0
  509. package/src/native/refreshNativeLayer.js +35 -0
  510. package/src/native/refreshNativeLayerContract.js +9 -0
  511. package/src/{core → native}/rejectNativeReady.js +1 -0
  512. package/src/{core → native}/removeNativeEvents.js +2 -1
  513. package/src/native/removeTargets.js +13 -0
  514. package/src/native/reorderNativeLayer.js +17 -0
  515. package/src/{core → native}/resolveNativeReady.js +1 -0
  516. package/src/{core → native}/styleNativeMesh.js +6 -1
  517. package/src/{core → native}/syncGridLayer.js +11 -4
  518. package/src/{core → native}/syncImageOverlay.js +1 -1
  519. package/src/{core → native}/syncMarker.js +5 -3
  520. package/src/native/syncVectorLayer.js +29 -0
  521. package/src/{core → native}/synchronizeNativeLayer.js +10 -18
  522. package/src/native/updateNativeHover.js +7 -0
  523. package/src/native/updateNativeLayerView.js +10 -0
  524. package/src/picking/findFeature.js +17 -10
  525. package/src/picking/hit.js +23 -14
  526. package/src/picking/hitColliderCell.js +19 -0
  527. package/src/picking/hitMesh.js +12 -16
  528. package/src/picking/onClick.js +6 -2
  529. package/src/picking/onPointerLeave.js +6 -2
  530. package/src/picking/onPointerMove.js +15 -6
  531. package/src/picking/raycast.js +50 -38
  532. package/src/picking/setHighlight.js +16 -8
  533. package/src/picking/shouldSkipOther.js +5 -1
  534. package/src/picking/showFeature.js +21 -13
  535. package/src/picking/validateCameraInverse.js +8 -0
  536. package/src/projections/cameraAngles.js +14 -0
  537. package/src/projections/groundBounds.js +18 -0
  538. package/src/projections/localPixelForGeometry.js +7 -0
  539. package/src/projections/localPosition.js +11 -0
  540. package/src/projections/markerCameraIconPoint.js +12 -0
  541. package/src/projections/projectBridgePoint.js +5 -0
  542. package/src/projections/projectCameraPoint.js +27 -0
  543. package/src/projections/projectCelestialBody.js +13 -0
  544. package/src/projections/projectRing.js +26 -0
  545. package/src/projections/projectTreePoint.js +17 -0
  546. package/src/projections/toPoint.js +5 -0
  547. package/src/{camera/animationPoint.js → projections/transformZoomAnimationPoint.js} +5 -1
  548. package/src/projections/walkerLocalPosition.js +18 -0
  549. package/src/raster/addRasterTile.js +55 -90
  550. package/src/raster/comparePendingTiles.js +2 -2
  551. package/src/raster/createRasterMesh.js +78 -44
  552. package/src/raster/finishRasterAttachment.js +17 -0
  553. package/src/raster/finishRasterTile.js +58 -41
  554. package/src/raster/getRasterEvents.js +3 -3
  555. package/src/raster/getRasterTileSize.js +5 -3
  556. package/src/raster/initRaster.js +28 -24
  557. package/src/raster/isRasterLoading.js +8 -0
  558. package/src/raster/loadRasterTile.js +11 -7
  559. package/src/raster/onPMTileAdd.js +11 -7
  560. package/src/raster/onPMTileRemove.js +8 -4
  561. package/src/raster/pruneRasterTiles.js +23 -14
  562. package/src/raster/pumpRasterTiles.js +14 -8
  563. package/src/raster/rasterTileRange.js +23 -0
  564. package/src/raster/readyRaster.js +14 -10
  565. package/src/raster/registerTerrainTile.js +14 -9
  566. package/src/raster/releaseRasterTile.js +20 -14
  567. package/src/raster/releaseRasterTiles.js +15 -9
  568. package/src/raster/removeRasterTile.js +10 -5
  569. package/src/raster/{reportError.js → reportRasterError.js} +3 -3
  570. package/src/raster/retainRasterTiles.js +16 -0
  571. package/src/raster/setPMTileOpacity.js +4 -4
  572. package/src/raster/setPMTileZIndex.js +4 -4
  573. package/src/raster/setRasterOpacity.js +10 -5
  574. package/src/raster/setRasterTerrain.js +15 -8
  575. package/src/raster/setRasterZIndex.js +10 -5
  576. package/src/raster/updateAttachedTiles.js +8 -4
  577. package/src/raster/updateRasterTiles.js +40 -43
  578. package/src/rendering/collectFrameMeshes.js +26 -12
  579. package/src/rendering/collectMeshes.js +2 -24
  580. package/src/rendering/collectVisibleMesh.js +36 -0
  581. package/src/rendering/compareMeshDepth.js +6 -0
  582. package/src/rendering/compareMeshes.js +8 -10
  583. package/src/rendering/createMesh.js +28 -15
  584. package/src/rendering/disposeMesh.js +3 -3
  585. package/src/rendering/drawGeometry.js +22 -108
  586. package/src/rendering/drawPipeline.js +34 -0
  587. package/src/rendering/drawSceneMeshes.js +20 -21
  588. package/src/rendering/prepareFrameBuffer.js +18 -0
  589. package/src/rendering/prepareFrameMeshes.js +12 -14
  590. package/src/rendering/prepareFrameUniforms.js +12 -14
  591. package/src/rendering/prepareMeshUniforms.js +25 -0
  592. package/src/rendering/render.js +50 -31
  593. package/src/rendering/resizeRenderer.js +23 -16
  594. package/src/rendering/revealRoofMesh.js +34 -0
  595. package/src/scene/addRegisteredLayer.js +47 -0
  596. package/src/scene/addSceneLayer.js +18 -0
  597. package/src/scene/attachLayer.js +9 -5
  598. package/src/scene/attachSharedScene.js +69 -0
  599. package/src/scene/callLayer.js +28 -0
  600. package/src/scene/cancelUpdate.js +9 -5
  601. package/src/scene/createLayer.js +7 -0
  602. package/src/scene/createSceneNode.js +12 -0
  603. package/src/scene/emptyEvents.js +1 -1
  604. package/src/scene/failAttachment.js +9 -5
  605. package/src/scene/get3DEvents.js +14 -9
  606. package/src/scene/getLocation.js +8 -0
  607. package/src/scene/init3D.js +40 -25
  608. package/src/scene/initializeLayer.js +13 -5
  609. package/src/scene/initializerFor.js +3 -1
  610. package/src/scene/isNativeLayer.js +13 -0
  611. package/src/scene/layerInitialize.js +29 -14
  612. package/src/scene/onAdd3DLayer.js +33 -23
  613. package/src/scene/onMapChange.js +10 -7
  614. package/src/scene/onRemove3DLayer.js +61 -49
  615. package/src/scene/ready3D.js +40 -21
  616. package/src/scene/releaseSharedScene.js +31 -0
  617. package/src/scene/removeLayerEvents.js +12 -0
  618. package/src/scene/removeSceneLayer.js +16 -0
  619. package/src/scene/renderPendingMapChange.js +12 -5
  620. package/src/scene/renderPendingUpdates.js +14 -7
  621. package/src/scene/reportLayerError.js +3 -0
  622. package/src/scene/resolveNextInitialization.js +7 -6
  623. package/src/scene/restoreObject.js +26 -60
  624. package/src/scene/scheduleSceneUpdate.js +25 -0
  625. package/src/shaders/materialBaseShader.js +17 -0
  626. package/src/shaders/materialShaders.js +15 -131
  627. package/src/shaders/materialSurfaceShader.js +47 -0
  628. package/src/shaders/materialVertexShader.js +72 -0
  629. package/src/shaders/roofVertexShader.js +9 -0
  630. package/src/shadows/bindSunlight.js +19 -9
  631. package/src/shadows/drawShadowMeshes.js +26 -15
  632. package/src/shadows/ensureShadowPipeline.js +46 -35
  633. package/src/shadows/renderSunlight.js +14 -11
  634. package/src/shadows/resizeSunlight.js +17 -10
  635. package/src/shadows/shadowCacheMatches.js +3 -9
  636. package/src/shadows/shadowMatrix.js +38 -28
  637. package/src/shadows/shadowMeshMatches.js +11 -0
  638. package/src/sources/attachAreaMesh.js +44 -33
  639. package/src/sources/buildArea.js +25 -13
  640. package/src/sources/buildAreaFeature.js +24 -20
  641. package/src/sources/buildAreaPoint.js +3 -21
  642. package/src/sources/compareAreaDistance.js +1 -2
  643. package/src/sources/extrusionStyle.js +10 -0
  644. package/src/sources/featureAnchor.js +9 -0
  645. package/src/sources/initializeGeoJSON.js +5 -2
  646. package/src/sources/pendingSourceAreas.js +21 -0
  647. package/src/sources/prepareAreaGeometryJob.js +33 -0
  648. package/src/sources/pumpSourceAreas.js +37 -0
  649. package/src/sources/releaseArea.js +12 -7
  650. package/src/sources/setGeoJSONData.js +6 -2
  651. package/src/sources/sourceAreaContext.js +19 -8
  652. package/src/sources/updateArea.js +36 -25
  653. package/src/sources/updateSourceStatus.js +16 -0
  654. package/src/sunlight/{addTo.js → addTimeControlToMap.js} +2 -1
  655. package/src/sunlight/addTimeLayer.js +5 -1
  656. package/src/sunlight/atmosphere.js +9 -12
  657. package/src/sunlight/createSun.js +54 -0
  658. package/src/sunlight/initSunlight.js +8 -5
  659. package/src/sunlight/initializeTimeControl.js +16 -0
  660. package/src/sunlight/onAddSun.js +27 -65
  661. package/src/sunlight/onRemoveSun.js +10 -0
  662. package/src/sunlight/removeSun.js +12 -4
  663. package/src/sunlight/{remove.js → removeTimeControl.js} +1 -0
  664. package/src/sunlight/removeTimeLayer.js +6 -1
  665. package/src/sunlight/requestSunlightRender.js +9 -0
  666. package/src/sunlight/styleTimeControl.js +3 -3
  667. package/src/sunlight/updateCelestialDisc.js +12 -0
  668. package/src/sunlight/updateSky.js +14 -15
  669. package/src/sunlight/updateSun.js +15 -7
  670. package/src/sunlight/useSelectedTime.js +9 -5
  671. package/src/terrain/applyTerrain.js +24 -0
  672. package/src/terrain/clearLayerTerrain.js +9 -5
  673. package/src/terrain/copyTerrainTile.js +12 -0
  674. package/src/terrain/getElevation.js +12 -4
  675. package/src/terrain/initTerrain.js +17 -9
  676. package/src/terrain/loadTerrain.js +37 -48
  677. package/src/terrain/loadTerrainTiles.js +9 -4
  678. package/src/terrain/mapElevationOf.js +7 -0
  679. package/src/terrain/onTerrainAdd.js +17 -9
  680. package/src/terrain/onTerrainChange.js +6 -2
  681. package/src/terrain/onTerrainRemove.js +37 -19
  682. package/src/terrain/readBridges.js +1 -1
  683. package/src/terrain/readyTerrainOf.js +7 -0
  684. package/src/terrain/setLayerTerrain.js +9 -5
  685. package/src/terrain/setTerrainHeight.js +19 -10
  686. package/src/terrain/terrainAtlas.js +7 -13
  687. package/src/terrain/terrainElevation.js +6 -11
  688. package/src/terrain/terrainTileQueue.js +27 -0
  689. package/src/textures/addImageState.js +8 -0
  690. package/src/{core/addRasterImage.js → textures/attachRasterImage.js} +5 -3
  691. package/src/textures/bindMeshTextures.js +50 -0
  692. package/src/textures/collectRoofTiles.js +16 -0
  693. package/src/{rendering → textures}/compareRoofTiles.js +4 -4
  694. package/src/textures/composeRoofAtlas.js +71 -0
  695. package/src/textures/destroyTexture.js +10 -0
  696. package/src/{rendering/destroyAfterSubmission.js → textures/destroyTextureAfterSubmission.js} +8 -8
  697. package/src/textures/ensureRoofBlit.js +20 -0
  698. package/src/textures/loadModelImage.js +19 -0
  699. package/src/{models/textureFor.js → textures/modelTextureFor.js} +12 -8
  700. package/src/textures/modelTextureSampler.js +10 -0
  701. package/src/textures/nativeImageError.js +13 -0
  702. package/src/textures/nativeImageRefresh.js +11 -0
  703. package/src/{core/textureFor.js → textures/nativeTextureFor.js} +43 -44
  704. package/src/textures/prepareMeshTextures.js +23 -0
  705. package/src/textures/rebuildRoofAtlas.js +55 -0
  706. package/src/textures/removeImageState.js +9 -0
  707. package/src/textures/resizeRoofTexture.js +25 -0
  708. package/src/textures/restoreMaterialTextures.js +16 -0
  709. package/src/{rendering → textures}/textureBinding.js +7 -7
  710. package/src/textures/updateRoofAtlas.js +23 -0
  711. package/src/textures/updateRoofRaster.js +29 -0
  712. package/src/{core → textures}/uploadCanvasTexture.js +20 -17
  713. package/src/textures/uploadMeshTexture.js +26 -0
  714. package/src/textures/uploadNativeImage.js +13 -0
  715. package/src/textures/uploadRoofTile.js +23 -0
  716. package/src/traffic/addTraffic.js +6 -3
  717. package/src/traffic/destroyTrafficGpu.js +4 -2
  718. package/src/traffic/disposeTrafficObject.js +7 -2
  719. package/src/traffic/drawTrafficRoute.js +6 -3
  720. package/src/traffic/failTraffic.js +2 -2
  721. package/src/traffic/featuresToTrafficLanes.js +24 -0
  722. package/src/traffic/fetchTrafficLanes.js +4 -4
  723. package/src/traffic/groundTraffic.js +7 -3
  724. package/src/traffic/initTraffic.js +60 -48
  725. package/src/traffic/loadTraffic.js +9 -9
  726. package/src/traffic/loadedTrafficLanes.js +1 -1
  727. package/src/traffic/locateTraffic.js +8 -6
  728. package/src/traffic/moveTraffic.js +2 -2
  729. package/src/traffic/placeTraffic.js +2 -1
  730. package/src/traffic/prepareTraffic.js +12 -6
  731. package/src/traffic/rebaseTraffic.js +33 -30
  732. package/src/traffic/rebuildTrafficMesh.js +10 -6
  733. package/src/traffic/refreshTrafficTrips.js +32 -0
  734. package/src/traffic/removeTraffic.js +16 -13
  735. package/src/traffic/routeColor.js +3 -3
  736. package/src/traffic/scheduledTrips.js +22 -11
  737. package/src/traffic/startTraffic.js +1 -1
  738. package/src/traffic/tickTraffic.js +11 -41
  739. package/src/traffic/trafficBounds.js +6 -2
  740. package/src/traffic/trafficNow.js +10 -3
  741. package/src/traffic/trafficStatusText.js +5 -0
  742. package/src/traffic/trafficStorage.js +2 -2
  743. package/src/traffic/trafficTooltip.js +9 -0
  744. package/src/traffic/tripsAt.js +4 -4
  745. package/src/traffic/updateTraffic.js +5 -1
  746. package/src/traffic/updateTrafficLights.js +18 -0
  747. package/src/traffic/updateTrafficPose.js +8 -0
  748. package/src/traffic/uploadTrafficLanes.js +21 -0
  749. package/src/traffic/vehicleOffsets.js +3 -2
  750. package/src/transforms/composeLocalTransform.js +16 -0
  751. package/src/{models/nodeMatrix.js → transforms/modelNodeMatrix.js} +8 -3
  752. package/src/transforms/transformNativePoint.js +7 -0
  753. package/src/transforms/updateWorldMatrix.js +43 -0
  754. package/src/transforms/worldMatrixChanged.js +18 -0
  755. package/src/triangulation/clean.js +1 -1
  756. package/src/triangulation/clipEars.js +23 -0
  757. package/src/triangulation/connectHole.js +18 -0
  758. package/src/triangulation/mergeHoles.js +11 -0
  759. package/src/triangulation/minimumX.js +3 -3
  760. package/src/triangulation/polygonRings.js +14 -0
  761. package/src/triangulation/sortHoles.js +7 -12
  762. package/src/triangulation/triangulate.js +18 -56
  763. package/src/triangulation/validateArea.js +10 -0
  764. package/src/vehicles/bicycleModel.js +21 -20
  765. package/src/vehicles/boatBenches.js +4 -3
  766. package/src/vehicles/boatModel.js +26 -18
  767. package/src/vehicles/buildCarriage.js +20 -0
  768. package/src/vehicles/busModel.js +1 -1
  769. package/src/vehicles/carModel.js +27 -11
  770. package/src/vehicles/metroModel.js +2 -2
  771. package/src/vehicles/mirrorVehiclePart.js +8 -0
  772. package/src/vehicles/pedestrianModel.js +15 -14
  773. package/src/vehicles/tramModel.js +2 -2
  774. package/src/walk/animateWalker.js +52 -0
  775. package/src/walk/createWalk.js +70 -60
  776. package/src/walk/initWalk.js +5 -4
  777. package/src/walk/{initialize.js → initializeWalkControl.js} +1 -0
  778. package/src/walk/{blocked.js → isWalkBlocked.js} +4 -4
  779. package/src/walk/landWalker.js +38 -0
  780. package/src/walk/moveWalker.js +24 -0
  781. package/src/walk/onAddWalkControl.js +31 -0
  782. package/src/walk/onRemoveWalkControl.js +12 -0
  783. package/src/walk/{onKey.js → onWalkKey.js} +13 -10
  784. package/src/walk/onWalkPointer.js +18 -0
  785. package/src/walk/{onTerrain.js → onWalkTerrain.js} +1 -1
  786. package/src/walk/{place.js → placeWalker.js} +6 -4
  787. package/src/walk/resolveWalkerPosition.js +28 -0
  788. package/src/walk/startWalking.js +49 -0
  789. package/src/walk/stepWalkerHeight.js +11 -0
  790. package/src/walk/{stop.js → stopWalking.js} +11 -8
  791. package/src/walk/{toggle.js → toggleWalking.js} +2 -2
  792. package/src/walk/updateWalkerView.js +22 -0
  793. package/src/weakmaps/addedByLayer.js +1 -0
  794. package/src/weakmaps/archiveHeaderByLayer.js +1 -0
  795. package/src/weakmaps/areasByLayer.js +1 -0
  796. package/src/weakmaps/boundsMethods.js +1 -0
  797. package/src/weakmaps/bridgeMeshByLayer.js +1 -0
  798. package/src/weakmaps/bridgesByLayer.js +1 -0
  799. package/src/weakmaps/cameraAnimationByMap.js +1 -0
  800. package/src/weakmaps/cameraBearingByMap.js +1 -0
  801. package/src/weakmaps/cameraByLayer.js +1 -0
  802. package/src/weakmaps/cameraDraggableByMap.js +1 -0
  803. package/src/weakmaps/cameraFields.js +37 -0
  804. package/src/weakmaps/cameraFrameByMap.js +1 -0
  805. package/src/weakmaps/cameraHandlersByMap.js +1 -0
  806. package/src/weakmaps/cameraMaps.js +1 -0
  807. package/src/weakmaps/cameraPitchByMap.js +1 -0
  808. package/src/weakmaps/cameraReadyByMap.js +1 -0
  809. package/src/weakmaps/cameraTouchStateByMap.js +1 -0
  810. package/src/weakmaps/cameraViewByMap.js +1 -0
  811. package/src/weakmaps/cameraZIndexOffsetByLayer.js +1 -0
  812. package/src/weakmaps/closestMethods.js +1 -0
  813. package/src/{constants → weakmaps}/colliders.js +0 -1
  814. package/src/weakmaps/containerByLayer.js +1 -0
  815. package/src/weakmaps/controlByLayer.js +1 -0
  816. package/src/weakmaps/countStatusByLayer.js +1 -0
  817. package/src/weakmaps/cursorByLayer.js +1 -0
  818. package/src/weakmaps/demByLayer.js +1 -0
  819. package/src/weakmaps/directoriesByLayer.js +1 -0
  820. package/src/weakmaps/dragByHandler.js +1 -0
  821. package/src/weakmaps/dragStates.js +1 -0
  822. package/src/weakmaps/etagByLayer.js +1 -0
  823. package/src/weakmaps/eventMapByLayer.js +1 -0
  824. package/src/weakmaps/eventsByLayer.js +1 -0
  825. package/src/weakmaps/fadeFrameByLayer.js +1 -0
  826. package/src/weakmaps/fadeVersionByLayer.js +1 -0
  827. package/src/weakmaps/frameByLayer.js +1 -0
  828. package/src/weakmaps/geojsonByLayer.js +1 -0
  829. package/src/weakmaps/geometryWorkersByMap.js +1 -0
  830. package/src/weakmaps/gridInitializers.js +1 -0
  831. package/src/weakmaps/groupByLayer.js +1 -0
  832. package/src/weakmaps/headerByLayer.js +1 -0
  833. package/src/weakmaps/highlightedFeatureByLayer.js +1 -0
  834. package/src/weakmaps/hoveredFeatureByLayer.js +1 -0
  835. package/src/weakmaps/imageStates.js +1 -0
  836. package/src/weakmaps/inflightByLayer.js +1 -0
  837. package/src/weakmaps/kindByLayer.js +1 -0
  838. package/src/weakmaps/layersByLayer.js +1 -0
  839. package/src/weakmaps/loadingTilesByLayer.js +1 -0
  840. package/src/weakmaps/locationByLayer.js +1 -0
  841. package/src/weakmaps/modelByLayer.js +1 -0
  842. package/src/weakmaps/modelUrlByLayer.js +1 -0
  843. package/src/weakmaps/nativeGPUBackByMap.js +1 -0
  844. package/src/weakmaps/nativeGPUByLayer.js +1 -0
  845. package/src/weakmaps/nativeGPUOrderByMap.js +1 -0
  846. package/src/weakmaps/nativeRenderByLayer.js +1 -0
  847. package/src/weakmaps/pitchSkyByMap.js +1 -0
  848. package/src/weakmaps/pointerEventsByLayer.js +1 -0
  849. package/src/weakmaps/pruneAfterByLayer.js +1 -0
  850. package/src/weakmaps/pruneVersionByLayer.js +1 -0
  851. package/src/weakmaps/pruneWantedByLayer.js +1 -0
  852. package/src/weakmaps/queuedByLayer.js +1 -0
  853. package/src/weakmaps/rasterGeometryByLayer.js +1 -0
  854. package/src/weakmaps/rasterProgramByLayer.js +1 -0
  855. package/src/weakmaps/rasterTilesByLayer.js +1 -0
  856. package/src/weakmaps/rasterVersionByLayer.js +1 -0
  857. package/src/weakmaps/raycasterByLayer.js +1 -0
  858. package/src/weakmaps/readyByLayer.js +1 -0
  859. package/src/weakmaps/rendererByLayer.js +1 -0
  860. package/src/weakmaps/rendererDevices.js +1 -0
  861. package/src/weakmaps/rendererReadyByLayer.js +1 -0
  862. package/src/weakmaps/roofRasterByLayer.js +1 -0
  863. package/src/weakmaps/roofRastersByLayer.js +1 -0
  864. package/src/weakmaps/rootByLayer.js +1 -0
  865. package/src/weakmaps/rotateControlByMap.js +1 -0
  866. package/src/weakmaps/sceneByLayer.js +1 -0
  867. package/src/weakmaps/sceneFields.js +159 -0
  868. package/src/weakmaps/sceneLayers.js +1 -0
  869. package/src/weakmaps/sceneOriginByLayer.js +1 -0
  870. package/src/weakmaps/shadowMeshesByLayer.js +1 -0
  871. package/src/weakmaps/sharedByLayer.js +1 -0
  872. package/src/weakmaps/sizeByLayer.js +1 -0
  873. package/src/weakmaps/state3dByLayer.js +1 -0
  874. package/src/weakmaps/sunByMap.js +1 -0
  875. package/src/weakmaps/sunlightByControl.js +1 -0
  876. package/src/weakmaps/sunlightByMap.js +1 -0
  877. package/src/weakmaps/terrain3DByLayer.js +1 -0
  878. package/src/weakmaps/terrain3DByMap.js +1 -0
  879. package/src/weakmaps/terrainArchiveByLayer.js +1 -0
  880. package/src/weakmaps/terrainBaseYByLayer.js +1 -0
  881. package/src/weakmaps/terrainBoundsByLayer.js +1 -0
  882. package/src/weakmaps/terrainControllerByLayer.js +1 -0
  883. package/src/weakmaps/terrainGridsByLayer.js +1 -0
  884. package/src/weakmaps/terrainLoadingByLayer.js +1 -0
  885. package/src/weakmaps/terrainOriginElevationByLayer.js +1 -0
  886. package/src/weakmaps/terrainPromiseByLayer.js +1 -0
  887. package/src/weakmaps/terrainReadyByLayer.js +1 -0
  888. package/src/weakmaps/terrainRequestByLayer.js +1 -0
  889. package/src/weakmaps/terrainSourceByLayer.js +1 -0
  890. package/src/weakmaps/terrainTilesByLayer.js +1 -0
  891. package/src/weakmaps/terrainZoomByLayer.js +1 -0
  892. package/src/weakmaps/tileZoomByLayer.js +1 -0
  893. package/src/weakmaps/timeControlByMap.js +1 -0
  894. package/src/weakmaps/tooltipByLayer.js +1 -0
  895. package/src/weakmaps/touchByContainer.js +1 -0
  896. package/src/weakmaps/touchPitchByMap.js +1 -0
  897. package/src/weakmaps/touchRotateByMap.js +1 -0
  898. package/src/weakmaps/trafficByLayer.js +1 -0
  899. package/src/weakmaps/typeByLayer.js +1 -0
  900. package/src/weakmaps/urlByLayer.js +1 -0
  901. package/src/weakmaps/visibleMeshesByLayer.js +1 -0
  902. package/src/weakmaps/walkByMap.js +1 -0
  903. package/src/weakmaps/walkerByLayer.js +1 -0
  904. package/src/weakmaps/wantedRasterTilesByLayer.js +1 -0
  905. package/src/weakmaps/zoomLevelByLayer.js +1 -0
  906. package/src/weakmaps/zoomTransitionsByLayer.js +1 -0
  907. package/src/weakmaps/zoomViewByLayer.js +1 -0
  908. package/src/workers/acquireGeometryWorker.js +32 -0
  909. package/src/workers/buildAreaInWorker.js +36 -0
  910. package/src/workers/closeGeometryWorkers.js +11 -0
  911. package/src/workers/geometryWorker.js +14 -0
  912. package/src/workers/settleGeometryWorker.js +10 -0
  913. package/src/workers/startGeometryWorker.js +16 -0
  914. package/src/archives/read.js +0 -29
  915. package/src/archives/varint.js +0 -15
  916. package/src/camera/angles.js +0 -6
  917. package/src/camera/cancelCameraAnimation.js +0 -11
  918. package/src/camera/groundBounds.js +0 -11
  919. package/src/camera/mapAnimateCamera.js +0 -17
  920. package/src/camera/mapStopPitchBearingAnimation.js +0 -6
  921. package/src/camera/pointOf.js +0 -3
  922. package/src/camera/project.js +0 -20
  923. package/src/camera/runCameraAnimations.js +0 -28
  924. package/src/camera/scheduleCameraAnimation.js +0 -8
  925. package/src/constants/Compass.js +0 -7
  926. package/src/constants/ContainerResize.js +0 -7
  927. package/src/constants/PitchDrag.js +0 -7
  928. package/src/constants/ShiftRotate.js +0 -7
  929. package/src/constants/TouchMode.js +0 -6
  930. package/src/constants/accessorSizes.js +0 -1
  931. package/src/constants/attachState.js +0 -1
  932. package/src/constants/cameraControlsState.js +0 -1
  933. package/src/constants/cityMapper.js +0 -6
  934. package/src/constants/hull.js +0 -1
  935. package/src/constants/indexState.js +0 -1
  936. package/src/constants/mapCameraState.js +0 -1
  937. package/src/constants/nativeLayerState.js +0 -1
  938. package/src/constants/nativeMethodHandlers.js +0 -31
  939. package/src/constants/onMapChangeState.js +0 -1
  940. package/src/constants/onZoomAnimState.js +0 -1
  941. package/src/constants/parts.js +0 -19
  942. package/src/constants/pumpState.js +0 -1
  943. package/src/constants/ringDirections.js +0 -10
  944. package/src/constants/roundProfile.js +0 -1
  945. package/src/constants/underEntryState.js +0 -1
  946. package/src/core/addImageState.js +0 -7
  947. package/src/core/boundsQuad.js +0 -11
  948. package/src/core/bringNativeLayerToBack.js +0 -3
  949. package/src/core/bringNativeLayerToFront.js +0 -3
  950. package/src/core/cancelGridFade.js +0 -10
  951. package/src/core/current.js +0 -3
  952. package/src/core/forwardNativeError.js +0 -3
  953. package/src/core/handleNativeMapEvent.js +0 -47
  954. package/src/core/localPixelForGeometry.js +0 -6
  955. package/src/core/localPosition.js +0 -6
  956. package/src/core/markerCameraIconPoint.js +0 -9
  957. package/src/core/markerQuadCorners.js +0 -31
  958. package/src/core/nativeImageError.js +0 -8
  959. package/src/core/nativeImageRefresh.js +0 -7
  960. package/src/core/nativeLayer.js +0 -97
  961. package/src/core/quadNativeMesh.js +0 -15
  962. package/src/core/readyNativeGPU.js +0 -6
  963. package/src/core/refreshNativeLayer.js +0 -29
  964. package/src/core/refreshNativeLayerContract.js +0 -3
  965. package/src/core/removeImageState.js +0 -8
  966. package/src/core/removeTargets.js +0 -8
  967. package/src/core/reorderNativeLayer.js +0 -6
  968. package/src/core/runGridFades.js +0 -14
  969. package/src/core/runMarkerPanFrame.js +0 -12
  970. package/src/core/scheduleGridFade.js +0 -9
  971. package/src/core/scheduleMarkerPan.js +0 -8
  972. package/src/core/syncVectorLayer.js +0 -26
  973. package/src/core/updateNativeLayerView.js +0 -6
  974. package/src/geometry/below.js +0 -3
  975. package/src/geometry/bridgeLocal.js +0 -4
  976. package/src/geometry/cross.js +0 -3
  977. package/src/geometry/dot.js +0 -6
  978. package/src/geometry/lampRing.js +0 -11
  979. package/src/geometry/push.js +0 -3
  980. package/src/geometry/sub.js +0 -6
  981. package/src/geometry/treeRing.js +0 -14
  982. package/src/lighting/visitCells.js +0 -15
  983. package/src/models/loadImage.js +0 -15
  984. package/src/models/materialFor.js +0 -21
  985. package/src/models/textureSampler.js +0 -10
  986. package/src/raster/createGeometry.js +0 -22
  987. package/src/raster/finishAttachment.js +0 -11
  988. package/src/raster/isLoading.js +0 -5
  989. package/src/rendering/composeRoofAtlas.js +0 -52
  990. package/src/rendering/createProgram.js +0 -92
  991. package/src/rendering/destroyTexture.js +0 -6
  992. package/src/rendering/ensureRoofBlit.js +0 -40
  993. package/src/rendering/rebuildRoofAtlas.js +0 -67
  994. package/src/rendering/reportCompilation.js +0 -17
  995. package/src/rendering/sortMeshes.js +0 -6
  996. package/src/rendering/synchronizeZoomView.js +0 -34
  997. package/src/rendering/updateMapCamera.js +0 -32
  998. package/src/rendering/updateRoofRaster.js +0 -32
  999. package/src/scene/attach.js +0 -161
  1000. package/src/scene/emptyNode.js +0 -11
  1001. package/src/scene/endZoom.js +0 -16
  1002. package/src/scene/layerLayerAdd.js +0 -21
  1003. package/src/scene/onZoomAnim.js +0 -16
  1004. package/src/scene/renderPendingZoomAnimation.js +0 -7
  1005. package/src/scene/rendererDeviceError.js +0 -10
  1006. package/src/scene/rendererDeviceLost.js +0 -11
  1007. package/src/scene/reportError.js +0 -3
  1008. package/src/scene/requestAdapter.js +0 -12
  1009. package/src/scene/requestDevice.js +0 -9
  1010. package/src/scene/update.js +0 -19
  1011. package/src/scene/updateCamera.js +0 -34
  1012. package/src/scene/updateWorldMatrix.js +0 -48
  1013. package/src/shadows/shadowBounds.js +0 -32
  1014. package/src/sources/addGeneratedTriangle.js +0 -6
  1015. package/src/sources/projectRing.js +0 -20
  1016. package/src/sources/projectedTree.js +0 -13
  1017. package/src/sources/pump.js +0 -54
  1018. package/src/sources/updateStatus.js +0 -12
  1019. package/src/sunlight/horizontalPosition.js +0 -16
  1020. package/src/sunlight/initialize.js +0 -11
  1021. package/src/sunlight/mix.js +0 -6
  1022. package/src/sunlight/moonPosition.js +0 -17
  1023. package/src/sunlight/projectCelestialBody.js +0 -13
  1024. package/src/sunlight/render.js +0 -7
  1025. package/src/sunlight/rgb.js +0 -6
  1026. package/src/sunlight/solarPosition.js +0 -17
  1027. package/src/terrain/terrainGrid.js +0 -24
  1028. package/src/traffic/routeGeometry.js +0 -31
  1029. package/src/traffic/toLanes.js +0 -16
  1030. package/src/traffic/tooltip.js +0 -11
  1031. package/src/vehicles/carriage.js +0 -19
  1032. package/src/vehicles/mirror.js +0 -8
  1033. package/src/walk/local.js +0 -10
  1034. package/src/walk/onAdd.js +0 -4
  1035. package/src/walk/onPointer.js +0 -13
  1036. package/src/walk/onRemove.js +0 -4
  1037. package/src/walk/start.js +0 -37
  1038. package/src/walk/step.js +0 -53
  1039. /package/src/{utils/channel.js → colors/hslChannel.js} +0 -0
  1040. /package/src/{utils → colors}/toSRGB.js +0 -0
  1041. /package/src/controls/{editable.js → isEditableTarget.js} +0 -0
  1042. /package/src/geometry/{nativeTriangle.js → appendNativeTriangle.js} +0 -0
  1043. /package/src/{constants → globals}/TILE_RADIUS.js +0 -0
  1044. /package/src/{constants → globals}/TILE_SIZE.js +0 -0
  1045. /package/src/{constants → globals}/dark.js +0 -0
  1046. /package/src/{constants → globals}/glass.js +0 -0
  1047. /package/src/{constants → globals}/headlight.js +0 -0
  1048. /package/src/{constants → globals}/moves.js +0 -0
  1049. /package/src/{constants → globals}/paints.js +0 -0
  1050. /package/src/{constants → globals}/pendingUpdates.js +0 -0
  1051. /package/src/{constants → globals}/shirt.js +0 -0
  1052. /package/src/{constants → globals}/skin.js +0 -0
  1053. /package/src/{constants → globals}/speed.js +0 -0
  1054. /package/src/{constants → globals}/taillight.js +0 -0
  1055. /package/src/{constants → globals}/trousers.js +0 -0
  1056. /package/src/{constants/accessorTypes.js → globals/types.js} +0 -0
  1057. /package/src/{constants → globals}/tyre.js +0 -0
  1058. /package/src/{constants → globals}/white.js +0 -0
  1059. /package/src/{scene → gpu}/showWebGPUWarning.js +0 -0
  1060. /package/src/{scene → layer-controls}/placeUnderEntry.js +0 -0
  1061. /package/src/{core → native}/compareNativeHits.js +0 -0
  1062. /package/src/{core → native}/nativeAddLatLng.js +0 -0
  1063. /package/src/{core → native}/nativeBringToBack.js +0 -0
  1064. /package/src/{core → native}/nativeBringToFront.js +0 -0
  1065. /package/src/{core → native}/nativeRedraw.js +0 -0
  1066. /package/src/{core → native}/nativeSetBounds.js +0 -0
  1067. /package/src/{core → native}/nativeSetIcon.js +0 -0
  1068. /package/src/{core → native}/nativeSetLatLng.js +0 -0
  1069. /package/src/{core → native}/nativeSetLatLngs.js +0 -0
  1070. /package/src/{core → native}/nativeSetOpacity.js +0 -0
  1071. /package/src/{core → native}/nativeSetRadius.js +0 -0
  1072. /package/src/{core → native}/nativeSetStyle.js +0 -0
  1073. /package/src/{core → native}/nativeSetUrl.js +0 -0
  1074. /package/src/{core → native}/nativeSetZIndex.js +0 -0
  1075. /package/src/{core → native}/nativeSetZIndexOffset.js +0 -0
  1076. /package/src/{core → native}/refreshNativeEvent.js +0 -0
  1077. /package/src/{core → native}/restoreNativeEvents.js +0 -0
  1078. /package/src/{camera/displayPoint.js → projections/displayContainerPoint.js} +0 -0
  1079. /package/src/{core → projections}/localPixel.js +0 -0
  1080. /package/src/{camera → projections}/verticalGroundY.js +0 -0
  1081. /package/src/sunlight/{onAdd.js → onAddTimeControl.js} +0 -0
  1082. /package/src/terrain/{sample.js → sampleTerrainTile.js} +0 -0
  1083. /package/src/walk/{onBlur.js → onWalkBlur.js} +0 -0
  1084. /package/src/{constants → weakmaps}/nativeEventMaps.js +0 -0
  1085. /package/src/{constants → weakmaps}/renderers.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
+ })();