@geogirafe/lib-geoportal 1.1.0-dev.2588173445 → 1.1.0-dev.2591751450

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/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "name": "GeoGirafe PSC",
6
6
  "url": "https://doc.geomapfish.dev"
7
7
  },
8
- "version": "1.1.0-dev.2588173445",
8
+ "version": "1.1.0-dev.2591751450",
9
9
  "type": "module",
10
10
  "engines": {
11
11
  "node": ">=20.19.0"
@@ -1 +1 @@
1
- {"version":"1.1.0-dev.2588173445", "build":"2588173445", "date":"09/06/2026"}
1
+ {"version":"1.1.0-dev.2591751450", "build":"2591751450", "date":"10/06/2026"}
package/tools/main.d.ts CHANGED
@@ -123,6 +123,7 @@ export { generateQrCode } from './utils/qrcode.js';
123
123
  export { default as ServiceWorkerHelper } from './utils/swhelper.js';
124
124
  export { systemIsInDarkMode, isSafari, isFirefox, getValidIndex, minMax, hexToRgbaArray, rgbStrToRgbaArray, colorToRgbaArray, isValidEmail, applyOpacityToLayers, applyFeaturesToSelection, linkify, applyDefaultPrefixToUrl, splitTrimAndConvertToNumber } from './utils/utils.js';
125
125
  export { default as VendorSpecificOgcServerManager } from './vendorspecificogcservermanager.js';
126
+ export { CompositeCurveGML3, CompositeCurveGML32 } from './wfs/compositecurvegml.js';
126
127
  export type { WfsClientOptions, WfsClientOptionalOptions, QueryableLayerWms, GetFeatureOptionsPartial } from './wfs/wfsclient.js';
127
128
  export { default as WfsClient, WfsClientMapServer, WfsClientQgis, WfsClientGeorama, WfsClientDefault, WfsClientGeoServer } from './wfs/wfsclient.js';
128
129
  export { default as WfsFilter } from './wfs/wfsfilter.js';
package/tools/main.js CHANGED
@@ -96,6 +96,7 @@ export { generateQrCode } from './utils/qrcode.js';
96
96
  export { default as ServiceWorkerHelper } from './utils/swhelper.js';
97
97
  export { systemIsInDarkMode, isSafari, isFirefox, getValidIndex, minMax, hexToRgbaArray, rgbStrToRgbaArray, colorToRgbaArray, isValidEmail, applyOpacityToLayers, applyFeaturesToSelection, linkify, applyDefaultPrefixToUrl, splitTrimAndConvertToNumber } from './utils/utils.js';
98
98
  export { default as VendorSpecificOgcServerManager } from './vendorspecificogcservermanager.js';
99
+ export { CompositeCurveGML3, CompositeCurveGML32 } from './wfs/compositecurvegml.js';
99
100
  export { default as WfsClient, WfsClientMapServer, WfsClientQgis, WfsClientGeorama, WfsClientDefault, WfsClientGeoServer } from './wfs/wfsclient.js';
100
101
  export { default as WfsFilter } from './wfs/wfsfilter.js';
101
102
  export { default as WfsFilterCondition, isWfsOperator } from './wfs/wfsfiltercondition.js';
@@ -0,0 +1,18 @@
1
+ import GML3 from 'ol/format/GML3.js';
2
+ import GML32 from 'ol/format/GML32.js';
3
+ import { Options as GmlOptions } from 'ol/format/GMLBase.js';
4
+ import LineString from 'ol/geom/LineString.js';
5
+ import MultiLineString from 'ol/geom/MultiLineString.js';
6
+ type CompositeGeometry = LineString | MultiLineString;
7
+ type ObjectStack = Array<unknown>;
8
+ export declare class CompositeCurveGML3 extends GML3 {
9
+ constructor(options?: GmlOptions);
10
+ readCompositeCurve(node: Node, objectStack: ObjectStack): CompositeGeometry;
11
+ readOrientableCurve(node: Node, objectStack: ObjectStack): CompositeGeometry;
12
+ }
13
+ export declare class CompositeCurveGML32 extends GML32 {
14
+ constructor(options?: GmlOptions);
15
+ readCompositeCurve(node: Node, objectStack: ObjectStack): CompositeGeometry;
16
+ readOrientableCurve(node: Node, objectStack: ObjectStack): CompositeGeometry;
17
+ }
18
+ export {};
@@ -0,0 +1,160 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import GML3 from 'ol/format/GML3.js';
3
+ import GML32 from 'ol/format/GML32.js';
4
+ import LineString from 'ol/geom/LineString.js';
5
+ import MultiLineString from 'ol/geom/MultiLineString.js';
6
+ import { makeReplacer } from 'ol/xml.js';
7
+ const GML31_NS = 'http://www.opengis.net/gml';
8
+ const GML32_NS = 'http://www.opengis.net/gml/3.2';
9
+ const XLINK_NS = 'http://www.w3.org/1999/xlink';
10
+ export class CompositeCurveGML3 extends GML3 {
11
+ constructor(options) {
12
+ super(options);
13
+ registerCompositeCurveParser(this, GML31_NS);
14
+ }
15
+ readCompositeCurve(node, objectStack) {
16
+ return readCompositeCurve(this, node, objectStack);
17
+ }
18
+ readOrientableCurve(node, objectStack) {
19
+ return readOrientableCurve(this, node, objectStack);
20
+ }
21
+ }
22
+ export class CompositeCurveGML32 extends GML32 {
23
+ constructor(options) {
24
+ super(options);
25
+ registerCompositeCurveParser(this, GML32_NS);
26
+ }
27
+ readCompositeCurve(node, objectStack) {
28
+ return readCompositeCurve(this, node, objectStack);
29
+ }
30
+ readOrientableCurve(node, objectStack) {
31
+ return readOrientableCurve(this, node, objectStack);
32
+ }
33
+ }
34
+ function registerCompositeCurveParser(parser, namespace) {
35
+ parser.GEOMETRY_PARSERS[namespace] = {
36
+ ...parser.GEOMETRY_PARSERS[namespace],
37
+ CompositeCurve: makeReplacer(parser.readCompositeCurve, parser)
38
+ };
39
+ parser.CURVEMEMBER_PARSERS[namespace] = {
40
+ ...parser.CURVEMEMBER_PARSERS[namespace],
41
+ CompositeCurve: makeReplacer(parser.readCompositeCurve, parser),
42
+ OrientableCurve: makeReplacer(parser.readOrientableCurve, parser)
43
+ };
44
+ }
45
+ function readCompositeCurve(parser, node, objectStack) {
46
+ const pieces = [];
47
+ for (const member of Array.from(node.children)) {
48
+ if (member.localName !== 'curveMember' && member.localName !== 'curveMembers') {
49
+ continue;
50
+ }
51
+ pieces.push(...readCompositeCurveMember(parser, member, objectStack));
52
+ }
53
+ if (pieces.length === 0) {
54
+ console.warn(`CompositeCurve at ${describeNode(node)} did not contain convertible curve members.`);
55
+ return new MultiLineString([]);
56
+ }
57
+ return buildCompositeGeometry(pieces);
58
+ }
59
+ function readCompositeCurveMember(parser, member, objectStack) {
60
+ const href = member.getAttributeNS(XLINK_NS, 'href') ?? member.getAttribute('xlink:href');
61
+ if (href) {
62
+ console.warn(`CompositeCurve member reference ${href} cannot be resolved locally.`);
63
+ return [];
64
+ }
65
+ const pieces = [];
66
+ for (const child of Array.from(member.children)) {
67
+ pieces.push(...readCurveElement(parser, child, objectStack));
68
+ }
69
+ if (pieces.length === 0) {
70
+ console.warn(`CompositeCurve member at ${describeNode(member)} did not contain a convertible curve.`);
71
+ }
72
+ return pieces;
73
+ }
74
+ function readCurveElement(parser, node, objectStack) {
75
+ if (node.localName === 'LineString') {
76
+ return lineStringToPieces(parser.readLineString(node, objectStack));
77
+ }
78
+ if (node.localName === 'Curve') {
79
+ warnIfCurveHasUnsupportedSegments(node);
80
+ return lineStringToPieces(parser.readCurve(node, objectStack));
81
+ }
82
+ if (node.localName === 'CompositeCurve') {
83
+ return geometryToPieces(parser.readCompositeCurve(node, objectStack));
84
+ }
85
+ if (node.localName === 'OrientableCurve') {
86
+ return geometryToPieces(parser.readOrientableCurve(node, objectStack));
87
+ }
88
+ console.warn(`CompositeCurve member contains unsupported ${describeNode(node)}.`);
89
+ return [];
90
+ }
91
+ function readOrientableCurve(parser, node, objectStack) {
92
+ const baseCurve = Array.from(node.children).find((child) => child.localName === 'baseCurve');
93
+ if (!baseCurve) {
94
+ console.warn(`OrientableCurve at ${describeNode(node)} does not contain baseCurve.`);
95
+ return new MultiLineString([]);
96
+ }
97
+ const pieces = Array.from(baseCurve.children).flatMap((child) => readCurveElement(parser, child, objectStack));
98
+ if (node.getAttribute('orientation') === '-') {
99
+ pieces.reverse();
100
+ for (const piece of pieces) {
101
+ piece.reverse();
102
+ }
103
+ }
104
+ return buildCompositeGeometry(pieces);
105
+ }
106
+ function warnIfCurveHasUnsupportedSegments(node) {
107
+ const segments = Array.from(node.children).find((child) => child.localName === 'segments');
108
+ if (!segments) {
109
+ return;
110
+ }
111
+ const unsupportedSegment = Array.from(segments.children).find((child) => child.localName !== 'LineStringSegment');
112
+ if (unsupportedSegment) {
113
+ console.warn(`CompositeCurve member contains unsupported ${describeNode(unsupportedSegment)} segment.`);
114
+ }
115
+ }
116
+ function lineStringToPieces(lineString) {
117
+ if (!lineString) {
118
+ return [];
119
+ }
120
+ const coordinates = lineString.getCoordinates();
121
+ return coordinates.length > 0 ? [coordinates] : [];
122
+ }
123
+ function geometryToPieces(geometry) {
124
+ if (geometry instanceof LineString) {
125
+ return lineStringToPieces(geometry);
126
+ }
127
+ return geometry.getCoordinates();
128
+ }
129
+ function buildCompositeGeometry(pieces) {
130
+ const normalizedPieces = pieces.filter((piece) => piece.length > 0);
131
+ if (normalizedPieces.length === 0) {
132
+ return new MultiLineString([]);
133
+ }
134
+ const groups = [];
135
+ for (const piece of normalizedPieces) {
136
+ const current = clonePiece(piece);
137
+ const previous = groups.at(-1);
138
+ if (previous && coordinatesEqual(previous[previous.length - 1], current[0])) {
139
+ previous.push(...current.slice(1));
140
+ }
141
+ else {
142
+ groups.push(current);
143
+ }
144
+ }
145
+ return groups.length === 1 ? new LineString(groups[0]) : new MultiLineString(groups);
146
+ }
147
+ function clonePiece(piece) {
148
+ return piece.map((coordinate) => [...coordinate]);
149
+ }
150
+ function coordinatesEqual(first, second) {
151
+ if (first.length !== second.length) {
152
+ console.warn('CompositeCurve contains members with inconsistent coordinate dimensions.');
153
+ return false;
154
+ }
155
+ return first.every((value, index) => value === second[index]);
156
+ }
157
+ function describeNode(node) {
158
+ const id = node.getAttribute('gml:id') ?? node.getAttribute('id');
159
+ return id ? `${node.localName}#${id}` : node.localName;
160
+ }
@@ -1,5 +1,6 @@
1
1
  import { WFS as OlWFS } from 'ol/format.js';
2
2
  import GML32 from 'ol/format/GML32.js';
3
+ import { CompositeCurveGML3, CompositeCurveGML32 } from './compositecurvegml.js';
3
4
  /**
4
5
  * WFS parser
5
6
  *
@@ -14,7 +15,22 @@ import GML32 from 'ol/format/GML32.js';
14
15
  */
15
16
  export default class WfsParser extends OlWFS {
16
17
  constructor(opt_options) {
17
- super(opt_options);
18
+ const options = {
19
+ gmlFormat: opt_options?.gmlFormat,
20
+ version: opt_options?.version,
21
+ featureNS: opt_options?.featureNS,
22
+ featureType: opt_options?.featureType,
23
+ schemaLocation: opt_options?.schemaLocation
24
+ };
25
+ if (!options.gmlFormat) {
26
+ if (options.version === '2.0.0') {
27
+ options.gmlFormat = new CompositeCurveGML32(options);
28
+ }
29
+ else if (!options.version || options.version === '1.1.0') {
30
+ options.gmlFormat = new CompositeCurveGML3(options);
31
+ }
32
+ }
33
+ super(options);
18
34
  }
19
35
  readFeatures(source, opt_options) {
20
36
  // @ts-expect-error gmlFormat_ is private in super class