@npm9912/v-map 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (438) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +185 -0
  3. package/dist/cjs/_commonjsHelpers-B83fTs8d.js +36 -0
  4. package/dist/cjs/app-globals-V2Kpy_OQ.js +5 -0
  5. package/dist/cjs/cesium-provider-BiFFyAl9.js +2598 -0
  6. package/dist/cjs/deck-provider-Ctq3Q8a1.js +47824 -0
  7. package/dist/cjs/geotiff-CEwvF9cG.js +47 -0
  8. package/dist/cjs/geotiff-source-RaNzzWkC.js +1522 -0
  9. package/dist/cjs/index-B1oGO1g-.js +10658 -0
  10. package/dist/cjs/index-B8LHqjyg.js +1765 -0
  11. package/dist/cjs/index-BIL4VsgP.js +310 -0
  12. package/dist/cjs/index-Blku2QY8.js +167 -0
  13. package/dist/cjs/index-CJvvX4yx.js +21 -0
  14. package/dist/cjs/index-CbVT-Con.js +699 -0
  15. package/dist/cjs/index-ISOEpMC3.js +20478 -0
  16. package/dist/cjs/index-JSwBbvGA.js +1621 -0
  17. package/dist/cjs/index.browser-DQhD8Jwl.js +6873 -0
  18. package/dist/cjs/index.cjs.js +2 -0
  19. package/dist/cjs/layer-extension-B_olS0rc.js +65 -0
  20. package/dist/cjs/leaflet-provider-DOqfs7g5.js +1815 -0
  21. package/dist/cjs/loader.cjs.js +13 -0
  22. package/dist/cjs/main-dist-7TykwFci.js +2655 -0
  23. package/dist/cjs/messages-D7h4m8Tx.js +186 -0
  24. package/dist/cjs/openlayers-provider-Dfeg6L4n.js +1604 -0
  25. package/dist/cjs/polygon-layer-B9PrN7vr.js +1300 -0
  26. package/dist/cjs/scenegraph-layer-DwNoxQdi.js +2530 -0
  27. package/dist/cjs/styleconfig-CVRqArk-.js +23 -0
  28. package/dist/cjs/v-map-builder.cjs.entry.js +3786 -0
  29. package/dist/cjs/v-map-layer-geojson_12.cjs.entry.js +40894 -0
  30. package/dist/cjs/v-map-layer-helper-iAzxAg9I.js +285 -0
  31. package/dist/cjs/v-map-layer-terrain-geotiff.cjs.entry.js +258 -0
  32. package/dist/cjs/v-map-layercontrol.cjs.entry.js +247 -0
  33. package/dist/cjs/v-map.cjs.js +25 -0
  34. package/dist/cjs/v-map.v-map-layer-osm.v-map-layergroup-BsXp3BoL.js +582 -0
  35. package/dist/cjs/v-map_3.cjs.entry.js +12 -0
  36. package/dist/collection/collection-manifest.json +30 -0
  37. package/dist/collection/components/v-map/v-map.css +3 -0
  38. package/dist/collection/components/v-map/v-map.js +467 -0
  39. package/dist/collection/components/v-map/v-map.test.js +33 -0
  40. package/dist/collection/components/v-map-builder/v-map-builder.css +1 -0
  41. package/dist/collection/components/v-map-builder/v-map-builder.js +913 -0
  42. package/dist/collection/components/v-map-builder/v-map-builder.test.js +56 -0
  43. package/dist/collection/components/v-map-layer-geojson/v-map-layer-geojson.js +862 -0
  44. package/dist/collection/components/v-map-layer-geojson/v-map-layer-geojson.test.js +42 -0
  45. package/dist/collection/components/v-map-layer-geotiff/v-map-layer-geotiff.css +4 -0
  46. package/dist/collection/components/v-map-layer-geotiff/v-map-layer-geotiff.js +500 -0
  47. package/dist/collection/components/v-map-layer-geotiff/v-map-layer-geotiff.test.js +38 -0
  48. package/dist/collection/components/v-map-layer-google/v-map-layer-google.css +1 -0
  49. package/dist/collection/components/v-map-layer-google/v-map-layer-google.js +442 -0
  50. package/dist/collection/components/v-map-layer-osm/error-api.test.js +108 -0
  51. package/dist/collection/components/v-map-layer-osm/v-map-layer-osm.css +4 -0
  52. package/dist/collection/components/v-map-layer-osm/v-map-layer-osm.js +311 -0
  53. package/dist/collection/components/v-map-layer-osm/v-map-layer-osm.test.js +36 -0
  54. package/dist/collection/components/v-map-layer-scatterplot/v-map-layer-scatterplot.css +1 -0
  55. package/dist/collection/components/v-map-layer-scatterplot/v-map-layer-scatterplot.js +305 -0
  56. package/dist/collection/components/v-map-layer-terrain/v-map-layer-terrain.css +3 -0
  57. package/dist/collection/components/v-map-layer-terrain/v-map-layer-terrain.js +548 -0
  58. package/dist/collection/components/v-map-layer-terrain/v-map-layer-terrain.test.js +36 -0
  59. package/dist/collection/components/v-map-layer-terrain-geotiff/v-map-layer-terrain-geotiff.css +3 -0
  60. package/dist/collection/components/v-map-layer-terrain-geotiff/v-map-layer-terrain-geotiff.js +735 -0
  61. package/dist/collection/components/v-map-layer-terrain-geotiff/v-map-layer-terrain-geotiff.test.js +42 -0
  62. package/dist/collection/components/v-map-layer-tile3d/v-map-layer-tile3d.css +3 -0
  63. package/dist/collection/components/v-map-layer-tile3d/v-map-layer-tile3d.js +449 -0
  64. package/dist/collection/components/v-map-layer-tile3d/v-map-layer-tile3d.test.js +50 -0
  65. package/dist/collection/components/v-map-layer-wcs/v-map-layer-wcs.css +1 -0
  66. package/dist/collection/components/v-map-layer-wcs/v-map-layer-wcs.js +448 -0
  67. package/dist/collection/components/v-map-layer-wcs/v-map-layer-wcs.test.js +39 -0
  68. package/dist/collection/components/v-map-layer-wfs/v-map-layer-wfs.css +1 -0
  69. package/dist/collection/components/v-map-layer-wfs/v-map-layer-wfs.js +489 -0
  70. package/dist/collection/components/v-map-layer-wfs/v-map-layer-wfs.test.js +43 -0
  71. package/dist/collection/components/v-map-layer-wkt/v-map-layer-wkt.css +1 -0
  72. package/dist/collection/components/v-map-layer-wkt/v-map-layer-wkt.js +811 -0
  73. package/dist/collection/components/v-map-layer-wkt/v-map-layer-wkt.test.js +34 -0
  74. package/dist/collection/components/v-map-layer-wms/v-map-layer-wms.css +1 -0
  75. package/dist/collection/components/v-map-layer-wms/v-map-layer-wms.js +453 -0
  76. package/dist/collection/components/v-map-layer-wms/v-map-layer-wms.test.js +36 -0
  77. package/dist/collection/components/v-map-layer-xyz/v-map-layer-xyz.css +1 -0
  78. package/dist/collection/components/v-map-layer-xyz/v-map-layer-xyz.js +331 -0
  79. package/dist/collection/components/v-map-layer-xyz/v-map-layer-xyz.test.js +28 -0
  80. package/dist/collection/components/v-map-layercontrol/v-map-layercontrol.css +74 -0
  81. package/dist/collection/components/v-map-layercontrol/v-map-layercontrol.js +277 -0
  82. package/dist/collection/components/v-map-layercontrol/v-map-layercontrol.test.js +134 -0
  83. package/dist/collection/components/v-map-layergroup/v-map-layergroup.css +4 -0
  84. package/dist/collection/components/v-map-layergroup/v-map-layergroup.js +212 -0
  85. package/dist/collection/components/v-map-layergroup/v-map-layergroup.test.js +39 -0
  86. package/dist/collection/components/v-map-style/v-map-style.css +38 -0
  87. package/dist/collection/components/v-map-style/v-map-style.js +492 -0
  88. package/dist/collection/components/v-map-style/v-map-style.unit.js +62 -0
  89. package/dist/collection/index.js +1 -0
  90. package/dist/collection/layer/v-map-layer-helper.js +281 -0
  91. package/dist/collection/layer/v-map-layer-helper.unit.js +234 -0
  92. package/dist/collection/lib/cesium-loader.js +58 -0
  93. package/dist/collection/lib/ensure-importmap.js +12 -0
  94. package/dist/collection/lib/ensure-importmap.unit.js +57 -0
  95. package/dist/collection/lib/versions.gen.js +6 -0
  96. package/dist/collection/lib/vstyle.js +8 -0
  97. package/dist/collection/map-provider/cesium/CesiumGeoTIFFTerrainProvider.js +285 -0
  98. package/dist/collection/map-provider/cesium/CesiumLayerGroups.js +159 -0
  99. package/dist/collection/map-provider/cesium/GeoTIFFImageryProvider.js +192 -0
  100. package/dist/collection/map-provider/cesium/GeoTIFFImageryProvider.test.js +57 -0
  101. package/dist/collection/map-provider/cesium/cesium-provider.js +1408 -0
  102. package/dist/collection/map-provider/cesium/i-layer.js +1 -0
  103. package/dist/collection/map-provider/cesium/layer-manager.js +467 -0
  104. package/dist/collection/map-provider/deck/DeckGLGeoTIFFLayer.js +483 -0
  105. package/dist/collection/map-provider/deck/DeckGLGeoTIFFTerrainLayer.js +410 -0
  106. package/dist/collection/map-provider/deck/LayerGroupWithModel.js +169 -0
  107. package/dist/collection/map-provider/deck/LayerGroups.js +192 -0
  108. package/dist/collection/map-provider/deck/LayerModel.js +1 -0
  109. package/dist/collection/map-provider/deck/RenderableGroup.js +1 -0
  110. package/dist/collection/map-provider/deck/deck-provider.js +1563 -0
  111. package/dist/collection/map-provider/geotiff/geotiff-source.js +172 -0
  112. package/dist/collection/map-provider/geotiff/utils/AABB2D.js +24 -0
  113. package/dist/collection/map-provider/geotiff/utils/BVHNode2D.js +166 -0
  114. package/dist/collection/map-provider/geotiff/utils/GeoTIFFTileProcessor.js +484 -0
  115. package/dist/collection/map-provider/geotiff/utils/Triangle.js +1 -0
  116. package/dist/collection/map-provider/geotiff/utils/Triangulation.js +321 -0
  117. package/dist/collection/map-provider/geotiff/utils/colormap-utils.js +190 -0
  118. package/dist/collection/map-provider/geotiff/utils/normalization-utils.js +122 -0
  119. package/dist/collection/map-provider/geotiff/utils/sampling-utils.js +108 -0
  120. package/dist/collection/map-provider/leaflet/GeoTIFFGridLayer.js +147 -0
  121. package/dist/collection/map-provider/leaflet/WCSGridLayer.js +124 -0
  122. package/dist/collection/map-provider/leaflet/google-map-tiles-layer.js +352 -0
  123. package/dist/collection/map-provider/leaflet/leaflet-helpers.js +94 -0
  124. package/dist/collection/map-provider/leaflet/leaflet-provider.js +1095 -0
  125. package/dist/collection/map-provider/ol/CustomGeoTiff.js +145 -0
  126. package/dist/collection/map-provider/ol/openlayers-helper.js +26 -0
  127. package/dist/collection/map-provider/ol/openlayers-provider.js +1427 -0
  128. package/dist/collection/map-provider/provider-factory.js +44 -0
  129. package/dist/collection/map-provider/provider-factory.unit.js +66 -0
  130. package/dist/collection/testing/browser-test-utils.js +49 -0
  131. package/dist/collection/testing/e2e-testing.js +122 -0
  132. package/dist/collection/testing/e2e-utils.js +70 -0
  133. package/dist/collection/testing/geotiff-test-server.js +100 -0
  134. package/dist/collection/testing/mocks/geostyler-lyrx-parser.js +12 -0
  135. package/dist/collection/testing/mocks/geostyler-mapbox-parser.js +12 -0
  136. package/dist/collection/testing/mocks/geostyler-qgis-parser.js +12 -0
  137. package/dist/collection/testing/mocks/geostyler-sld-parser.js +13 -0
  138. package/dist/collection/testing/mocks/geostyler-style.js +5 -0
  139. package/dist/collection/testing/setupTests.browser.js +1 -0
  140. package/dist/collection/testing/setupTests.stencil.js +20 -0
  141. package/dist/collection/testing/setupTests.vitest.js +59 -0
  142. package/dist/collection/testing/stencil-testing-wrapper.js +43 -0
  143. package/dist/collection/testing/styleMock.js +1 -0
  144. package/dist/collection/types/color.js +1 -0
  145. package/dist/collection/types/cssmode.js +1 -0
  146. package/dist/collection/types/flavour.js +1 -0
  147. package/dist/collection/types/layerconfig.js +1 -0
  148. package/dist/collection/types/lonlat.js +1 -0
  149. package/dist/collection/types/mapinitoptions.js +1 -0
  150. package/dist/collection/types/mapprovider.js +1 -0
  151. package/dist/collection/types/provideroptions.js +1 -0
  152. package/dist/collection/types/styleconfig.js +19 -0
  153. package/dist/collection/types/styling.js +13 -0
  154. package/dist/collection/types/styling.unit.js +37 -0
  155. package/dist/collection/types/vmaplayer.js +1 -0
  156. package/dist/collection/utils/async-mutex.js +28 -0
  157. package/dist/collection/utils/diff.js +142 -0
  158. package/dist/collection/utils/diff.unit.js +59 -0
  159. package/dist/collection/utils/dom-env.js +43 -0
  160. package/dist/collection/utils/dom-env.unit.js +92 -0
  161. package/dist/collection/utils/events.js +8 -0
  162. package/dist/collection/utils/logger.js +183 -0
  163. package/dist/collection/utils/logger.unit.js +98 -0
  164. package/dist/collection/utils/messages.js +12 -0
  165. package/dist/collection/utils/spatial-utils.js +27 -0
  166. package/dist/collection/utils/spatial-utils.unit.js +24 -0
  167. package/dist/components/_commonjsHelpers.js +1 -0
  168. package/dist/components/cesium-provider.js +1 -0
  169. package/dist/components/deck-provider.js +1 -0
  170. package/dist/components/events.js +1 -0
  171. package/dist/components/geotiff-source.js +1 -0
  172. package/dist/components/geotiff.js +4 -0
  173. package/dist/components/index.browser.js +15 -0
  174. package/dist/components/index.d.ts +35 -0
  175. package/dist/components/index.js +1 -0
  176. package/dist/components/index2.js +1 -0
  177. package/dist/components/index3.js +1 -0
  178. package/dist/components/index4.js +1 -0
  179. package/dist/components/index5.js +1 -0
  180. package/dist/components/index6.js +1 -0
  181. package/dist/components/index7.js +1 -0
  182. package/dist/components/index8.js +7 -0
  183. package/dist/components/layer-extension.js +1 -0
  184. package/dist/components/leaflet-provider.js +1 -0
  185. package/dist/components/main-dist.js +1 -0
  186. package/dist/components/messages.js +1 -0
  187. package/dist/components/openlayers-provider.js +1 -0
  188. package/dist/components/polygon-layer.js +1 -0
  189. package/dist/components/scenegraph-layer.js +1 -0
  190. package/dist/components/styleconfig.js +1 -0
  191. package/dist/components/styling.js +1 -0
  192. package/dist/components/v-map-builder.d.ts +11 -0
  193. package/dist/components/v-map-builder.js +2 -0
  194. package/dist/components/v-map-layer-geojson.d.ts +11 -0
  195. package/dist/components/v-map-layer-geojson.js +1 -0
  196. package/dist/components/v-map-layer-geojson2.js +1 -0
  197. package/dist/components/v-map-layer-geotiff.d.ts +11 -0
  198. package/dist/components/v-map-layer-geotiff.js +1 -0
  199. package/dist/components/v-map-layer-geotiff2.js +1 -0
  200. package/dist/components/v-map-layer-google.d.ts +11 -0
  201. package/dist/components/v-map-layer-google.js +1 -0
  202. package/dist/components/v-map-layer-google2.js +1 -0
  203. package/dist/components/v-map-layer-helper.js +1 -0
  204. package/dist/components/v-map-layer-osm.d.ts +11 -0
  205. package/dist/components/v-map-layer-osm.js +1 -0
  206. package/dist/components/v-map-layer-osm2.js +1 -0
  207. package/dist/components/v-map-layer-scatterplot.d.ts +11 -0
  208. package/dist/components/v-map-layer-scatterplot.js +1 -0
  209. package/dist/components/v-map-layer-scatterplot2.js +1 -0
  210. package/dist/components/v-map-layer-terrain-geotiff.d.ts +11 -0
  211. package/dist/components/v-map-layer-terrain-geotiff.js +1 -0
  212. package/dist/components/v-map-layer-terrain.d.ts +11 -0
  213. package/dist/components/v-map-layer-terrain.js +1 -0
  214. package/dist/components/v-map-layer-terrain2.js +1 -0
  215. package/dist/components/v-map-layer-tile3d.d.ts +11 -0
  216. package/dist/components/v-map-layer-tile3d.js +1 -0
  217. package/dist/components/v-map-layer-tile3d2.js +1 -0
  218. package/dist/components/v-map-layer-wcs.d.ts +11 -0
  219. package/dist/components/v-map-layer-wcs.js +1 -0
  220. package/dist/components/v-map-layer-wcs2.js +1 -0
  221. package/dist/components/v-map-layer-wfs.d.ts +11 -0
  222. package/dist/components/v-map-layer-wfs.js +1 -0
  223. package/dist/components/v-map-layer-wfs2.js +1 -0
  224. package/dist/components/v-map-layer-wkt.d.ts +11 -0
  225. package/dist/components/v-map-layer-wkt.js +1 -0
  226. package/dist/components/v-map-layer-wkt2.js +1 -0
  227. package/dist/components/v-map-layer-wms.d.ts +11 -0
  228. package/dist/components/v-map-layer-wms.js +1 -0
  229. package/dist/components/v-map-layer-wms2.js +1 -0
  230. package/dist/components/v-map-layer-xyz.d.ts +11 -0
  231. package/dist/components/v-map-layer-xyz.js +1 -0
  232. package/dist/components/v-map-layer-xyz2.js +1 -0
  233. package/dist/components/v-map-layercontrol.d.ts +11 -0
  234. package/dist/components/v-map-layercontrol.js +1 -0
  235. package/dist/components/v-map-layergroup.d.ts +11 -0
  236. package/dist/components/v-map-layergroup.js +1 -0
  237. package/dist/components/v-map-layergroup2.js +1 -0
  238. package/dist/components/v-map-style.d.ts +11 -0
  239. package/dist/components/v-map-style.js +1 -0
  240. package/dist/components/v-map-style2.js +10 -0
  241. package/dist/components/v-map.d.ts +11 -0
  242. package/dist/components/v-map.js +1 -0
  243. package/dist/components/v-map2.js +1 -0
  244. package/dist/esm/_commonjsHelpers-E-ZsRS8r.js +32 -0
  245. package/dist/esm/app-globals-DQuL1Twl.js +3 -0
  246. package/dist/esm/cesium-provider-BJfAup3w.js +2596 -0
  247. package/dist/esm/deck-provider-C7U9VDEq.js +47709 -0
  248. package/dist/esm/geotiff-BEWxTIfH.js +45 -0
  249. package/dist/esm/geotiff-source-esnDnC-u.js +1516 -0
  250. package/dist/esm/index-B1zwA4IC.js +685 -0
  251. package/dist/esm/index-BBpiaTpT.js +165 -0
  252. package/dist/esm/index-BIEmlzCf.js +1697 -0
  253. package/dist/esm/index-BUHa4Jj0.js +307 -0
  254. package/dist/esm/index-DbSdn93t.js +20461 -0
  255. package/dist/esm/index-RpJarvr_.js +10656 -0
  256. package/dist/esm/index-jN06TXUp.js +14 -0
  257. package/dist/esm/index-jzneDarq.js +1613 -0
  258. package/dist/esm/index.browser-DhQAXuA7.js +6860 -0
  259. package/dist/esm/index.js +1 -0
  260. package/dist/esm/layer-extension-CZXK5goK.js +63 -0
  261. package/dist/esm/leaflet-provider-Q41TB6ku.js +1794 -0
  262. package/dist/esm/loader.js +11 -0
  263. package/dist/esm/main-dist-CwnA7_Xn.js +2652 -0
  264. package/dist/esm/messages-CMKJzsgL.js +180 -0
  265. package/dist/esm/openlayers-provider-CMsDsQTQ.js +1602 -0
  266. package/dist/esm/polygon-layer-ByhxGhWC.js +1295 -0
  267. package/dist/esm/scenegraph-layer-09K_B6DT.js +2526 -0
  268. package/dist/esm/styleconfig-B-bAcABs.js +21 -0
  269. package/dist/esm/v-map-builder.entry.js +3784 -0
  270. package/dist/esm/v-map-layer-geojson_12.entry.js +40881 -0
  271. package/dist/esm/v-map-layer-helper-Dys44Cgo.js +283 -0
  272. package/dist/esm/v-map-layer-terrain-geotiff.entry.js +256 -0
  273. package/dist/esm/v-map-layercontrol.entry.js +245 -0
  274. package/dist/esm/v-map.js +21 -0
  275. package/dist/esm/v-map.v-map-layer-osm.v-map-layergroup-B4pFHuSf.js +572 -0
  276. package/dist/esm/v-map_3.entry.js +4 -0
  277. package/dist/index.cjs.js +1 -0
  278. package/dist/index.js +1 -0
  279. package/dist/types/cesium-augment.d.ts +5 -0
  280. package/dist/types/components/v-map/v-map.d.ts +70 -0
  281. package/dist/types/components/v-map/v-map.test.d.ts +1 -0
  282. package/dist/types/components/v-map-builder/v-map-builder.d.ts +48 -0
  283. package/dist/types/components/v-map-builder/v-map-builder.test.d.ts +1 -0
  284. package/dist/types/components/v-map-layer-geojson/v-map-layer-geojson.d.ts +129 -0
  285. package/dist/types/components/v-map-layer-geojson/v-map-layer-geojson.test.d.ts +1 -0
  286. package/dist/types/components/v-map-layer-geotiff/v-map-layer-geotiff.d.ts +74 -0
  287. package/dist/types/components/v-map-layer-geotiff/v-map-layer-geotiff.test.d.ts +1 -0
  288. package/dist/types/components/v-map-layer-google/v-map-layer-google.d.ts +78 -0
  289. package/dist/types/components/v-map-layer-osm/error-api.test.d.ts +1 -0
  290. package/dist/types/components/v-map-layer-osm/v-map-layer-osm.d.ts +50 -0
  291. package/dist/types/components/v-map-layer-osm/v-map-layer-osm.test.d.ts +1 -0
  292. package/dist/types/components/v-map-layer-scatterplot/v-map-layer-scatterplot.d.ts +54 -0
  293. package/dist/types/components/v-map-layer-terrain/v-map-layer-terrain.d.ts +74 -0
  294. package/dist/types/components/v-map-layer-terrain/v-map-layer-terrain.test.d.ts +1 -0
  295. package/dist/types/components/v-map-layer-terrain-geotiff/v-map-layer-terrain-geotiff.d.ts +117 -0
  296. package/dist/types/components/v-map-layer-terrain-geotiff/v-map-layer-terrain-geotiff.test.d.ts +1 -0
  297. package/dist/types/components/v-map-layer-tile3d/v-map-layer-tile3d.d.ts +69 -0
  298. package/dist/types/components/v-map-layer-tile3d/v-map-layer-tile3d.test.d.ts +1 -0
  299. package/dist/types/components/v-map-layer-wcs/v-map-layer-wcs.d.ts +47 -0
  300. package/dist/types/components/v-map-layer-wcs/v-map-layer-wcs.test.d.ts +1 -0
  301. package/dist/types/components/v-map-layer-wfs/v-map-layer-wfs.d.ts +59 -0
  302. package/dist/types/components/v-map-layer-wfs/v-map-layer-wfs.test.d.ts +1 -0
  303. package/dist/types/components/v-map-layer-wkt/v-map-layer-wkt.d.ts +132 -0
  304. package/dist/types/components/v-map-layer-wkt/v-map-layer-wkt.test.d.ts +1 -0
  305. package/dist/types/components/v-map-layer-wms/v-map-layer-wms.d.ts +76 -0
  306. package/dist/types/components/v-map-layer-wms/v-map-layer-wms.test.d.ts +1 -0
  307. package/dist/types/components/v-map-layer-xyz/v-map-layer-xyz.d.ts +59 -0
  308. package/dist/types/components/v-map-layer-xyz/v-map-layer-xyz.test.d.ts +1 -0
  309. package/dist/types/components/v-map-layercontrol/v-map-layercontrol.d.ts +44 -0
  310. package/dist/types/components/v-map-layercontrol/v-map-layercontrol.test.d.ts +1 -0
  311. package/dist/types/components/v-map-layergroup/v-map-layergroup.d.ts +31 -0
  312. package/dist/types/components/v-map-layergroup/v-map-layergroup.test.d.ts +1 -0
  313. package/dist/types/components/v-map-style/v-map-style.d.ts +75 -0
  314. package/dist/types/components/v-map-style/v-map-style.unit.d.ts +1 -0
  315. package/dist/types/components.d.ts +2391 -0
  316. package/dist/types/globals.d.ts +16 -0
  317. package/dist/types/index.d.ts +10 -0
  318. package/dist/types/layer/v-map-layer-helper.d.ts +45 -0
  319. package/dist/types/layer/v-map-layer-helper.unit.d.ts +1 -0
  320. package/dist/types/leaflet-augment.d.ts +15 -0
  321. package/dist/types/lib/cesium-loader.d.ts +3 -0
  322. package/dist/types/lib/ensure-importmap.d.ts +3 -0
  323. package/dist/types/lib/ensure-importmap.unit.d.ts +1 -0
  324. package/dist/types/lib/versions.gen.d.ts +5 -0
  325. package/dist/types/lib/vstyle.d.ts +44 -0
  326. package/dist/types/map-provider/cesium/CesiumGeoTIFFTerrainProvider.d.ts +92 -0
  327. package/dist/types/map-provider/cesium/CesiumLayerGroups.d.ts +64 -0
  328. package/dist/types/map-provider/cesium/GeoTIFFImageryProvider.d.ts +75 -0
  329. package/dist/types/map-provider/cesium/GeoTIFFImageryProvider.test.d.ts +1 -0
  330. package/dist/types/map-provider/cesium/cesium-provider.d.ts +87 -0
  331. package/dist/types/map-provider/cesium/i-layer.d.ts +11 -0
  332. package/dist/types/map-provider/cesium/layer-manager.d.ts +31 -0
  333. package/dist/types/map-provider/deck/DeckGLGeoTIFFLayer.d.ts +91 -0
  334. package/dist/types/map-provider/deck/DeckGLGeoTIFFTerrainLayer.d.ts +82 -0
  335. package/dist/types/map-provider/deck/LayerGroupWithModel.d.ts +55 -0
  336. package/dist/types/map-provider/deck/LayerGroups.d.ts +63 -0
  337. package/dist/types/map-provider/deck/LayerModel.d.ts +8 -0
  338. package/dist/types/map-provider/deck/RenderableGroup.d.ts +20 -0
  339. package/dist/types/map-provider/deck/deck-provider.d.ts +92 -0
  340. package/dist/types/map-provider/geotiff/geotiff-source.d.ts +30 -0
  341. package/dist/types/map-provider/geotiff/utils/AABB2D.d.ts +28 -0
  342. package/dist/types/map-provider/geotiff/utils/BVHNode2D.d.ts +36 -0
  343. package/dist/types/map-provider/geotiff/utils/GeoTIFFTileProcessor.d.ts +116 -0
  344. package/dist/types/map-provider/geotiff/utils/Triangle.d.ts +5 -0
  345. package/dist/types/map-provider/geotiff/utils/Triangulation.d.ts +94 -0
  346. package/dist/types/map-provider/geotiff/utils/colormap-utils.d.ts +47 -0
  347. package/dist/types/map-provider/geotiff/utils/normalization-utils.d.ts +39 -0
  348. package/dist/types/map-provider/geotiff/utils/sampling-utils.d.ts +13 -0
  349. package/dist/types/map-provider/leaflet/GeoTIFFGridLayer.d.ts +34 -0
  350. package/dist/types/map-provider/leaflet/WCSGridLayer.d.ts +38 -0
  351. package/dist/types/map-provider/leaflet/google-map-tiles-layer.d.ts +73 -0
  352. package/dist/types/map-provider/leaflet/leaflet-helpers.d.ts +6 -0
  353. package/dist/types/map-provider/leaflet/leaflet-provider.d.ts +73 -0
  354. package/dist/types/map-provider/ol/CustomGeoTiff.d.ts +14 -0
  355. package/dist/types/map-provider/ol/openlayers-helper.d.ts +2 -0
  356. package/dist/types/map-provider/ol/openlayers-provider.d.ts +80 -0
  357. package/dist/types/map-provider/provider-factory.d.ts +12 -0
  358. package/dist/types/map-provider/provider-factory.unit.d.ts +1 -0
  359. package/dist/types/namespaces.d.ts +3 -0
  360. package/dist/types/ol-augment.d.ts +3 -0
  361. package/dist/types/ol-override.d.ts +7 -0
  362. package/dist/types/ol.d.ts +10 -0
  363. package/dist/types/stencil-public-runtime.d.ts +1860 -0
  364. package/dist/types/testing/browser-test-utils.d.ts +6 -0
  365. package/dist/types/testing/e2e-testing.d.ts +5 -0
  366. package/dist/types/testing/e2e-utils.d.ts +4 -0
  367. package/dist/types/testing/geotiff-test-server.d.ts +5 -0
  368. package/dist/types/testing/mocks/geostyler-lyrx-parser.d.ts +11 -0
  369. package/dist/types/testing/mocks/geostyler-mapbox-parser.d.ts +11 -0
  370. package/dist/types/testing/mocks/geostyler-qgis-parser.d.ts +11 -0
  371. package/dist/types/testing/mocks/geostyler-sld-parser.d.ts +11 -0
  372. package/dist/types/testing/mocks/geostyler-style.d.ts +5 -0
  373. package/dist/types/testing/setupTests.browser.d.ts +1 -0
  374. package/dist/types/testing/setupTests.stencil.d.ts +1 -0
  375. package/dist/types/testing/setupTests.vitest.d.ts +1 -0
  376. package/dist/types/testing/stencil-testing-wrapper.d.ts +3 -0
  377. package/dist/types/types/color.d.ts +1 -0
  378. package/dist/types/types/cssmode.d.ts +1 -0
  379. package/dist/types/types/flavour.d.ts +1 -0
  380. package/dist/types/types/layerconfig.d.ts +207 -0
  381. package/dist/types/types/lonlat.d.ts +1 -0
  382. package/dist/types/types/mapinitoptions.d.ts +4 -0
  383. package/dist/types/types/mapprovider.d.ts +46 -0
  384. package/dist/types/types/provideroptions.d.ts +8 -0
  385. package/dist/types/types/styleconfig.d.ts +27 -0
  386. package/dist/types/types/styling.d.ts +24 -0
  387. package/dist/types/types/styling.unit.d.ts +1 -0
  388. package/dist/types/types/vmaplayer.d.ts +10 -0
  389. package/dist/types/utils/async-mutex.d.ts +7 -0
  390. package/dist/types/utils/diff.d.ts +64 -0
  391. package/dist/types/utils/diff.unit.d.ts +1 -0
  392. package/dist/types/utils/dom-env.d.ts +5 -0
  393. package/dist/types/utils/dom-env.unit.d.ts +1 -0
  394. package/dist/types/utils/events.d.ts +29 -0
  395. package/dist/types/utils/logger.d.ts +47 -0
  396. package/dist/types/utils/logger.unit.d.ts +1 -0
  397. package/dist/types/utils/messages.d.ts +12 -0
  398. package/dist/types/utils/spatial-utils.d.ts +6 -0
  399. package/dist/types/utils/spatial-utils.unit.d.ts +1 -0
  400. package/dist/types/versions.d.ts +7 -0
  401. package/dist/v-map/index.esm.js +0 -0
  402. package/dist/v-map/p--vVleK-M.js +1 -0
  403. package/dist/v-map/p-09d10db0.entry.js +1 -0
  404. package/dist/v-map/p-5eba6058.entry.js +10 -0
  405. package/dist/v-map/p-6b102336.entry.js +1 -0
  406. package/dist/v-map/p-B-bAcABs.js +1 -0
  407. package/dist/v-map/p-BBpiaTpT.js +1 -0
  408. package/dist/v-map/p-BdijL4Av.js +1 -0
  409. package/dist/v-map/p-Be3r33VF.js +4 -0
  410. package/dist/v-map/p-BeFu0ap4.js +1 -0
  411. package/dist/v-map/p-BxFJezdK.js +1 -0
  412. package/dist/v-map/p-CMKJzsgL.js +1 -0
  413. package/dist/v-map/p-CXfA_q8m.js +1 -0
  414. package/dist/v-map/p-CZqY0yW4.js +1 -0
  415. package/dist/v-map/p-CafTHT9i.js +1 -0
  416. package/dist/v-map/p-DCTHyf58.js +1 -0
  417. package/dist/v-map/p-DQuL1Twl.js +1 -0
  418. package/dist/v-map/p-DR9McdNX.js +1 -0
  419. package/dist/v-map/p-Dckgonw8.js +1 -0
  420. package/dist/v-map/p-DhQAXuA7.js +15 -0
  421. package/dist/v-map/p-DmICdG34.js +7 -0
  422. package/dist/v-map/p-DrOQ9V4h.js +1 -0
  423. package/dist/v-map/p-DvHXtWUg.js +1 -0
  424. package/dist/v-map/p-E-ZsRS8r.js +1 -0
  425. package/dist/v-map/p-MyTSFnEk.js +1 -0
  426. package/dist/v-map/p-RpJarvr_.js +1 -0
  427. package/dist/v-map/p-WaMDUuAz.js +1 -0
  428. package/dist/v-map/p-aa410e64.entry.js +2 -0
  429. package/dist/v-map/p-c21c93fe.entry.js +1 -0
  430. package/dist/v-map/p-jzneDarq.js +2 -0
  431. package/dist/v-map/p-uiIP-taz.js +1 -0
  432. package/dist/v-map/v-map.esm.js +1 -0
  433. package/loader/cdn.js +1 -0
  434. package/loader/index.cjs.js +1 -0
  435. package/loader/index.d.ts +24 -0
  436. package/loader/index.es2017.js +1 -0
  437. package/loader/index.js +2 -0
  438. package/package.json +193 -0
