@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.
- package/LICENSE +21 -0
- package/README.md +185 -0
- package/dist/cjs/_commonjsHelpers-B83fTs8d.js +36 -0
- package/dist/cjs/app-globals-V2Kpy_OQ.js +5 -0
- package/dist/cjs/cesium-provider-BiFFyAl9.js +2598 -0
- package/dist/cjs/deck-provider-Ctq3Q8a1.js +47824 -0
- package/dist/cjs/geotiff-CEwvF9cG.js +47 -0
- package/dist/cjs/geotiff-source-RaNzzWkC.js +1522 -0
- package/dist/cjs/index-B1oGO1g-.js +10658 -0
- package/dist/cjs/index-B8LHqjyg.js +1765 -0
- package/dist/cjs/index-BIL4VsgP.js +310 -0
- package/dist/cjs/index-Blku2QY8.js +167 -0
- package/dist/cjs/index-CJvvX4yx.js +21 -0
- package/dist/cjs/index-CbVT-Con.js +699 -0
- package/dist/cjs/index-ISOEpMC3.js +20478 -0
- package/dist/cjs/index-JSwBbvGA.js +1621 -0
- package/dist/cjs/index.browser-DQhD8Jwl.js +6873 -0
- package/dist/cjs/index.cjs.js +2 -0
- package/dist/cjs/layer-extension-B_olS0rc.js +65 -0
- package/dist/cjs/leaflet-provider-DOqfs7g5.js +1815 -0
- package/dist/cjs/loader.cjs.js +13 -0
- package/dist/cjs/main-dist-7TykwFci.js +2655 -0
- package/dist/cjs/messages-D7h4m8Tx.js +186 -0
- package/dist/cjs/openlayers-provider-Dfeg6L4n.js +1604 -0
- package/dist/cjs/polygon-layer-B9PrN7vr.js +1300 -0
- package/dist/cjs/scenegraph-layer-DwNoxQdi.js +2530 -0
- package/dist/cjs/styleconfig-CVRqArk-.js +23 -0
- package/dist/cjs/v-map-builder.cjs.entry.js +3786 -0
- package/dist/cjs/v-map-layer-geojson_12.cjs.entry.js +40894 -0
- package/dist/cjs/v-map-layer-helper-iAzxAg9I.js +285 -0
- package/dist/cjs/v-map-layer-terrain-geotiff.cjs.entry.js +258 -0
- package/dist/cjs/v-map-layercontrol.cjs.entry.js +247 -0
- package/dist/cjs/v-map.cjs.js +25 -0
- package/dist/cjs/v-map.v-map-layer-osm.v-map-layergroup-BsXp3BoL.js +582 -0
- package/dist/cjs/v-map_3.cjs.entry.js +12 -0
- package/dist/collection/collection-manifest.json +30 -0
- package/dist/collection/components/v-map/v-map.css +3 -0
- package/dist/collection/components/v-map/v-map.js +467 -0
- package/dist/collection/components/v-map/v-map.test.js +33 -0
- package/dist/collection/components/v-map-builder/v-map-builder.css +1 -0
- package/dist/collection/components/v-map-builder/v-map-builder.js +913 -0
- package/dist/collection/components/v-map-builder/v-map-builder.test.js +56 -0
- package/dist/collection/components/v-map-layer-geojson/v-map-layer-geojson.js +862 -0
- package/dist/collection/components/v-map-layer-geojson/v-map-layer-geojson.test.js +42 -0
- package/dist/collection/components/v-map-layer-geotiff/v-map-layer-geotiff.css +4 -0
- package/dist/collection/components/v-map-layer-geotiff/v-map-layer-geotiff.js +500 -0
- package/dist/collection/components/v-map-layer-geotiff/v-map-layer-geotiff.test.js +38 -0
- package/dist/collection/components/v-map-layer-google/v-map-layer-google.css +1 -0
- package/dist/collection/components/v-map-layer-google/v-map-layer-google.js +442 -0
- package/dist/collection/components/v-map-layer-osm/error-api.test.js +108 -0
- package/dist/collection/components/v-map-layer-osm/v-map-layer-osm.css +4 -0
- package/dist/collection/components/v-map-layer-osm/v-map-layer-osm.js +311 -0
- package/dist/collection/components/v-map-layer-osm/v-map-layer-osm.test.js +36 -0
- package/dist/collection/components/v-map-layer-scatterplot/v-map-layer-scatterplot.css +1 -0
- package/dist/collection/components/v-map-layer-scatterplot/v-map-layer-scatterplot.js +305 -0
- package/dist/collection/components/v-map-layer-terrain/v-map-layer-terrain.css +3 -0
- package/dist/collection/components/v-map-layer-terrain/v-map-layer-terrain.js +548 -0
- package/dist/collection/components/v-map-layer-terrain/v-map-layer-terrain.test.js +36 -0
- package/dist/collection/components/v-map-layer-terrain-geotiff/v-map-layer-terrain-geotiff.css +3 -0
- package/dist/collection/components/v-map-layer-terrain-geotiff/v-map-layer-terrain-geotiff.js +735 -0
- package/dist/collection/components/v-map-layer-terrain-geotiff/v-map-layer-terrain-geotiff.test.js +42 -0
- package/dist/collection/components/v-map-layer-tile3d/v-map-layer-tile3d.css +3 -0
- package/dist/collection/components/v-map-layer-tile3d/v-map-layer-tile3d.js +449 -0
- package/dist/collection/components/v-map-layer-tile3d/v-map-layer-tile3d.test.js +50 -0
- package/dist/collection/components/v-map-layer-wcs/v-map-layer-wcs.css +1 -0
- package/dist/collection/components/v-map-layer-wcs/v-map-layer-wcs.js +448 -0
- package/dist/collection/components/v-map-layer-wcs/v-map-layer-wcs.test.js +39 -0
- package/dist/collection/components/v-map-layer-wfs/v-map-layer-wfs.css +1 -0
- package/dist/collection/components/v-map-layer-wfs/v-map-layer-wfs.js +489 -0
- package/dist/collection/components/v-map-layer-wfs/v-map-layer-wfs.test.js +43 -0
- package/dist/collection/components/v-map-layer-wkt/v-map-layer-wkt.css +1 -0
- package/dist/collection/components/v-map-layer-wkt/v-map-layer-wkt.js +811 -0
- package/dist/collection/components/v-map-layer-wkt/v-map-layer-wkt.test.js +34 -0
- package/dist/collection/components/v-map-layer-wms/v-map-layer-wms.css +1 -0
- package/dist/collection/components/v-map-layer-wms/v-map-layer-wms.js +453 -0
- package/dist/collection/components/v-map-layer-wms/v-map-layer-wms.test.js +36 -0
- package/dist/collection/components/v-map-layer-xyz/v-map-layer-xyz.css +1 -0
- package/dist/collection/components/v-map-layer-xyz/v-map-layer-xyz.js +331 -0
- package/dist/collection/components/v-map-layer-xyz/v-map-layer-xyz.test.js +28 -0
- package/dist/collection/components/v-map-layercontrol/v-map-layercontrol.css +74 -0
- package/dist/collection/components/v-map-layercontrol/v-map-layercontrol.js +277 -0
- package/dist/collection/components/v-map-layercontrol/v-map-layercontrol.test.js +134 -0
- package/dist/collection/components/v-map-layergroup/v-map-layergroup.css +4 -0
- package/dist/collection/components/v-map-layergroup/v-map-layergroup.js +212 -0
- package/dist/collection/components/v-map-layergroup/v-map-layergroup.test.js +39 -0
- package/dist/collection/components/v-map-style/v-map-style.css +38 -0
- package/dist/collection/components/v-map-style/v-map-style.js +492 -0
- package/dist/collection/components/v-map-style/v-map-style.unit.js +62 -0
- package/dist/collection/index.js +1 -0
- package/dist/collection/layer/v-map-layer-helper.js +281 -0
- package/dist/collection/layer/v-map-layer-helper.unit.js +234 -0
- package/dist/collection/lib/cesium-loader.js +58 -0
- package/dist/collection/lib/ensure-importmap.js +12 -0
- package/dist/collection/lib/ensure-importmap.unit.js +57 -0
- package/dist/collection/lib/versions.gen.js +6 -0
- package/dist/collection/lib/vstyle.js +8 -0
- package/dist/collection/map-provider/cesium/CesiumGeoTIFFTerrainProvider.js +285 -0
- package/dist/collection/map-provider/cesium/CesiumLayerGroups.js +159 -0
- package/dist/collection/map-provider/cesium/GeoTIFFImageryProvider.js +192 -0
- package/dist/collection/map-provider/cesium/GeoTIFFImageryProvider.test.js +57 -0
- package/dist/collection/map-provider/cesium/cesium-provider.js +1408 -0
- package/dist/collection/map-provider/cesium/i-layer.js +1 -0
- package/dist/collection/map-provider/cesium/layer-manager.js +467 -0
- package/dist/collection/map-provider/deck/DeckGLGeoTIFFLayer.js +483 -0
- package/dist/collection/map-provider/deck/DeckGLGeoTIFFTerrainLayer.js +410 -0
- package/dist/collection/map-provider/deck/LayerGroupWithModel.js +169 -0
- package/dist/collection/map-provider/deck/LayerGroups.js +192 -0
- package/dist/collection/map-provider/deck/LayerModel.js +1 -0
- package/dist/collection/map-provider/deck/RenderableGroup.js +1 -0
- package/dist/collection/map-provider/deck/deck-provider.js +1563 -0
- package/dist/collection/map-provider/geotiff/geotiff-source.js +172 -0
- package/dist/collection/map-provider/geotiff/utils/AABB2D.js +24 -0
- package/dist/collection/map-provider/geotiff/utils/BVHNode2D.js +166 -0
- package/dist/collection/map-provider/geotiff/utils/GeoTIFFTileProcessor.js +484 -0
- package/dist/collection/map-provider/geotiff/utils/Triangle.js +1 -0
- package/dist/collection/map-provider/geotiff/utils/Triangulation.js +321 -0
- package/dist/collection/map-provider/geotiff/utils/colormap-utils.js +190 -0
- package/dist/collection/map-provider/geotiff/utils/normalization-utils.js +122 -0
- package/dist/collection/map-provider/geotiff/utils/sampling-utils.js +108 -0
- package/dist/collection/map-provider/leaflet/GeoTIFFGridLayer.js +147 -0
- package/dist/collection/map-provider/leaflet/WCSGridLayer.js +124 -0
- package/dist/collection/map-provider/leaflet/google-map-tiles-layer.js +352 -0
- package/dist/collection/map-provider/leaflet/leaflet-helpers.js +94 -0
- package/dist/collection/map-provider/leaflet/leaflet-provider.js +1095 -0
- package/dist/collection/map-provider/ol/CustomGeoTiff.js +145 -0
- package/dist/collection/map-provider/ol/openlayers-helper.js +26 -0
- package/dist/collection/map-provider/ol/openlayers-provider.js +1427 -0
- package/dist/collection/map-provider/provider-factory.js +44 -0
- package/dist/collection/map-provider/provider-factory.unit.js +66 -0
- package/dist/collection/testing/browser-test-utils.js +49 -0
- package/dist/collection/testing/e2e-testing.js +122 -0
- package/dist/collection/testing/e2e-utils.js +70 -0
- package/dist/collection/testing/geotiff-test-server.js +100 -0
- package/dist/collection/testing/mocks/geostyler-lyrx-parser.js +12 -0
- package/dist/collection/testing/mocks/geostyler-mapbox-parser.js +12 -0
- package/dist/collection/testing/mocks/geostyler-qgis-parser.js +12 -0
- package/dist/collection/testing/mocks/geostyler-sld-parser.js +13 -0
- package/dist/collection/testing/mocks/geostyler-style.js +5 -0
- package/dist/collection/testing/setupTests.browser.js +1 -0
- package/dist/collection/testing/setupTests.stencil.js +20 -0
- package/dist/collection/testing/setupTests.vitest.js +59 -0
- package/dist/collection/testing/stencil-testing-wrapper.js +43 -0
- package/dist/collection/testing/styleMock.js +1 -0
- package/dist/collection/types/color.js +1 -0
- package/dist/collection/types/cssmode.js +1 -0
- package/dist/collection/types/flavour.js +1 -0
- package/dist/collection/types/layerconfig.js +1 -0
- package/dist/collection/types/lonlat.js +1 -0
- package/dist/collection/types/mapinitoptions.js +1 -0
- package/dist/collection/types/mapprovider.js +1 -0
- package/dist/collection/types/provideroptions.js +1 -0
- package/dist/collection/types/styleconfig.js +19 -0
- package/dist/collection/types/styling.js +13 -0
- package/dist/collection/types/styling.unit.js +37 -0
- package/dist/collection/types/vmaplayer.js +1 -0
- package/dist/collection/utils/async-mutex.js +28 -0
- package/dist/collection/utils/diff.js +142 -0
- package/dist/collection/utils/diff.unit.js +59 -0
- package/dist/collection/utils/dom-env.js +43 -0
- package/dist/collection/utils/dom-env.unit.js +92 -0
- package/dist/collection/utils/events.js +8 -0
- package/dist/collection/utils/logger.js +183 -0
- package/dist/collection/utils/logger.unit.js +98 -0
- package/dist/collection/utils/messages.js +12 -0
- package/dist/collection/utils/spatial-utils.js +27 -0
- package/dist/collection/utils/spatial-utils.unit.js +24 -0
- package/dist/components/_commonjsHelpers.js +1 -0
- package/dist/components/cesium-provider.js +1 -0
- package/dist/components/deck-provider.js +1 -0
- package/dist/components/events.js +1 -0
- package/dist/components/geotiff-source.js +1 -0
- package/dist/components/geotiff.js +4 -0
- package/dist/components/index.browser.js +15 -0
- package/dist/components/index.d.ts +35 -0
- package/dist/components/index.js +1 -0
- package/dist/components/index2.js +1 -0
- package/dist/components/index3.js +1 -0
- package/dist/components/index4.js +1 -0
- package/dist/components/index5.js +1 -0
- package/dist/components/index6.js +1 -0
- package/dist/components/index7.js +1 -0
- package/dist/components/index8.js +7 -0
- package/dist/components/layer-extension.js +1 -0
- package/dist/components/leaflet-provider.js +1 -0
- package/dist/components/main-dist.js +1 -0
- package/dist/components/messages.js +1 -0
- package/dist/components/openlayers-provider.js +1 -0
- package/dist/components/polygon-layer.js +1 -0
- package/dist/components/scenegraph-layer.js +1 -0
- package/dist/components/styleconfig.js +1 -0
- package/dist/components/styling.js +1 -0
- package/dist/components/v-map-builder.d.ts +11 -0
- package/dist/components/v-map-builder.js +2 -0
- package/dist/components/v-map-layer-geojson.d.ts +11 -0
- package/dist/components/v-map-layer-geojson.js +1 -0
- package/dist/components/v-map-layer-geojson2.js +1 -0
- package/dist/components/v-map-layer-geotiff.d.ts +11 -0
- package/dist/components/v-map-layer-geotiff.js +1 -0
- package/dist/components/v-map-layer-geotiff2.js +1 -0
- package/dist/components/v-map-layer-google.d.ts +11 -0
- package/dist/components/v-map-layer-google.js +1 -0
- package/dist/components/v-map-layer-google2.js +1 -0
- package/dist/components/v-map-layer-helper.js +1 -0
- package/dist/components/v-map-layer-osm.d.ts +11 -0
- package/dist/components/v-map-layer-osm.js +1 -0
- package/dist/components/v-map-layer-osm2.js +1 -0
- package/dist/components/v-map-layer-scatterplot.d.ts +11 -0
- package/dist/components/v-map-layer-scatterplot.js +1 -0
- package/dist/components/v-map-layer-scatterplot2.js +1 -0
- package/dist/components/v-map-layer-terrain-geotiff.d.ts +11 -0
- package/dist/components/v-map-layer-terrain-geotiff.js +1 -0
- package/dist/components/v-map-layer-terrain.d.ts +11 -0
- package/dist/components/v-map-layer-terrain.js +1 -0
- package/dist/components/v-map-layer-terrain2.js +1 -0
- package/dist/components/v-map-layer-tile3d.d.ts +11 -0
- package/dist/components/v-map-layer-tile3d.js +1 -0
- package/dist/components/v-map-layer-tile3d2.js +1 -0
- package/dist/components/v-map-layer-wcs.d.ts +11 -0
- package/dist/components/v-map-layer-wcs.js +1 -0
- package/dist/components/v-map-layer-wcs2.js +1 -0
- package/dist/components/v-map-layer-wfs.d.ts +11 -0
- package/dist/components/v-map-layer-wfs.js +1 -0
- package/dist/components/v-map-layer-wfs2.js +1 -0
- package/dist/components/v-map-layer-wkt.d.ts +11 -0
- package/dist/components/v-map-layer-wkt.js +1 -0
- package/dist/components/v-map-layer-wkt2.js +1 -0
- package/dist/components/v-map-layer-wms.d.ts +11 -0
- package/dist/components/v-map-layer-wms.js +1 -0
- package/dist/components/v-map-layer-wms2.js +1 -0
- package/dist/components/v-map-layer-xyz.d.ts +11 -0
- package/dist/components/v-map-layer-xyz.js +1 -0
- package/dist/components/v-map-layer-xyz2.js +1 -0
- package/dist/components/v-map-layercontrol.d.ts +11 -0
- package/dist/components/v-map-layercontrol.js +1 -0
- package/dist/components/v-map-layergroup.d.ts +11 -0
- package/dist/components/v-map-layergroup.js +1 -0
- package/dist/components/v-map-layergroup2.js +1 -0
- package/dist/components/v-map-style.d.ts +11 -0
- package/dist/components/v-map-style.js +1 -0
- package/dist/components/v-map-style2.js +10 -0
- package/dist/components/v-map.d.ts +11 -0
- package/dist/components/v-map.js +1 -0
- package/dist/components/v-map2.js +1 -0
- package/dist/esm/_commonjsHelpers-E-ZsRS8r.js +32 -0
- package/dist/esm/app-globals-DQuL1Twl.js +3 -0
- package/dist/esm/cesium-provider-BJfAup3w.js +2596 -0
- package/dist/esm/deck-provider-C7U9VDEq.js +47709 -0
- package/dist/esm/geotiff-BEWxTIfH.js +45 -0
- package/dist/esm/geotiff-source-esnDnC-u.js +1516 -0
- package/dist/esm/index-B1zwA4IC.js +685 -0
- package/dist/esm/index-BBpiaTpT.js +165 -0
- package/dist/esm/index-BIEmlzCf.js +1697 -0
- package/dist/esm/index-BUHa4Jj0.js +307 -0
- package/dist/esm/index-DbSdn93t.js +20461 -0
- package/dist/esm/index-RpJarvr_.js +10656 -0
- package/dist/esm/index-jN06TXUp.js +14 -0
- package/dist/esm/index-jzneDarq.js +1613 -0
- package/dist/esm/index.browser-DhQAXuA7.js +6860 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/layer-extension-CZXK5goK.js +63 -0
- package/dist/esm/leaflet-provider-Q41TB6ku.js +1794 -0
- package/dist/esm/loader.js +11 -0
- package/dist/esm/main-dist-CwnA7_Xn.js +2652 -0
- package/dist/esm/messages-CMKJzsgL.js +180 -0
- package/dist/esm/openlayers-provider-CMsDsQTQ.js +1602 -0
- package/dist/esm/polygon-layer-ByhxGhWC.js +1295 -0
- package/dist/esm/scenegraph-layer-09K_B6DT.js +2526 -0
- package/dist/esm/styleconfig-B-bAcABs.js +21 -0
- package/dist/esm/v-map-builder.entry.js +3784 -0
- package/dist/esm/v-map-layer-geojson_12.entry.js +40881 -0
- package/dist/esm/v-map-layer-helper-Dys44Cgo.js +283 -0
- package/dist/esm/v-map-layer-terrain-geotiff.entry.js +256 -0
- package/dist/esm/v-map-layercontrol.entry.js +245 -0
- package/dist/esm/v-map.js +21 -0
- package/dist/esm/v-map.v-map-layer-osm.v-map-layergroup-B4pFHuSf.js +572 -0
- package/dist/esm/v-map_3.entry.js +4 -0
- package/dist/index.cjs.js +1 -0
- package/dist/index.js +1 -0
- package/dist/types/cesium-augment.d.ts +5 -0
- package/dist/types/components/v-map/v-map.d.ts +70 -0
- package/dist/types/components/v-map/v-map.test.d.ts +1 -0
- package/dist/types/components/v-map-builder/v-map-builder.d.ts +48 -0
- package/dist/types/components/v-map-builder/v-map-builder.test.d.ts +1 -0
- package/dist/types/components/v-map-layer-geojson/v-map-layer-geojson.d.ts +129 -0
- package/dist/types/components/v-map-layer-geojson/v-map-layer-geojson.test.d.ts +1 -0
- package/dist/types/components/v-map-layer-geotiff/v-map-layer-geotiff.d.ts +74 -0
- package/dist/types/components/v-map-layer-geotiff/v-map-layer-geotiff.test.d.ts +1 -0
- package/dist/types/components/v-map-layer-google/v-map-layer-google.d.ts +78 -0
- package/dist/types/components/v-map-layer-osm/error-api.test.d.ts +1 -0
- package/dist/types/components/v-map-layer-osm/v-map-layer-osm.d.ts +50 -0
- package/dist/types/components/v-map-layer-osm/v-map-layer-osm.test.d.ts +1 -0
- package/dist/types/components/v-map-layer-scatterplot/v-map-layer-scatterplot.d.ts +54 -0
- package/dist/types/components/v-map-layer-terrain/v-map-layer-terrain.d.ts +74 -0
- package/dist/types/components/v-map-layer-terrain/v-map-layer-terrain.test.d.ts +1 -0
- package/dist/types/components/v-map-layer-terrain-geotiff/v-map-layer-terrain-geotiff.d.ts +117 -0
- package/dist/types/components/v-map-layer-terrain-geotiff/v-map-layer-terrain-geotiff.test.d.ts +1 -0
- package/dist/types/components/v-map-layer-tile3d/v-map-layer-tile3d.d.ts +69 -0
- package/dist/types/components/v-map-layer-tile3d/v-map-layer-tile3d.test.d.ts +1 -0
- package/dist/types/components/v-map-layer-wcs/v-map-layer-wcs.d.ts +47 -0
- package/dist/types/components/v-map-layer-wcs/v-map-layer-wcs.test.d.ts +1 -0
- package/dist/types/components/v-map-layer-wfs/v-map-layer-wfs.d.ts +59 -0
- package/dist/types/components/v-map-layer-wfs/v-map-layer-wfs.test.d.ts +1 -0
- package/dist/types/components/v-map-layer-wkt/v-map-layer-wkt.d.ts +132 -0
- package/dist/types/components/v-map-layer-wkt/v-map-layer-wkt.test.d.ts +1 -0
- package/dist/types/components/v-map-layer-wms/v-map-layer-wms.d.ts +76 -0
- package/dist/types/components/v-map-layer-wms/v-map-layer-wms.test.d.ts +1 -0
- package/dist/types/components/v-map-layer-xyz/v-map-layer-xyz.d.ts +59 -0
- package/dist/types/components/v-map-layer-xyz/v-map-layer-xyz.test.d.ts +1 -0
- package/dist/types/components/v-map-layercontrol/v-map-layercontrol.d.ts +44 -0
- package/dist/types/components/v-map-layercontrol/v-map-layercontrol.test.d.ts +1 -0
- package/dist/types/components/v-map-layergroup/v-map-layergroup.d.ts +31 -0
- package/dist/types/components/v-map-layergroup/v-map-layergroup.test.d.ts +1 -0
- package/dist/types/components/v-map-style/v-map-style.d.ts +75 -0
- package/dist/types/components/v-map-style/v-map-style.unit.d.ts +1 -0
- package/dist/types/components.d.ts +2391 -0
- package/dist/types/globals.d.ts +16 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/layer/v-map-layer-helper.d.ts +45 -0
- package/dist/types/layer/v-map-layer-helper.unit.d.ts +1 -0
- package/dist/types/leaflet-augment.d.ts +15 -0
- package/dist/types/lib/cesium-loader.d.ts +3 -0
- package/dist/types/lib/ensure-importmap.d.ts +3 -0
- package/dist/types/lib/ensure-importmap.unit.d.ts +1 -0
- package/dist/types/lib/versions.gen.d.ts +5 -0
- package/dist/types/lib/vstyle.d.ts +44 -0
- package/dist/types/map-provider/cesium/CesiumGeoTIFFTerrainProvider.d.ts +92 -0
- package/dist/types/map-provider/cesium/CesiumLayerGroups.d.ts +64 -0
- package/dist/types/map-provider/cesium/GeoTIFFImageryProvider.d.ts +75 -0
- package/dist/types/map-provider/cesium/GeoTIFFImageryProvider.test.d.ts +1 -0
- package/dist/types/map-provider/cesium/cesium-provider.d.ts +87 -0
- package/dist/types/map-provider/cesium/i-layer.d.ts +11 -0
- package/dist/types/map-provider/cesium/layer-manager.d.ts +31 -0
- package/dist/types/map-provider/deck/DeckGLGeoTIFFLayer.d.ts +91 -0
- package/dist/types/map-provider/deck/DeckGLGeoTIFFTerrainLayer.d.ts +82 -0
- package/dist/types/map-provider/deck/LayerGroupWithModel.d.ts +55 -0
- package/dist/types/map-provider/deck/LayerGroups.d.ts +63 -0
- package/dist/types/map-provider/deck/LayerModel.d.ts +8 -0
- package/dist/types/map-provider/deck/RenderableGroup.d.ts +20 -0
- package/dist/types/map-provider/deck/deck-provider.d.ts +92 -0
- package/dist/types/map-provider/geotiff/geotiff-source.d.ts +30 -0
- package/dist/types/map-provider/geotiff/utils/AABB2D.d.ts +28 -0
- package/dist/types/map-provider/geotiff/utils/BVHNode2D.d.ts +36 -0
- package/dist/types/map-provider/geotiff/utils/GeoTIFFTileProcessor.d.ts +116 -0
- package/dist/types/map-provider/geotiff/utils/Triangle.d.ts +5 -0
- package/dist/types/map-provider/geotiff/utils/Triangulation.d.ts +94 -0
- package/dist/types/map-provider/geotiff/utils/colormap-utils.d.ts +47 -0
- package/dist/types/map-provider/geotiff/utils/normalization-utils.d.ts +39 -0
- package/dist/types/map-provider/geotiff/utils/sampling-utils.d.ts +13 -0
- package/dist/types/map-provider/leaflet/GeoTIFFGridLayer.d.ts +34 -0
- package/dist/types/map-provider/leaflet/WCSGridLayer.d.ts +38 -0
- package/dist/types/map-provider/leaflet/google-map-tiles-layer.d.ts +73 -0
- package/dist/types/map-provider/leaflet/leaflet-helpers.d.ts +6 -0
- package/dist/types/map-provider/leaflet/leaflet-provider.d.ts +73 -0
- package/dist/types/map-provider/ol/CustomGeoTiff.d.ts +14 -0
- package/dist/types/map-provider/ol/openlayers-helper.d.ts +2 -0
- package/dist/types/map-provider/ol/openlayers-provider.d.ts +80 -0
- package/dist/types/map-provider/provider-factory.d.ts +12 -0
- package/dist/types/map-provider/provider-factory.unit.d.ts +1 -0
- package/dist/types/namespaces.d.ts +3 -0
- package/dist/types/ol-augment.d.ts +3 -0
- package/dist/types/ol-override.d.ts +7 -0
- package/dist/types/ol.d.ts +10 -0
- package/dist/types/stencil-public-runtime.d.ts +1860 -0
- package/dist/types/testing/browser-test-utils.d.ts +6 -0
- package/dist/types/testing/e2e-testing.d.ts +5 -0
- package/dist/types/testing/e2e-utils.d.ts +4 -0
- package/dist/types/testing/geotiff-test-server.d.ts +5 -0
- package/dist/types/testing/mocks/geostyler-lyrx-parser.d.ts +11 -0
- package/dist/types/testing/mocks/geostyler-mapbox-parser.d.ts +11 -0
- package/dist/types/testing/mocks/geostyler-qgis-parser.d.ts +11 -0
- package/dist/types/testing/mocks/geostyler-sld-parser.d.ts +11 -0
- package/dist/types/testing/mocks/geostyler-style.d.ts +5 -0
- package/dist/types/testing/setupTests.browser.d.ts +1 -0
- package/dist/types/testing/setupTests.stencil.d.ts +1 -0
- package/dist/types/testing/setupTests.vitest.d.ts +1 -0
- package/dist/types/testing/stencil-testing-wrapper.d.ts +3 -0
- package/dist/types/types/color.d.ts +1 -0
- package/dist/types/types/cssmode.d.ts +1 -0
- package/dist/types/types/flavour.d.ts +1 -0
- package/dist/types/types/layerconfig.d.ts +207 -0
- package/dist/types/types/lonlat.d.ts +1 -0
- package/dist/types/types/mapinitoptions.d.ts +4 -0
- package/dist/types/types/mapprovider.d.ts +46 -0
- package/dist/types/types/provideroptions.d.ts +8 -0
- package/dist/types/types/styleconfig.d.ts +27 -0
- package/dist/types/types/styling.d.ts +24 -0
- package/dist/types/types/styling.unit.d.ts +1 -0
- package/dist/types/types/vmaplayer.d.ts +10 -0
- package/dist/types/utils/async-mutex.d.ts +7 -0
- package/dist/types/utils/diff.d.ts +64 -0
- package/dist/types/utils/diff.unit.d.ts +1 -0
- package/dist/types/utils/dom-env.d.ts +5 -0
- package/dist/types/utils/dom-env.unit.d.ts +1 -0
- package/dist/types/utils/events.d.ts +29 -0
- package/dist/types/utils/logger.d.ts +47 -0
- package/dist/types/utils/logger.unit.d.ts +1 -0
- package/dist/types/utils/messages.d.ts +12 -0
- package/dist/types/utils/spatial-utils.d.ts +6 -0
- package/dist/types/utils/spatial-utils.unit.d.ts +1 -0
- package/dist/types/versions.d.ts +7 -0
- package/dist/v-map/index.esm.js +0 -0
- package/dist/v-map/p--vVleK-M.js +1 -0
- package/dist/v-map/p-09d10db0.entry.js +1 -0
- package/dist/v-map/p-5eba6058.entry.js +10 -0
- package/dist/v-map/p-6b102336.entry.js +1 -0
- package/dist/v-map/p-B-bAcABs.js +1 -0
- package/dist/v-map/p-BBpiaTpT.js +1 -0
- package/dist/v-map/p-BdijL4Av.js +1 -0
- package/dist/v-map/p-Be3r33VF.js +4 -0
- package/dist/v-map/p-BeFu0ap4.js +1 -0
- package/dist/v-map/p-BxFJezdK.js +1 -0
- package/dist/v-map/p-CMKJzsgL.js +1 -0
- package/dist/v-map/p-CXfA_q8m.js +1 -0
- package/dist/v-map/p-CZqY0yW4.js +1 -0
- package/dist/v-map/p-CafTHT9i.js +1 -0
- package/dist/v-map/p-DCTHyf58.js +1 -0
- package/dist/v-map/p-DQuL1Twl.js +1 -0
- package/dist/v-map/p-DR9McdNX.js +1 -0
- package/dist/v-map/p-Dckgonw8.js +1 -0
- package/dist/v-map/p-DhQAXuA7.js +15 -0
- package/dist/v-map/p-DmICdG34.js +7 -0
- package/dist/v-map/p-DrOQ9V4h.js +1 -0
- package/dist/v-map/p-DvHXtWUg.js +1 -0
- package/dist/v-map/p-E-ZsRS8r.js +1 -0
- package/dist/v-map/p-MyTSFnEk.js +1 -0
- package/dist/v-map/p-RpJarvr_.js +1 -0
- package/dist/v-map/p-WaMDUuAz.js +1 -0
- package/dist/v-map/p-aa410e64.entry.js +2 -0
- package/dist/v-map/p-c21c93fe.entry.js +1 -0
- package/dist/v-map/p-jzneDarq.js +2 -0
- package/dist/v-map/p-uiIP-taz.js +1 -0
- package/dist/v-map/v-map.esm.js +1 -0
- package/loader/cdn.js +1 -0
- package/loader/index.cjs.js +1 -0
- package/loader/index.d.ts +24 -0
- package/loader/index.es2017.js +1 -0
- package/loader/index.js +2 -0
- 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
|
+
}
|