@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 +1 -1
- package/templates/public/about.json +1 -1
- package/tools/main.d.ts +1 -0
- package/tools/main.js +1 -0
- package/tools/wfs/compositecurvegml.d.ts +18 -0
- package/tools/wfs/compositecurvegml.js +160 -0
- package/tools/wfs/wfsparser.js +17 -1
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"1.1.0-dev.
|
|
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
|
+
}
|
package/tools/wfs/wfsparser.js
CHANGED
|
@@ -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
|
-
|
|
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
|