@@ -0,0 +1,1095 @@
1
+ import { watchElementResize } from "../../utils/dom-env";
2
+ import * as L from "leaflet";
3
+ import { isBrowser } from "../../utils/dom-env";
4
+ import { log, error } from "../../utils/logger";
5
+ import { DEFAULT_STYLE } from "../../types/styleconfig";
6
+ import { removeInjectedCss, ensureLeafletCss, ensureGoogleLogo, } from "./leaflet-helpers";
7
+ import { GoogleMapTilesLayer } from "./google-map-tiles-layer";
8
+ import { GeoTIFFGridLayer } from "./GeoTIFFGridLayer";
9
+ import { WCSGridLayer } from "./WCSGridLayer";
10
+ import { wellknown } from "wellknown";
11
+ import { GmlParser } from "@npm9912/s-gml";
12
+ export class LeafletProvider {
13
+ map;
14
+ layers = [];
15
+ baseLayers = [];
16
+ hiddenLayerGroups = [];
17
+ googleLogoAdded = false;
18
+ unsubscribeResize;
19
+ shadowRoot;
20
+ injectedStyle;
21
+ layerErrorCallbacks = new Map();
22
+ layerErrorCleanups = new Map();
23
+ async init(options) {
24
+ if (!isBrowser())
25
+ return;
26
+ this.shadowRoot = options.shadowRoot;
27
+ this.injectedStyle = ensureLeafletCss(options.cssMode, this.shadowRoot);
28
+ const [lon, lat] = (options?.mapInitOptions?.center ?? [0, 0]);
29
+ this.map = L.map(options.target, {
30
+ zoomControl: true,
31
+ attributionControl: true,
32
+ }).setView([lat, lon], options?.mapInitOptions?.zoom ?? 2);
33
+ this.unsubscribeResize = watchElementResize(options.target, () => {
34
+ this.map?.invalidateSize();
35
+ }, {
36
+ attributes: true,
37
+ attributeFilter: ['style', 'class'],
38
+ });
39
+ }
40
+ async updateLayer(layerId, update) {
41
+ const layer = await this._getLayerById(layerId);
42
+ switch (update.type) {
43
+ case 'geojson':
44
+ await this.updateGeoJSONLayer(layer, update.data);
45
+ break;
46
+ case 'osm':
47
+ await this.updateOSMLayer(layer, update.data);
48
+ break;
49
+ case 'arcgis':
50
+ await this.updateArcGISLayer(layer, update.data);
51
+ break;
52
+ case 'wkt':
53
+ await this.updateWKTLayer(layer, update.data);
54
+ break;
55
+ case 'geotiff':
56
+ await this.updateGeoTIFFLayer(layer, update.data);
57
+ break;
58
+ case 'wcs':
59
+ await this.updateWCSLayer(layer, update.data);
60
+ break;
61
+ case 'wfs':
62
+ if (layer instanceof L.GeoJSON) {
63
+ await this.updateWFSLayer(layer, update.data);
64
+ }
65
+ break;
66
+ }
67
+ }
68
+ // private async addStandaloneLayer(layerConfig: LayerConfig): Promise<L.Layer> {
69
+ // const layer = await this.createLayer(layerConfig);
70
+ // layer.addTo(this.map!);
71
+ // this.layers.push(layer);
72
+ // }
73
+ async addLayerToGroup(layerConfig) {
74
+ const group = await this._ensureGroup(layerConfig.groupId, layerConfig.groupVisible);
75
+ const layer = await this.createLayer(layerConfig);
76
+ if (layer == null) {
77
+ return null;
78
+ }
79
+ group.addLayer(layer);
80
+ const layerId = this.getLayerId(layer);
81
+ layer.vmapVisible = true;
82
+ layer.vmapOpacity = 1.0;
83
+ if (layerConfig.opacity !== undefined) {
84
+ this.setOpacityByLayer(layer, layerConfig.opacity);
85
+ }
86
+ if (layerConfig.zIndex !== undefined) {
87
+ layer.setZIndex?.(layerConfig.zIndex);
88
+ }
89
+ if (layerConfig.visible) {
90
+ this.setVisibleByLayer(layer, true);
91
+ }
92
+ else if (layerConfig.visible === false) {
93
+ this.setVisibleByLayer(layer, false);
94
+ }
95
+ return layerId;
96
+ }
97
+ // async addLayer(config: LayerConfig): Promise<string> {
98
+ // if (!this.map) return;
99
+ // let layer: L.Layer = null;
100
+ // if ('groupId' in config && config.groupId) {
101
+ // try {
102
+ // layer = await this.addLayerToGroup(
103
+ // config as LayerConfig & { groupId: string },
104
+ // );
105
+ // } catch (ex) {
106
+ // error('addLayer - Unerwarteter Fehler:', ex);
107
+ // return null;
108
+ // }
109
+ // } else {
110
+ // try {
111
+ // layer = await this.addStandaloneLayer(config);
112
+ // } catch (ex) {
113
+ // error('addLayer - Unerwarteter Fehler:', ex);
114
+ // return null;
115
+ // }
116
+ // }
117
+ // if (layer == null) {
118
+ // return null;
119
+ // }
120
+ // const layerId = L.Util.stamp(layer); //layer._leaflet_id;
121
+ // layer.vmapVisible = true;
122
+ // layer.vmapOpacity = 1.0;
123
+ // if (config.opacity !== undefined) {
124
+ // this.setOpacityByLayer(layer, config.opacity);
125
+ // }
126
+ // if (config.zIndex !== undefined) {
127
+ // layer.setZIndex(config.zIndex);
128
+ // }
129
+ // if (config.visible) {
130
+ // this.setVisibleByLayer(layer, true);
131
+ // } else if (config.visible === false) {
132
+ // this.setVisibleByLayer(layer, false);
133
+ // }
134
+ // return layerId;
135
+ // }
136
+ async addBaseLayer(layerConfig, basemapid, layerElementId) {
137
+ if (layerElementId === undefined || layerElementId === null) {
138
+ log('leaflet - addBaseLayer - layerElementId not set.');
139
+ return null;
140
+ }
141
+ if (basemapid === undefined || basemapid === null) {
142
+ log('leaflet - addBaseLayer - basemapid not set.');
143
+ }
144
+ const group = await this._ensureGroup(layerConfig.groupId, layerConfig.groupVisible);
145
+ group.basemap = true;
146
+ const layer = await this.createLayer(layerConfig);
147
+ // layer.group = group;
148
+ this.baseLayers.push(layer);
149
+ if (layer == null) {
150
+ return null;
151
+ }
152
+ layer.layerElementId = layerElementId;
153
+ const layerId = this.getLayerId(layer);
154
+ layer.vmapVisible = true;
155
+ layer.vmapOpacity = 1.0;
156
+ if (layerConfig.opacity !== undefined) {
157
+ this.setOpacityByLayer(layer, layerConfig.opacity);
158
+ }
159
+ if (layerConfig.zIndex !== undefined) {
160
+ layer.setZIndex?.(layerConfig.zIndex);
161
+ }
162
+ if (layerConfig.visible) {
163
+ this.setVisibleByLayer(layer, true);
164
+ }
165
+ else if (layerConfig.visible === false) {
166
+ this.setVisibleByLayer(layer, false);
167
+ }
168
+ if (basemapid === layerElementId) {
169
+ const prev_layer = group.getLayers()[0];
170
+ if (prev_layer) {
171
+ this.map.removeLayer(prev_layer);
172
+ group.clearLayers();
173
+ }
174
+ group.addLayer(layer);
175
+ if (group.visible) {
176
+ layer.addTo(this.map);
177
+ }
178
+ //group.layerId = layerId;
179
+ }
180
+ return layerId;
181
+ }
182
+ async setBaseLayer(groupId, layerElementId) {
183
+ if (layerElementId === null) {
184
+ log('leaflet - setBaseLayer - layerElementId is null.');
185
+ return;
186
+ }
187
+ const group = this.layers.find(l => l._groupId === groupId);
188
+ const layer = this.baseLayers.find(l => l.layerElementId === layerElementId);
189
+ if (layer === undefined) {
190
+ log('leaflet - setBaseLayer - layer not found. layerElementId: ' +
191
+ layerElementId);
192
+ return;
193
+ }
194
+ if (!group) {
195
+ return;
196
+ }
197
+ const prev_layer = group.getLayers()[0];
198
+ if (prev_layer) {
199
+ this.map.removeLayer(prev_layer);
200
+ group.clearLayers();
201
+ }
202
+ group.addLayer(layer);
203
+ ////layer.addTo(this.map!);
204
+ //group.layerId = layerId;
205
+ //group.set('layerId', layerId, false);
206
+ }
207
+ getLayerId(layer) {
208
+ return String(L.Util.stamp(layer));
209
+ }
210
+ normalizeAttribution(attribution) {
211
+ if (Array.isArray(attribution)) {
212
+ return attribution.join(', ');
213
+ }
214
+ return attribution;
215
+ }
216
+ async _getLayerById(layerId) {
217
+ let layerFound = null;
218
+ this.map?.eachLayer(layer => {
219
+ if (this.getLayerId(layer) === layerId) {
220
+ layerFound = layer;
221
+ }
222
+ });
223
+ if (layerFound)
224
+ return layerFound;
225
+ layerFound =
226
+ this.baseLayers.find(l => this.getLayerId(l) === layerId) ?? null;
227
+ if (layerFound === undefined)
228
+ return null;
229
+ return layerFound;
230
+ }
231
+ async createLayer(layerConfig) {
232
+ switch (layerConfig.type) {
233
+ case 'geojson':
234
+ return this.createGeoJSONLayer(layerConfig);
235
+ case 'xyz':
236
+ return this.createXYZLayer(layerConfig);
237
+ case 'osm':
238
+ return this.createOSMLayer(layerConfig);
239
+ case 'wms':
240
+ return this.createWMSLayer(layerConfig);
241
+ case 'wcs':
242
+ return this.createWCSLayer(layerConfig);
243
+ case 'wfs':
244
+ return this.createWFSLayer(layerConfig);
245
+ case 'arcgis':
246
+ return this.createArcGISLayer(layerConfig);
247
+ case 'google':
248
+ return this.createGoogleLayer(layerConfig);
249
+ case 'wkt':
250
+ return this.createWKTLayer(layerConfig);
251
+ case 'geotiff':
252
+ return this.createGeoTIFFLayer(layerConfig);
253
+ default:
254
+ throw new Error(`Unsupported layer type: ${layerConfig.type}`);
255
+ }
256
+ }
257
+ async updateGeoJSONLayer(layer, data) {
258
+ if (!(layer instanceof L.GeoJSON))
259
+ return;
260
+ let geoJsonData = null;
261
+ if (data.geojson) {
262
+ geoJsonData = JSON.parse(data.geojson);
263
+ }
264
+ else if (data.url) {
265
+ const res = await fetch(data.url);
266
+ if (!res.ok)
267
+ throw new Error(`GeoJSON fetch failed: ${res.status} ${res.statusText}`);
268
+ geoJsonData = await res.json();
269
+ }
270
+ layer.clearLayers();
271
+ layer.addData(geoJsonData);
272
+ }
273
+ async createGeoJSONLayer(config) {
274
+ let data = null;
275
+ if (config.geojson) {
276
+ data = JSON.parse(config.geojson);
277
+ }
278
+ else if (config.url) {
279
+ const res = await fetch(config.url);
280
+ if (!res.ok)
281
+ throw new Error(`GeoJSON fetch failed: ${res.status} ${res.statusText}`);
282
+ data = await res.json();
283
+ }
284
+ if (data) {
285
+ // Use geostyler style if available, otherwise use provided style or default style
286
+ let layerOptions = {};
287
+ if (config.geostylerStyle) {
288
+ layerOptions = await this.createGeostylerLeafletOptions(config.geostylerStyle);
289
+ }
290
+ else {
291
+ const style = config.style
292
+ ? { ...DEFAULT_STYLE, ...config.style }
293
+ : DEFAULT_STYLE;
294
+ layerOptions = {
295
+ style: this.createLeafletStyle(style),
296
+ pointToLayer: (feature, latlng) => this.createLeafletPoint(feature, latlng, style),
297
+ onEachFeature: (feature, layer) => this.bindLeafletPopup(feature, layer, style),
298
+ };
299
+ }
300
+ const layer = L.geoJSON(data, layerOptions);
301
+ return layer;
302
+ }
303
+ return null;
304
+ }
305
+ async createXYZLayer(config) {
306
+ const layer = L.tileLayer(config.url, {
307
+ attribution: this.normalizeAttribution(config.attributions),
308
+ maxZoom: config.maxZoom ?? 19,
309
+ ...(config.options ?? {}),
310
+ });
311
+ return layer;
312
+ }
313
+ async updateOSMLayer(layer, data) {
314
+ if (!('setUrl' in layer) || typeof layer.setUrl !== 'function')
315
+ return;
316
+ let url = 'https://tile.openstreetmap.org/{z}/{x}/{y}.png';
317
+ if (data.url) {
318
+ url = data.url + '/{z}/{x}/{y}.png';
319
+ }
320
+ layer.setUrl(url);
321
+ }
322
+ async createOSMLayer(cfg) {
323
+ let url = 'https://tile.openstreetmap.org/{z}/{x}/{y}.png';
324
+ if (cfg.url) {
325
+ url = cfg.url + '/{z}/{x}/{y}.png';
326
+ }
327
+ return L.tileLayer(url, {
328
+ attribution: '© OpenStreetMap contributors',
329
+ maxZoom: 19,
330
+ });
331
+ }
332
+ async createWMSLayer(config) {
333
+ return L.tileLayer.wms(config.url, {
334
+ layers: config.layers,
335
+ format: config.format ?? 'image/png',
336
+ transparent: config.transparent ?? true,
337
+ ...(config.extraParams ?? {}),
338
+ });
339
+ }
340
+ buildArcGISUrl(url, params) {
341
+ if (!params || Object.keys(params).length === 0)
342
+ return url;
343
+ const query = new URLSearchParams();
344
+ Object.entries(params).forEach(([key, value]) => {
345
+ if (value !== undefined && value !== null) {
346
+ query.set(key, String(value));
347
+ }
348
+ });
349
+ if (query.toString().length === 0)
350
+ return url;
351
+ return `${url}${url.includes('?') ? '&' : '?'}${query.toString()}`;
352
+ }
353
+ async createArcGISLayer(config) {
354
+ const params = {
355
+ ...(config.params ?? {}),
356
+ };
357
+ if (config.token) {
358
+ params.token = config.token;
359
+ }
360
+ const arcgisUrl = this.buildArcGISUrl(config.url, params);
361
+ const options = {
362
+ attribution: this.normalizeAttribution(config.attributions),
363
+ minZoom: config.minZoom,
364
+ maxZoom: config.maxZoom,
365
+ ...(config.options ?? {}),
366
+ };
367
+ return L.tileLayer(arcgisUrl, options);
368
+ }
369
+ async updateArcGISLayer(layer, data) {
370
+ const params = {
371
+ ...(data?.params ?? {}),
372
+ };
373
+ if (data?.token) {
374
+ params.token = data.token;
375
+ }
376
+ const tileLayer = layer;
377
+ const targetUrl = data?.url ?? tileLayer.options?.url ?? '';
378
+ const nextUrl = this.buildArcGISUrl(targetUrl, params);
379
+ if ('setUrl' in tileLayer && typeof tileLayer.setUrl === 'function') {
380
+ tileLayer.setUrl(nextUrl);
381
+ }
382
+ }
383
+ async createGoogleLayer(config) {
384
+ if (!this.map)
385
+ throw new Error('Map not initialized');
386
+ if (!config.apiKey)
387
+ throw new Error("Google-Layer benötigt 'apiKey' (Google Maps Platform).");
388
+ const parsedStyles = typeof config.styles === 'string'
389
+ ? this.tryParseStyles(config.styles)
390
+ : config.styles;
391
+ const googleLayer = new GoogleMapTilesLayer({
392
+ apiKey: config.apiKey,
393
+ mapType: config.mapType ?? 'roadmap',
394
+ language: config.language,
395
+ region: config.region,
396
+ scale: config.scale,
397
+ highDpi: config.highDpi,
398
+ layerTypes: config.layerTypes,
399
+ overlay: config.overlay,
400
+ styles: Array.isArray(parsedStyles) ? parsedStyles : undefined,
401
+ imageFormat: config.imageFormat,
402
+ apiOptions: config.apiOptions,
403
+ maxZoom: config.maxZoom ?? 22,
404
+ });
405
+ ensureGoogleLogo(this.map, () => {
406
+ this.googleLogoAdded = true;
407
+ log('v-map - provider - leaflet - googleLogoAdded: ', this.googleLogoAdded);
408
+ });
409
+ return googleLayer;
410
+ }
411
+ tryParseStyles(value) {
412
+ try {
413
+ const parsed = JSON.parse(value);
414
+ return Array.isArray(parsed) ? parsed : undefined;
415
+ }
416
+ catch {
417
+ error('Failed to parse Google styles JSON');
418
+ return undefined;
419
+ }
420
+ }
421
+ async destroy() {
422
+ this.unsubscribeResize?.();
423
+ removeInjectedCss(this.shadowRoot, this.injectedStyle);
424
+ for (const l of this.layers) {
425
+ this.map?.removeLayer(l);
426
+ }
427
+ this.layers = [];
428
+ this.map?.remove();
429
+ this.map = undefined;
430
+ }
431
+ async setView([lon, lat], zoom) {
432
+ this.map?.setView([lat, lon], zoom, { animate: false });
433
+ }
434
+ onLayerError(layerId, callback) {
435
+ this.layerErrorCallbacks.set(layerId, callback);
436
+ this._getLayerById(layerId).then(layer => {
437
+ if (!layer)
438
+ return;
439
+ const handler = () => { callback({ type: 'network', message: 'Tile load error' }); };
440
+ layer.on('tileerror', handler);
441
+ this.layerErrorCleanups.set(layerId, () => layer.off('tileerror', handler));
442
+ });
443
+ }
444
+ offLayerError(layerId) {
445
+ this.layerErrorCleanups.get(layerId)?.();
446
+ this.layerErrorCleanups.delete(layerId);
447
+ this.layerErrorCallbacks.delete(layerId);
448
+ }
449
+ async removeLayer(layerId) {
450
+ if (!layerId) {
451
+ return;
452
+ }
453
+ this.offLayerError(layerId);
454
+ const layer = await this._getLayerById(layerId);
455
+ if (layer) {
456
+ this.map.removeLayer(layer);
457
+ }
458
+ }
459
+ async setZIndex(layerId, zIndex) {
460
+ if (!layerId) {
461
+ return;
462
+ }
463
+ const layer = await this._getLayerById(layerId);
464
+ if (layer) {
465
+ if (typeof layer.setZIndex === 'function') {
466
+ layer.setZIndex(zIndex);
467
+ } //todo
468
+ }
469
+ }
470
+ async setOpacity(layerId, opacity) {
471
+ if (!layerId)
472
+ return;
473
+ const layer = await this._getLayerById(layerId);
474
+ this.setOpacityByLayer(layer, opacity);
475
+ }
476
+ setOpacityByLayer(layer, opacity) {
477
+ if (!layer)
478
+ return;
479
+ // 1. Speichere die Ziel-Opazität (auch wenn Layer unsichtbar)
480
+ layer.vmapOpacity = opacity;
481
+ if (layer.vmapVisible === undefined) {
482
+ layer.vmapVisible = true;
483
+ }
484
+ // 2. Wende sie nur an, wenn der Layer sichtbar IST ODER GEMACHT WIRD
485
+ // (vermeidet unnötige setOpacity-Aufrufe, wenn vmapVisible=false)
486
+ if (layer.vmapVisible !== false) {
487
+ this.setLayerOpacity(layer, opacity);
488
+ }
489
+ }
490
+ async setVisible(layerId, visible) {
491
+ if (!layerId)
492
+ return;
493
+ const layer = await this._getLayerById(layerId);
494
+ this.setVisibleByLayer(layer, visible);
495
+ }
496
+ setVisibleByLayer(layer, visible) {
497
+ if (!layer)
498
+ return;
499
+ // 1. Aktualisiere den Sichtbarkeitszustand
500
+ layer.vmapVisible = visible;
501
+ if (layer.vmapOpacity === undefined) {
502
+ layer.vmapOpacity = 1.0;
503
+ }
504
+ // 2. Setze die Opazität basierend auf dem neuen Zustand:
505
+ const targetOpacity = visible ? layer.vmapOpacity : 0.0;
506
+ this.setLayerOpacity(layer, targetOpacity);
507
+ }
508
+ setLayerOpacity(layer, options) {
509
+ if (!layer)
510
+ return;
511
+ const opacity = typeof options === 'number' ? options : options.opacity ?? 1;
512
+ const fillOpacity = typeof options === 'number' ? options : options.fillOpacity ?? opacity;
513
+ const hasLeafletClass = (candidate, className) => {
514
+ if (!(className in L))
515
+ return false;
516
+ const ctor = L[className];
517
+ return (typeof ctor === 'function' &&
518
+ candidate instanceof ctor);
519
+ };
520
+ const isLayerCollection = (candidate) => hasLeafletClass(candidate, 'GeoJSON') ||
521
+ hasLeafletClass(candidate, 'LayerGroup');
522
+ const isPathLayer = (candidate) => hasLeafletClass(candidate, 'Path');
523
+ const isMarkerLayer = (candidate) => hasLeafletClass(candidate, 'Marker');
524
+ if (isLayerCollection(layer)) {
525
+ layer.eachLayer(subLayer => this.setLayerOpacity(subLayer, options));
526
+ }
527
+ else if (isPathLayer(layer)) {
528
+ layer.setStyle({ opacity, fillOpacity });
529
+ }
530
+ else if (isMarkerLayer(layer)) {
531
+ layer.setOpacity(opacity);
532
+ }
533
+ else if ('setOpacity' in layer) {
534
+ layer.setOpacity(opacity);
535
+ }
536
+ }
537
+ async ensureGroup(groupId, visible, _opts) {
538
+ await this._ensureGroup(groupId, visible);
539
+ }
540
+ async _ensureGroup(groupId, visible) {
541
+ let group = await this._getLayerGroupById(groupId);
542
+ if (!group) {
543
+ group = L.layerGroup();
544
+ group._groupId = groupId;
545
+ group.visible = true;
546
+ group.addTo(this.map);
547
+ this.layers.push(group);
548
+ }
549
+ this.setGroupVisible(groupId, visible !== undefined ? visible : true);
550
+ return group;
551
+ }
552
+ async _getLayerGroupById(groupId) {
553
+ if (!this.map) {
554
+ return null;
555
+ }
556
+ let group = this.layers.find(l => l instanceof L.LayerGroup && l._groupId === groupId);
557
+ if (!group) {
558
+ group = this.hiddenLayerGroups.find(lg => lg._groupId === groupId);
559
+ if (!group)
560
+ return null;
561
+ }
562
+ return group;
563
+ }
564
+ async setGroupVisible(groupId, visible) {
565
+ const layerGroup = await this._getLayerGroupById(groupId);
566
+ if (layerGroup) {
567
+ if (layerGroup.visible === visible)
568
+ return;
569
+ if (layerGroup.visible === false) {
570
+ layerGroup.addTo(this.map);
571
+ // remove layergroup from hidden list
572
+ this.hiddenLayerGroups = this.hiddenLayerGroups.filter(lg => lg._groupId !== groupId);
573
+ layerGroup.visible = visible;
574
+ }
575
+ else if (layerGroup.visible === true) {
576
+ this.map.removeLayer(layerGroup);
577
+ // add layergroup to hidden list
578
+ layerGroup.visible = visible;
579
+ this.hiddenLayerGroups.push(layerGroup);
580
+ }
581
+ }
582
+ }
583
+ async updateWKTLayer(layer, data) {
584
+ if (!(layer instanceof L.GeoJSON))
585
+ return;
586
+ let geoJsonData = null;
587
+ if (data.wkt) {
588
+ geoJsonData = await this.wktToGeoJSON(data.wkt);
589
+ }
590
+ else if (data.url) {
591
+ try {
592
+ const response = await fetch(data.url);
593
+ if (!response.ok)
594
+ throw new Error(`Failed to fetch WKT: ${response.status}`);
595
+ const wktText = await response.text();
596
+ geoJsonData = await this.wktToGeoJSON(wktText);
597
+ }
598
+ catch (e) {
599
+ error('Failed to load WKT from URL:', e);
600
+ return;
601
+ }
602
+ }
603
+ if (geoJsonData) {
604
+ layer.clearLayers();
605
+ // Update layer options to use enhanced styling
606
+ const geoJsonLayer = layer;
607
+ geoJsonLayer.options.style = this.createLeafletStyle(data.style);
608
+ geoJsonLayer.options.pointToLayer = (feature, latlng) => this.createLeafletPoint(feature, latlng, data.style);
609
+ geoJsonLayer.options.onEachFeature = (feature, layer) => this.bindLeafletPopup(feature, layer, data.style);
610
+ geoJsonLayer.addData(geoJsonData);
611
+ }
612
+ }
613
+ async createWKTLayer(config) {
614
+ let geoJsonData = null;
615
+ const emptyCollection = { type: 'FeatureCollection', features: [] };
616
+ if (config.wkt) {
617
+ geoJsonData = await this.wktToGeoJSON(config.wkt);
618
+ }
619
+ else if (config.url) {
620
+ try {
621
+ const response = await fetch(config.url);
622
+ if (!response.ok)
623
+ throw new Error(`Failed to fetch WKT: ${response.status}`);
624
+ const wktText = await response.text();
625
+ geoJsonData = await this.wktToGeoJSON(wktText);
626
+ }
627
+ catch (e) {
628
+ error('Failed to load WKT from URL:', e);
629
+ geoJsonData = emptyCollection;
630
+ }
631
+ }
632
+ else {
633
+ geoJsonData = emptyCollection;
634
+ }
635
+ log('[Leaflet WKT] Creating layer with GeoJSON data:', geoJsonData);
636
+ log('[Leaflet WKT] Config:', config);
637
+ // Use geostyler style if available, otherwise use config style or default
638
+ let layerOptions = {};
639
+ if (config.geostylerStyle) {
640
+ layerOptions = await this.createGeostylerLeafletOptions(config.geostylerStyle);
641
+ }
642
+ else {
643
+ const style = config.style
644
+ ? { ...DEFAULT_STYLE, ...config.style }
645
+ : DEFAULT_STYLE;
646
+ layerOptions = {
647
+ style: this.createLeafletStyle(style),
648
+ pointToLayer: (feature, latlng) => this.createLeafletPoint(feature, latlng, style),
649
+ onEachFeature: (feature, layer) => this.bindLeafletPopup(feature, layer, style),
650
+ };
651
+ }
652
+ log('[Leaflet WKT] Layer options:', layerOptions);
653
+ const layer = L.geoJSON(geoJsonData, layerOptions);
654
+ log('[Leaflet WKT] Created layer:', layer);
655
+ if (typeof layer.getBounds === 'function') {
656
+ log('[Leaflet WKT] Layer bounds:', layer.getBounds());
657
+ }
658
+ return layer;
659
+ }
660
+ async wktToGeoJSON(wkt) {
661
+ try {
662
+ // Use wellknown library to parse WKT into GeoJSON (browser-compatible)
663
+ const geoJSON = wellknown.parse(wkt);
664
+ if (!geoJSON) {
665
+ throw new Error('Failed to parse WKT - returned null');
666
+ }
667
+ // Return as a Feature
668
+ const feature = {
669
+ type: 'Feature',
670
+ geometry: geoJSON,
671
+ properties: {},
672
+ };
673
+ // Debug output to browser console
674
+ log('[Leaflet WKT] Input WKT:', wkt);
675
+ log('[Leaflet WKT] Generated GeoJSON:', JSON.stringify(feature, null, 2));
676
+ const fc = {
677
+ type: 'FeatureCollection',
678
+ features: [feature],
679
+ };
680
+ return fc;
681
+ }
682
+ catch (e) {
683
+ error('[Leaflet WKT] Failed to parse WKT:', wkt, e);
684
+ // If parsing fails, return empty FeatureCollection
685
+ const empty = { type: 'FeatureCollection', features: [] };
686
+ return empty;
687
+ }
688
+ }
689
+ async createGeoTIFFLayer(config) {
690
+ if (!config.url) {
691
+ throw new Error('GeoTIFF layer requires a URL');
692
+ }
693
+ try {
694
+ const layer = new GeoTIFFGridLayer({
695
+ url: config.url,
696
+ tileSize: 256,
697
+ colorMap: config.colorMap,
698
+ valueRange: config.valueRange,
699
+ nodata: config.nodata,
700
+ resolution: config.resolution,
701
+ resampleMethod: config.resampleMethod,
702
+ viewProjection: this.map.options.crs.code,
703
+ });
704
+ if (config.opacity !== undefined) {
705
+ layer.setOpacity?.(config.opacity);
706
+ }
707
+ if (config.zIndex !== undefined) {
708
+ layer.setZIndex?.(config.zIndex);
709
+ }
710
+ return layer;
711
+ }
712
+ catch (err) {
713
+ error('Failed to create GeoTIFF layer:', err);
714
+ // Return a placeholder layer in case of error
715
+ return L.layerGroup([]);
716
+ }
717
+ }
718
+ async updateGeoTIFFLayer(layer, data) {
719
+ if (!data.url) {
720
+ throw new Error('GeoTIFF update requires a URL');
721
+ }
722
+ if (!layer)
723
+ return;
724
+ if (!(layer instanceof GeoTIFFGridLayer))
725
+ return;
726
+ const extData = data;
727
+ await layer.updateSource({
728
+ url: data.url,
729
+ colorMap: data.colorMap,
730
+ valueRange: data.valueRange,
731
+ nodata: data.nodata,
732
+ resolution: extData.resolution,
733
+ resampleMethod: extData.resampleMethod,
734
+ });
735
+ }
736
+ async createWCSLayer(config) {
737
+ if (!config.url) {
738
+ throw new Error('WCS layer requires a URL');
739
+ }
740
+ if (!config.coverageName) {
741
+ throw new Error('WCS layer requires a coverageName');
742
+ }
743
+ try {
744
+ const wcsOptions = {
745
+ url: config.url,
746
+ coverageName: config.coverageName,
747
+ version: config.version ?? '2.0.1',
748
+ format: config.format ?? 'image/tiff',
749
+ projection: config.projection ?? 'EPSG:4326',
750
+ params: config.params,
751
+ };
752
+ // Add GridLayer options
753
+ if (config.tileSize)
754
+ wcsOptions.tileSize = config.tileSize;
755
+ if (config.minZoom !== undefined)
756
+ wcsOptions.minZoom = config.minZoom;
757
+ if (config.maxZoom !== undefined)
758
+ wcsOptions.maxZoom = config.maxZoom;
759
+ const layer = new WCSGridLayer(wcsOptions);
760
+ if (config.opacity !== undefined) {
761
+ layer.setOpacity?.(config.opacity);
762
+ }
763
+ if (config.zIndex !== undefined) {
764
+ layer.setZIndex?.(config.zIndex);
765
+ }
766
+ return layer;
767
+ }
768
+ catch (err) {
769
+ error('[Leaflet WCS] Failed to create WCS layer:', err);
770
+ // Return a placeholder layer in case of error
771
+ return L.layerGroup([]);
772
+ }
773
+ }
774
+ async updateWCSLayer(layer, data) {
775
+ if (!layer)
776
+ return;
777
+ if (layer instanceof WCSGridLayer) {
778
+ const updateOptions = {};
779
+ if (data.url)
780
+ updateOptions.url = data.url;
781
+ if (data.coverageName)
782
+ updateOptions.coverageName = data.coverageName;
783
+ if (data.version)
784
+ updateOptions.version = data.version;
785
+ if (data.format)
786
+ updateOptions.format = data.format;
787
+ if (data.projection)
788
+ updateOptions.projection = data.projection;
789
+ if (data.params)
790
+ updateOptions.params = data.params;
791
+ layer.updateOptions(updateOptions);
792
+ }
793
+ }
794
+ // ========== Enhanced Styling Methods ==========
795
+ /**
796
+ * Convert a Geostyler style to Leaflet GeoJSON options
797
+ */
798
+ async createGeostylerLeafletOptions(geostylerStyle) {
799
+ // Helper to extract static value from GeoStyler property
800
+ const getValue = (prop, defaultValue = undefined) => {
801
+ if (prop === undefined || prop === null)
802
+ return defaultValue;
803
+ // If it's a GeoStyler function object, we can't evaluate it here - return default
804
+ if (typeof prop === 'object' && prop.name)
805
+ return defaultValue;
806
+ return prop;
807
+ };
808
+ const options = {
809
+ style: (feature) => {
810
+ const geometryType = feature?.geometry?.type;
811
+ let leafletStyle = {};
812
+ if (geostylerStyle.rules) {
813
+ for (const rule of geostylerStyle.rules) {
814
+ if (rule.symbolizers) {
815
+ for (const symbolizer of rule.symbolizers) {
816
+ switch (symbolizer.kind) {
817
+ case 'Fill':
818
+ if (geometryType === 'Polygon' ||
819
+ geometryType === 'MultiPolygon') {
820
+ const fillColor = getValue(symbolizer.color, 'rgba(0,100,255,0.3)');
821
+ const fillOpacity = getValue(symbolizer.opacity, 0.3);
822
+ const outlineColor = getValue(symbolizer.outlineColor, 'rgba(0,100,255,1)');
823
+ const outlineWidth = getValue(symbolizer.outlineWidth, 1);
824
+ leafletStyle = {
825
+ ...leafletStyle,
826
+ fillColor: fillColor,
827
+ fillOpacity: fillOpacity,
828
+ color: outlineColor,
829
+ weight: outlineWidth,
830
+ };
831
+ }
832
+ break;
833
+ case 'Line':
834
+ const lineColor = getValue(symbolizer.color, 'rgba(0,100,255,1)');
835
+ const lineWidth = getValue(symbolizer.width, 2);
836
+ const dashArray = symbolizer.dasharray
837
+ ? Array.isArray(symbolizer.dasharray)
838
+ ? symbolizer.dasharray
839
+ .map((v) => getValue(v, 0))
840
+ .join(',')
841
+ : undefined
842
+ : undefined;
843
+ leafletStyle = {
844
+ ...leafletStyle,
845
+ color: lineColor,
846
+ weight: lineWidth,
847
+ dashArray: dashArray,
848
+ };
849
+ break;
850
+ }
851
+ }
852
+ }
853
+ }
854
+ }
855
+ return leafletStyle;
856
+ },
857
+ pointToLayer: (_feature, latlng) => {
858
+ if (geostylerStyle.rules) {
859
+ for (const rule of geostylerStyle.rules) {
860
+ if (rule.symbolizers) {
861
+ for (const symbolizer of rule.symbolizers) {
862
+ switch (symbolizer.kind) {
863
+ case 'Mark':
864
+ const markColor = getValue(symbolizer.color, 'rgba(0,100,255,1)');
865
+ const markRadius = getValue(symbolizer.radius, 6);
866
+ const strokeColor = getValue(symbolizer.strokeColor, 'rgba(0,100,255,1)');
867
+ const strokeWidth = getValue(symbolizer.strokeWidth, 2);
868
+ return L.circleMarker(latlng, {
869
+ radius: markRadius,
870
+ fillColor: markColor,
871
+ fillOpacity: 1,
872
+ color: strokeColor,
873
+ weight: strokeWidth,
874
+ });
875
+ case 'Icon':
876
+ const iconSrc = getValue(symbolizer.image);
877
+ const iconSize = getValue(symbolizer.size, 32);
878
+ if (iconSrc && typeof iconSrc === 'string') {
879
+ const icon = L.icon({
880
+ iconUrl: iconSrc,
881
+ iconSize: [iconSize, iconSize],
882
+ iconAnchor: [iconSize / 2, iconSize],
883
+ });
884
+ return L.marker(latlng, { icon });
885
+ }
886
+ break;
887
+ }
888
+ }
889
+ }
890
+ }
891
+ }
892
+ // Default point style
893
+ return L.circleMarker(latlng, {
894
+ radius: 6,
895
+ fillColor: 'rgba(0,100,255,1)',
896
+ fillOpacity: 1,
897
+ color: 'rgba(0,100,255,1)',
898
+ weight: 2,
899
+ });
900
+ },
901
+ onEachFeature: (feature, layer) => {
902
+ if (geostylerStyle.rules) {
903
+ for (const rule of geostylerStyle.rules) {
904
+ if (rule.symbolizers) {
905
+ for (const symbolizer of rule.symbolizers) {
906
+ if (symbolizer.kind === 'Text') {
907
+ const labelProp = symbolizer.label;
908
+ if (labelProp &&
909
+ typeof labelProp === 'string' &&
910
+ feature.properties &&
911
+ feature.properties[labelProp]) {
912
+ const textContent = String(feature.properties[labelProp]);
913
+ const textColor = getValue(symbolizer.color, '#000000');
914
+ const textSize = getValue(symbolizer.size, 12);
915
+ const styledText = `<div style="color: ${textColor}; font-size: ${textSize}px; font-family: Arial, sans-serif;">${textContent}</div>`;
916
+ layer.bindTooltip(styledText, {
917
+ permanent: true,
918
+ direction: 'center',
919
+ className: 'leaflet-tooltip-custom',
920
+ });
921
+ }
922
+ }
923
+ }
924
+ }
925
+ }
926
+ }
927
+ },
928
+ };
929
+ return options;
930
+ }
931
+ createLeafletStyle(style) {
932
+ return (feature) => {
933
+ const geometryType = feature?.geometry?.type;
934
+ const fillColor = style?.fillColor ?? 'rgba(0,100,255,0.3)';
935
+ const fillOpacity = style?.fillOpacity ?? 0.3;
936
+ const strokeColor = style?.strokeColor ?? 'rgba(0,100,255,1)';
937
+ const strokeOpacity = style?.strokeOpacity ?? 1;
938
+ const strokeWidth = style?.strokeWidth ?? 2;
939
+ if (geometryType === 'Polygon' || geometryType === 'MultiPolygon') {
940
+ return {
941
+ fillColor,
942
+ fillOpacity,
943
+ color: strokeColor,
944
+ opacity: strokeOpacity,
945
+ weight: strokeWidth,
946
+ dashArray: style?.strokeDashArray
947
+ ? style.strokeDashArray.join(',')
948
+ : undefined,
949
+ };
950
+ }
951
+ if (geometryType === 'LineString' || geometryType === 'MultiLineString') {
952
+ return {
953
+ color: strokeColor,
954
+ opacity: strokeOpacity,
955
+ weight: strokeWidth,
956
+ dashArray: style?.strokeDashArray
957
+ ? style.strokeDashArray.join(',')
958
+ : undefined,
959
+ };
960
+ }
961
+ return {};
962
+ };
963
+ }
964
+ createLeafletPoint(feature, latlng, style) {
965
+ let finalStyle = { ...(style ?? {}) };
966
+ if (style?.styleFunction) {
967
+ const conditionalStyle = style.styleFunction(feature);
968
+ if (conditionalStyle) {
969
+ finalStyle = {
970
+ ...style,
971
+ ...conditionalStyle,
972
+ };
973
+ }
974
+ }
975
+ if (finalStyle?.iconUrl) {
976
+ // Create icon marker
977
+ const iconSize = finalStyle.iconSize || [32, 32];
978
+ const iconAnchor = finalStyle.iconAnchor || [
979
+ iconSize[0] / 2,
980
+ iconSize[1],
981
+ ];
982
+ const icon = L.icon({
983
+ iconUrl: finalStyle.iconUrl,
984
+ iconSize: iconSize,
985
+ iconAnchor: iconAnchor,
986
+ });
987
+ return L.marker(latlng, { icon });
988
+ }
989
+ else {
990
+ // Create circle marker
991
+ const pointColor = finalStyle?.pointColor ?? 'rgba(0,100,255,1)';
992
+ const pointOpacity = finalStyle?.pointOpacity ?? 1;
993
+ const pointRadius = finalStyle?.pointRadius ?? 6;
994
+ const strokeColor = finalStyle?.strokeColor ?? 'rgba(0,100,255,1)';
995
+ const strokeOpacity = finalStyle?.strokeOpacity ?? 1;
996
+ const strokeWidth = finalStyle?.strokeWidth ?? 2;
997
+ return L.circleMarker(latlng, {
998
+ radius: pointRadius,
999
+ fillColor: pointColor,
1000
+ fillOpacity: pointOpacity,
1001
+ color: strokeColor,
1002
+ opacity: strokeOpacity,
1003
+ weight: strokeWidth,
1004
+ });
1005
+ }
1006
+ }
1007
+ bindLeafletPopup(feature, layer, style) {
1008
+ // Text labeling via popup or tooltip - handle undefined style
1009
+ if (style?.textProperty &&
1010
+ feature.properties &&
1011
+ feature.properties[style.textProperty]) {
1012
+ const textContent = String(feature.properties[style.textProperty]);
1013
+ const textColor = style?.textColor ?? '#000000';
1014
+ const textSize = style?.textSize ?? 12;
1015
+ // Create styled text content
1016
+ const styledText = `<div style="color: ${textColor}; font-size: ${textSize}px; font-family: Arial, sans-serif;">${textContent}</div>`;
1017
+ // Bind as permanent tooltip for labels or popup for clickable info
1018
+ layer.bindTooltip(styledText, {
1019
+ permanent: true,
1020
+ direction: 'center',
1021
+ className: 'leaflet-tooltip-custom',
1022
+ });
1023
+ }
1024
+ }
1025
+ async createWFSLayer(config) {
1026
+ const geojson = await this.fetchWFSFromUrl(config);
1027
+ // Use geostyler style if available, otherwise use provided style or default style
1028
+ let layerOptions = {};
1029
+ if (config.geostylerStyle) {
1030
+ layerOptions = await this.createGeostylerLeafletOptions(config.geostylerStyle);
1031
+ }
1032
+ else {
1033
+ const style = config.style
1034
+ ? { ...DEFAULT_STYLE, ...config.style }
1035
+ : DEFAULT_STYLE;
1036
+ layerOptions = {
1037
+ style: this.createLeafletStyle(style),
1038
+ pointToLayer: (feature, latlng) => this.createLeafletPoint(feature, latlng, style),
1039
+ onEachFeature: (feature, layer) => this.bindLeafletPopup(feature, layer, style),
1040
+ };
1041
+ }
1042
+ const layer = L.geoJSON(geojson, layerOptions);
1043
+ return layer;
1044
+ }
1045
+ async updateWFSLayer(layer, data) {
1046
+ const geojson = await this.fetchWFSFromUrl(data);
1047
+ layer.clearLayers();
1048
+ layer.addData(geojson);
1049
+ }
1050
+ async fetchWFSFromUrl(config) {
1051
+ const baseParams = {
1052
+ service: 'WFS',
1053
+ request: 'GetFeature',
1054
+ version: config.version ?? '1.1.0',
1055
+ typeName: config.typeName,
1056
+ outputFormat: config.outputFormat ?? 'application/json',
1057
+ srsName: config.srsName ?? 'EPSG:4326',
1058
+ };
1059
+ const params = { ...baseParams, ...(config.params ?? {}) };
1060
+ const requestUrl = this.appendParams(config.url, params);
1061
+ const response = await fetch(requestUrl);
1062
+ if (!response.ok) {
1063
+ throw new Error(`WFS request failed (${response.status} ${response.statusText})`);
1064
+ }
1065
+ const outputFormat = (config.outputFormat ?? 'application/json').toLowerCase();
1066
+ // Handle JSON formats
1067
+ if (outputFormat.includes('json') ||
1068
+ outputFormat.includes('geojson') ||
1069
+ outputFormat === 'application/json') {
1070
+ return (await response.json());
1071
+ }
1072
+ // Handle GML formats - parse XML to GeoJSON using gml2geojson
1073
+ if (outputFormat.includes('gml') || outputFormat.includes('xml')) {
1074
+ const xml = await response.text();
1075
+ const parser = new GmlParser();
1076
+ return (await parser.parse(xml));
1077
+ }
1078
+ // Default: try to parse as JSON
1079
+ return (await response.json());
1080
+ }
1081
+ appendParams(baseUrl, params) {
1082
+ const query = new URLSearchParams();
1083
+ Object.entries(params).forEach(([key, value]) => {
1084
+ if (value !== undefined && value !== null) {
1085
+ query.set(key, String(value));
1086
+ }
1087
+ });
1088
+ if (!query.toString())
1089
+ return baseUrl;
1090
+ return `${baseUrl}${baseUrl.includes('?') ? '&' : '?'}${query.toString()}`;
1091
+ }
1092
+ getMap() {
1093
+ return this.map;
1094
+ }
1095
+ }