From fb030299df03b17926817d818f449b00049ee25c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre-=C3=89tienne=20Lord?= Date: Thu, 28 Mar 2024 11:49:41 -0400 Subject: [PATCH 1/4] feat(geo): add geostyler as a style handled and legend renderer --- package-lock.json | 596 +++++++++++++++++- package.json | 2 + packages/geo/package.json | 2 + .../style/geostyler-service/geostyler.enum.ts | 4 + .../geostyler-service/geostyler.service.ts | 170 +++++ .../src/lib/style/geostyler-service/index.ts | 1 + packages/geo/src/lib/style/index.ts | 1 + packages/geo/src/lib/style/shared/index.ts | 1 + .../geo/src/lib/style/shared/style.enum.ts | 3 + packages/geo/src/lib/style/style.module.ts | 3 +- 10 files changed, 761 insertions(+), 22 deletions(-) create mode 100644 packages/geo/src/lib/style/geostyler-service/geostyler.enum.ts create mode 100644 packages/geo/src/lib/style/geostyler-service/geostyler.service.ts create mode 100644 packages/geo/src/lib/style/geostyler-service/index.ts create mode 100644 packages/geo/src/lib/style/shared/style.enum.ts diff --git a/package-lock.json b/package-lock.json index db2f15fd43..56be391b20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,6 +37,8 @@ "bowser": "^2.11.0", "core-js": "^3.32.2", "file-saver": "^2.0.2", + "geostyler-legend": "^4.0.0", + "geostyler-openlayers-parser": "^4.2.1", "hammerjs": "2.0.8", "html2canvas": "^1.4.1", "jspdf": "^2.5.1", @@ -6693,6 +6695,11 @@ "@types/node": "*" } }, + "node_modules/@types/d3-selection": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", + "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==" + }, "node_modules/@types/eslint": { "version": "8.56.5", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", @@ -6806,8 +6813,7 @@ "node_modules/@types/lodash": { "version": "4.14.202", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", - "dev": true + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" }, "node_modules/@types/mime": { "version": "1.3.5", @@ -9881,6 +9887,11 @@ "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", "dev": true }, + "node_modules/css-font-parser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-font-parser/-/css-font-parser-2.0.0.tgz", + "integrity": "sha512-YjgBiAq5rFNXfsPHofaEZwsUbCoSK0avstS76BSqNyVCM7+oiO44wZxbtq6YFSaQafCG0llS/f79oqlsmzaBJg==" + }, "node_modules/css-line-break": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", @@ -10251,11 +10262,246 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "peer": true, + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-array": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "peer": true, + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "peer": true, + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "peer": true, + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "peer": true, + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "peer": true, + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "peer": true, + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "peer": true, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-geo": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.7.1.tgz", @@ -10264,6 +10510,229 @@ "d3-array": "1" } }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "peer": true, + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "peer": true, + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "peer": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "peer": true, + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "peer": true, + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "peer": true, + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "peer": true, + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "peer": true, + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "peer": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3/node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "peer": true, + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3/node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "peer": true, + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/dargs": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", @@ -10587,6 +11056,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "peer": true, + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -12815,6 +13293,59 @@ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz", "integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==" }, + "node_modules/geostyler-legend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/geostyler-legend/-/geostyler-legend-4.0.1.tgz", + "integrity": "sha512-jsIpVGZwsAYGQOq9m/yfOCpoV3dMiUMZN/GiaQGEuAbXwQmFRo9LkRFQ2GnxAiYPdum5Sy3RFFMdoPGAyBEOAg==", + "dependencies": { + "@types/d3-selection": "^3.0.1", + "geostyler-openlayers-parser": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://opencollective.com/geostyler" + }, + "peerDependencies": { + "d3": ">=6", + "ol": ">=6" + } + }, + "node_modules/geostyler-openlayers-parser": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/geostyler-openlayers-parser/-/geostyler-openlayers-parser-4.3.0.tgz", + "integrity": "sha512-9LoctzoxorZogOpp6nXT6SZGnISRpNR9M+MLyhYVTFlOtDi4Gb4fWbUnpqVzDxqMNl8anMmv7cpMsmw1bjWsLw==", + "dependencies": { + "css-font-parser": "^2.0.0", + "geostyler-style": "^8.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://opencollective.com/geostyler" + }, + "peerDependencies": { + "ol": ">=7.4" + } + }, + "node_modules/geostyler-style": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/geostyler-style/-/geostyler-style-8.1.0.tgz", + "integrity": "sha512-8NgtzRc63bxC+1Vgqj/mMj77GX38CXXXWQ93PeZBdoMTkY9C/H0Anz38OrrlKdUgNVFZ/GJTNYwnX4wdaO5j6A==", + "dependencies": { + "@types/lodash": "^4.14.201", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=6.0.0" + }, + "funding": { + "url": "https://opencollective.com/geostyler" + } + }, "node_modules/geotiff": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/geotiff/-/geotiff-2.1.3.tgz", @@ -14029,6 +14560,15 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "peer": true, + "engines": { + "node": ">=12" + } + }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -15681,8 +16221,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -19875,6 +20414,12 @@ "node": "*" } }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "peer": true + }, "node_modules/rollup": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.1.tgz", @@ -19975,8 +20520,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/safevalues": { "version": "0.3.4", @@ -23500,7 +24044,8 @@ "integrity": "sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==" }, "packages/auth": { - "version": "17.0.0-next.0", + "name": "@igo2/auth", + "version": "17.0.0-next.4", "license": "MIT", "dependencies": { "jwt-decode": "^4.0.0", @@ -23526,7 +24071,8 @@ } }, "packages/common": { - "version": "17.0.0-next.0", + "name": "@igo2/common", + "version": "17.0.0-next.4", "license": "MIT", "dependencies": { "tslib": "^2.6.0" @@ -23554,7 +24100,8 @@ } }, "packages/context": { - "version": "17.0.0-next.0", + "name": "@igo2/context", + "version": "17.0.0-next.4", "license": "MIT", "dependencies": { "tslib": "^2.6.0" @@ -23579,7 +24126,8 @@ } }, "packages/core": { - "version": "17.0.0-next.0", + "name": "@igo2/core", + "version": "17.0.0-next.4", "license": "MIT", "dependencies": { "@ngx-translate/core": "^15.0.0", @@ -23606,7 +24154,8 @@ } }, "packages/geo": { - "version": "17.0.0-next.0", + "name": "@igo2/geo", + "version": "17.0.0-next.4", "license": "MIT", "dependencies": { "@turf/helpers": "^6.5.0", @@ -23640,6 +24189,8 @@ "@mat-datetimepicker/core": "~13.0.0", "file-saver": "^2.0.2", "flexsearch": "0.7.21", + "geostyler-legend": "^4.0.0", + "geostyler-openlayers-parser": "^4.2.1", "html2canvas": "^1.4.1", "jspdf": "^2.5.1", "jspdf-autotable": "^3.5.29", @@ -23655,7 +24206,8 @@ } }, "packages/integration": { - "version": "17.0.0-next.0", + "name": "@igo2/integration", + "version": "17.0.0-next.4", "license": "MIT", "dependencies": { "tslib": "^2.6.0" @@ -23675,7 +24227,8 @@ } }, "packages/utils": { - "version": "17.0.0-next.0", + "name": "@igo2/utils", + "version": "17.0.0-next.4", "license": "MIT", "dependencies": { "bowser": "^2.10.0", @@ -23692,7 +24245,8 @@ }, "projects/demo": {}, "projects/igo2": { - "version": "16.3.0", + "name": "igo", + "version": "17.0.0-next.0", "license": "LiLiQ-R", "dependencies": { "@angular/animations": "^17.0.7", @@ -23706,13 +24260,13 @@ "@angular/platform-browser-dynamic": "^17.0.7", "@angular/router": "^17.0.7", "@angular/service-worker": "^17.0.7", - "@igo2/auth": "^17.0.0-next.0", - "@igo2/common": "^17.0.0-next.0", - "@igo2/context": "^17.0.0-next.0", - "@igo2/core": "^17.0.0-next.0", - "@igo2/geo": "^17.0.0-next.0", - "@igo2/integration": "^17.0.0-next.0", - "@igo2/utils": "^17.0.0-next.0", + "@igo2/auth": "^17.0.0-next.3", + "@igo2/common": "^17.0.0-next.3", + "@igo2/context": "^17.0.0-next.3", + "@igo2/core": "^17.0.0-next.3", + "@igo2/geo": "^17.0.0-next.3", + "@igo2/integration": "^17.0.0-next.3", + "@igo2/utils": "^17.0.0-next.3", "core-js": "^3.32.2", "hammerjs": "^2.0.8", "ol": "^7.5.2", diff --git a/package.json b/package.json index 4e9bcb464c..34372fb781 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,8 @@ "@turf/helpers": "^6.5.0", "@turf/line-intersect": "^6.5.0", "@turf/point-on-feature": "^6.5.0", + "geostyler-legend": "^4.0.0", + "geostyler-openlayers-parser": "^4.2.1", "@types/tinycolor2": "^1.4.4", "bowser": "^2.11.0", "core-js": "^3.32.2", diff --git a/packages/geo/package.json b/packages/geo/package.json index 6c878dee54..59e34a3b8b 100644 --- a/packages/geo/package.json +++ b/packages/geo/package.json @@ -60,6 +60,8 @@ "@igo2/core": "*", "@igo2/utils": "*", "@mat-datetimepicker/core": "~13.0.0", + "geostyler-legend": "^4.0.0", + "geostyler-openlayers-parser": "^4.2.1", "file-saver": "^2.0.2", "flexsearch": "0.7.21", "html2canvas": "^1.4.1", diff --git a/packages/geo/src/lib/style/geostyler-service/geostyler.enum.ts b/packages/geo/src/lib/style/geostyler-service/geostyler.enum.ts new file mode 100644 index 0000000000..cf5a8be401 --- /dev/null +++ b/packages/geo/src/lib/style/geostyler-service/geostyler.enum.ts @@ -0,0 +1,4 @@ +export enum GeostylerLegendType { + SVG = 'svg', + URL = 'url' +} diff --git a/packages/geo/src/lib/style/geostyler-service/geostyler.service.ts b/packages/geo/src/lib/style/geostyler-service/geostyler.service.ts new file mode 100644 index 0000000000..49182d0420 --- /dev/null +++ b/packages/geo/src/lib/style/geostyler-service/geostyler.service.ts @@ -0,0 +1,170 @@ +import { Injectable } from '@angular/core'; + +import LegendRenderer from 'geostyler-legend/dist/LegendRenderer/LegendRenderer'; +import { OlStyleParser as OpenLayersParser } from 'geostyler-openlayers-parser'; +import { + Style as GeostylerStyle, + IconSymbolizer, + LineSymbolizer, + MarkSymbolizer, + WriteStyleResult +} from 'geostyler-style'; +import { Observable, from, map, tap } from 'rxjs'; + +import { StyleSourceType } from '../shared'; +import { GeostylerLegendType } from './geostyler.enum'; + +@Injectable({ + providedIn: 'root' +}) +export class GeostylerService { + /** + * Create a style based on a object as follow. + * Due to the legend renderer limitation, the symbolizers have a size limit in the legend. + * The legend will not affect the symbolizer size data, only on the display will it hava a limit. + * + * ## Feature styles + * + * { + * "name": "GeoStyler Test", + * "symbolizers":[ + * { + * "kind": "Fill", + * "color": "#ff0000", + * "width": 5 + * } + * ], + * "scaleDenominator": { + * "min": 50, + * "max": 200 + * } + * } + * + * @param Observable geostyler WriteStyleResult + * @returns + */ + public geostylerToOl(options: GeostylerStyle): Observable { + return this.geostylerTo(options, StyleSourceType.OpenLayers); + } + + private geostylerTo( + options: GeostylerStyle, + destStyle: StyleSourceType + ): Observable { + let parser; + if (destStyle === StyleSourceType.OpenLayers) { + parser = new OpenLayersParser(); + } + if (parser) { + return from(parser.writeStyle(options)).pipe( + tap((res) => this.handleWarningsAndError(res)) + ); + } + } + + public geostylerStyleToLegend( + style: GeostylerStyle, + type: GeostylerLegendType = GeostylerLegendType.SVG, + width?: number, + height?: number + ): Observable { + return this.geostylerStylesToLegend([style], type, width, height); + } + + public geostylerStylesToLegend( + styles: GeostylerStyle[], + type: GeostylerLegendType = GeostylerLegendType.SVG, + width?: number, + height?: number + ): Observable { + const layerDescriptors: GeostylerStyle[] = + this.transferLayersToLegend(styles); + + const nbOfRules = styles.reduce( + (partialSum, style) => partialSum + style.rules.length, + 0 + ); + const nbOfNames = styles.reduce( + (partialSum, style) => (partialSum + style.name?.length ? 1 : 0), + 0 + ); + const heightByName = 30; + const heightByRule = 30; + + const computedHeightByStyles = + nbOfNames * heightByName + nbOfRules * heightByRule; + + const renderer = new LegendRenderer({ + maxColumnWidth: 300, + maxColumnHeight: 300, + overflow: 'auto', + styles: layerDescriptors, + size: [width ?? 300, height ?? computedHeightByStyles], + hideRect: true + }); + return from(renderer.renderAsImage('svg')).pipe( + map((r: Element) => { + const serializer = new XMLSerializer(); + const svgXmlString = serializer.serializeToString(r); + if (type === GeostylerLegendType.SVG) { + return svgXmlString; + } else { + const blob = new Blob([svgXmlString], { + type: 'image/svg+xml' + }); + const urlCreator = window.URL; + return urlCreator.createObjectURL(blob); + } + }) + ); + } + + private transferLayersToLegend(styles: GeostylerStyle[]) { + const _styles = [...styles]; + const layerDescriptorsList: GeostylerStyle[] = []; + _styles.forEach((_stylesItem) => { + const descriptorLayerRulesAdapted = []; + let descriptorLayerName = _stylesItem.name; + _stylesItem.rules.map((styleRule) => { + var styleRuleSymbolizersAdapted = []; + styleRule.symbolizers.map((styleRuleSymbolizer) => { + switch (styleRuleSymbolizer.kind) { + case 'Mark': + (styleRuleSymbolizer as MarkSymbolizer).radius = 10; + break; + case 'Line': + (styleRuleSymbolizer as LineSymbolizer).width = 3; + break; + case 'Icon': + (styleRuleSymbolizer as IconSymbolizer).size = 15; + default: + break; + } + styleRuleSymbolizersAdapted.push(styleRuleSymbolizer); + }); + descriptorLayerRulesAdapted.push({ + name: styleRule.name, + symbolizers: styleRuleSymbolizersAdapted + }); + }); + const styleNoRadius: any = { + name: descriptorLayerName, + rules: descriptorLayerRulesAdapted + }; + layerDescriptorsList.push(styleNoRadius); + }); + return layerDescriptorsList; + } + + private handleWarningsAndError(writeStyleResult: WriteStyleResult) { + if (writeStyleResult?.warnings) { + console.warn(writeStyleResult.warnings); + } + if (writeStyleResult?.errors) { + console.error(writeStyleResult.errors); + } + if (writeStyleResult?.unsupportedProperties) { + console.warn(writeStyleResult.unsupportedProperties); + } + } +} diff --git a/packages/geo/src/lib/style/geostyler-service/index.ts b/packages/geo/src/lib/style/geostyler-service/index.ts new file mode 100644 index 0000000000..a4d958db1a --- /dev/null +++ b/packages/geo/src/lib/style/geostyler-service/index.ts @@ -0,0 +1 @@ +export * from './geostyler.service'; diff --git a/packages/geo/src/lib/style/index.ts b/packages/geo/src/lib/style/index.ts index 5be03fe0cc..85d8cda384 100644 --- a/packages/geo/src/lib/style/index.ts +++ b/packages/geo/src/lib/style/index.ts @@ -2,3 +2,4 @@ export * from './shared'; export * from './style-service'; export * from './style-list'; export * from './style-modal'; +export * from './geostyler-service'; diff --git a/packages/geo/src/lib/style/shared/index.ts b/packages/geo/src/lib/style/shared/index.ts index eb89219cf9..39c455d3ef 100644 --- a/packages/geo/src/lib/style/shared/index.ts +++ b/packages/geo/src/lib/style/shared/index.ts @@ -2,3 +2,4 @@ export * from './datasource'; export * from './vector'; export * from './overlay'; export * from './feature'; +export * from './style.enum'; diff --git a/packages/geo/src/lib/style/shared/style.enum.ts b/packages/geo/src/lib/style/shared/style.enum.ts new file mode 100644 index 0000000000..4ee2c40732 --- /dev/null +++ b/packages/geo/src/lib/style/shared/style.enum.ts @@ -0,0 +1,3 @@ +export enum StyleSourceType { + OpenLayers = 'ol' +} diff --git a/packages/geo/src/lib/style/style.module.ts b/packages/geo/src/lib/style/style.module.ts index 526cf7b678..5f8990de89 100644 --- a/packages/geo/src/lib/style/style.module.ts +++ b/packages/geo/src/lib/style/style.module.ts @@ -1,5 +1,6 @@ import { ModuleWithProviders, NgModule } from '@angular/core'; +import { GeostylerService } from './geostyler-service/geostyler.service'; import { IgoStyleListModule } from './style-list/style-list.module'; import { StyleModalDrawingComponent } from './style-modal/drawing/style-modal-drawing.component'; import { StyleModalLayerButtonComponent } from './style-modal/layer-button/style-modal-layer-button.component'; @@ -25,7 +26,7 @@ export class IgoStyleModule { static forRoot(): ModuleWithProviders { return { ngModule: IgoStyleModule, - providers: [StyleService, DrawStyleService] + providers: [StyleService, DrawStyleService, GeostylerService] }; } } From 6ae03c5a48fbe808b2e226c10d97f410a639c563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre-=C3=89tienne=20Lord?= Date: Thu, 28 Mar 2024 11:59:33 -0400 Subject: [PATCH 2/4] feat(geo): add geostyler support for vector and vectortile layer --- .../geo/src/lib/layer/shared/layer.service.ts | 40 +++++++++++++++++-- .../shared/vector/vector-style.interface.ts | 7 ++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/packages/geo/src/lib/layer/shared/layer.service.ts b/packages/geo/src/lib/layer/shared/layer.service.ts index 5e7d5c6ced..2ad69d3e6f 100644 --- a/packages/geo/src/lib/layer/shared/layer.service.ts +++ b/packages/geo/src/lib/layer/shared/layer.service.ts @@ -12,7 +12,7 @@ import { StyleLike as OlStyleLike } from 'ol/style/Style'; import { stylefunction } from 'ol-mapbox-style'; import { Observable, combineLatest, of } from 'rxjs'; -import { catchError, concatMap, map } from 'rxjs/operators'; +import { catchError, concatMap, map, mergeMap } from 'rxjs/operators'; import { DataSourceService } from '../../datasource/shared/datasource.service'; import { @@ -33,6 +33,7 @@ import { } from '../../datasource/shared/datasources'; import { LayerDBService } from '../../offline/layerDB/layerDB.service'; import { GeoNetworkService } from '../../offline/shared/geo-network.service'; +import { GeostylerService } from '../../style/geostyler-service/geostyler.service'; import { StyleService } from '../../style/style-service/style.service'; import { computeMVTOptionsOnHover } from '../utils/layer.utils'; import { @@ -60,6 +61,7 @@ export class LayerService { private geoNetworkService: GeoNetworkService, private messageService: MessageService, private layerDBService: LayerDBService, + private geostylerStyleService: GeostylerService, @Optional() private authInterceptor: AuthInterceptor ) {} @@ -121,7 +123,7 @@ export class LayerService { return new Observable((d) => d.next(this.createLayer(layerOptions))); } - return this.dataSourceService + const datasource$ = this.dataSourceService .createAsyncDataSource(layerOptions.sourceOptions, detailedContextUri) .pipe( map((source) => { @@ -131,6 +133,38 @@ export class LayerService { return this.createLayer(Object.assign(layerOptions, { source })); }) ); + + const stylableLayerOptions = layerOptions as + | VectorLayerOptions + | VectorTileLayerOptions; + const geostylerStyleGlobal = + stylableLayerOptions.igoStyle?.geostylerStyle?.global; + + if (geostylerStyleGlobal) { + return combineLatest([ + this.geostylerStyleService.geostylerToOl(geostylerStyleGlobal), + this.geostylerStyleService.geostylerStyleToLegend(geostylerStyleGlobal) + ]).pipe( + mergeMap((res) => { + const writeStyleResult = res[0]; + const legend = res[1]; + if (writeStyleResult?.output) { + stylableLayerOptions.style = writeStyleResult.output; + } + if (legend) { + if (layerOptions.legendOptions) { + layerOptions.legendOptions.html = legend; + } else { + layerOptions.legendOptions = { html: legend }; + } + } + + return datasource$; + }) + ); + } else { + return datasource$; + } } private createImageLayer(layerOptions: ImageLayerOptions): ImageLayer { @@ -278,7 +312,7 @@ export class LayerService { private createVectorTileLayer( layerOptions: VectorTileLayerOptions ): VectorTileLayer { - let style: Style[] | Style | OlStyleLike; + let style: Style[] | Style | OlStyleLike = layerOptions.style; let igoLayer: VectorTileLayer; if (!layerOptions.igoStyle) { diff --git a/packages/geo/src/lib/style/shared/vector/vector-style.interface.ts b/packages/geo/src/lib/style/shared/vector/vector-style.interface.ts index 910ecdc95f..1f643f7b83 100644 --- a/packages/geo/src/lib/style/shared/vector/vector-style.interface.ts +++ b/packages/geo/src/lib/style/shared/vector/vector-style.interface.ts @@ -2,6 +2,8 @@ import olFeature from 'ol/Feature'; import type { default as OlGeometry } from 'ol/geom/Geometry'; import olStyle from 'ol/style/Style'; +import { Style as GeostylerStyle } from 'geostyler-style'; + import type { Feature } from '../../../feature/shared/feature.interfaces'; export interface FeatureCommonVectorStyleOptions @@ -18,6 +20,11 @@ export interface IgoStyleBase { igoStyleObject?: { [key: string]: any }; mapboxStyle?: MapboxStyle; styleByAttribute?: StyleByAttribute; + geostylerStyle?: GeostylerStyleInterfaceOptions; +} + +export interface GeostylerStyleInterfaceOptions { + global?: GeostylerStyle; } export interface OverlayStyleOptions { From 62adb8e13dbae48fd42a94888af361718304e5e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre-=C3=89tienne=20Lord?= Date: Thu, 16 May 2024 10:01:54 -0400 Subject: [PATCH 3/4] refactor(geo): ensure to handle multiple style generated by geostyler --- packages/geo/src/lib/layer/shared/layer.service.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/geo/src/lib/layer/shared/layer.service.ts b/packages/geo/src/lib/layer/shared/layer.service.ts index 2ad69d3e6f..6e11b9825a 100644 --- a/packages/geo/src/lib/layer/shared/layer.service.ts +++ b/packages/geo/src/lib/layer/shared/layer.service.ts @@ -288,7 +288,13 @@ export class LayerService { if (layerOptions[legacyOption]) { let newKey = legacyOption; if (legacyOption === 'style') { - if (layerOptions[legacyOption] instanceof olStyle.Style) { + if ( + layerOptions[legacyOption] instanceof olStyle.Style || + (Array.isArray(layerOptions[legacyOption]) && + layerOptions[legacyOption].every( + (r) => r instanceof olStyle.Style + )) + ) { return; } if (typeof layerOptions[legacyOption] === 'object') { From fb125fb1f1cb02bf1dc3b74dbb2ff61f8edc3a51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre-=C3=89tienne=20Lord?= Date: Thu, 16 May 2024 11:01:06 -0400 Subject: [PATCH 4/4] adjustments for geostyler legend generation --- .../style/geostyler-service/geostyler.service.ts | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/packages/geo/src/lib/style/geostyler-service/geostyler.service.ts b/packages/geo/src/lib/style/geostyler-service/geostyler.service.ts index 49182d0420..7c1097358b 100644 --- a/packages/geo/src/lib/style/geostyler-service/geostyler.service.ts +++ b/packages/geo/src/lib/style/geostyler-service/geostyler.service.ts @@ -1,12 +1,10 @@ import { Injectable } from '@angular/core'; -import LegendRenderer from 'geostyler-legend/dist/LegendRenderer/LegendRenderer'; +import { LegendRenderer } from 'geostyler-legend'; import { OlStyleParser as OpenLayersParser } from 'geostyler-openlayers-parser'; import { Style as GeostylerStyle, IconSymbolizer, - LineSymbolizer, - MarkSymbolizer, WriteStyleResult } from 'geostyler-style'; import { Observable, from, map, tap } from 'rxjs'; @@ -96,7 +94,6 @@ export class GeostylerService { const renderer = new LegendRenderer({ maxColumnWidth: 300, - maxColumnHeight: 300, overflow: 'auto', styles: layerDescriptors, size: [width ?? 300, height ?? computedHeightByStyles], @@ -129,12 +126,6 @@ export class GeostylerService { var styleRuleSymbolizersAdapted = []; styleRule.symbolizers.map((styleRuleSymbolizer) => { switch (styleRuleSymbolizer.kind) { - case 'Mark': - (styleRuleSymbolizer as MarkSymbolizer).radius = 10; - break; - case 'Line': - (styleRuleSymbolizer as LineSymbolizer).width = 3; - break; case 'Icon': (styleRuleSymbolizer as IconSymbolizer).size = 15; default: @@ -144,7 +135,9 @@ export class GeostylerService { }); descriptorLayerRulesAdapted.push({ name: styleRule.name, - symbolizers: styleRuleSymbolizersAdapted + symbolizers: styleRuleSymbolizersAdapted.filter( + (s) => s.kind !== 'Text' + ) }); }); const styleNoRadius: any = {