@loaders.gl/wms 3.4.0-alpha.2 → 3.4.0-alpha.3
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/dist/dist.min.js +359 -174
- package/dist/es5/csw-capabilities-loader.js +7 -11
- package/dist/es5/csw-capabilities-loader.js.map +1 -1
- package/dist/es5/csw-domain-loader.js +7 -10
- package/dist/es5/csw-domain-loader.js.map +1 -1
- package/dist/es5/csw-records-loader.js +7 -10
- package/dist/es5/csw-records-loader.js.map +1 -1
- package/dist/es5/gml-loader.js +7 -10
- package/dist/es5/gml-loader.js.map +1 -1
- package/dist/es5/index.js +0 -7
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lerc-loader.js +17 -22
- package/dist/es5/lerc-loader.js.map +1 -1
- package/dist/es5/lib/create-image-source.js +1 -2
- package/dist/es5/lib/create-image-source.js.map +1 -1
- package/dist/es5/lib/parsers/csw/parse-csw-capabilities.js.map +1 -1
- package/dist/es5/lib/parsers/csw/parse-csw-domain.js +1 -1
- package/dist/es5/lib/parsers/csw/parse-csw-domain.js.map +1 -1
- package/dist/es5/lib/parsers/csw/parse-csw-records.js +1 -2
- package/dist/es5/lib/parsers/csw/parse-csw-records.js.map +1 -1
- package/dist/es5/lib/parsers/csw/parse-exception-report.js +0 -2
- package/dist/es5/lib/parsers/csw/parse-exception-report.js.map +1 -1
- package/dist/es5/lib/parsers/gml/deep-strict-equal.js +0 -8
- package/dist/es5/lib/parsers/gml/deep-strict-equal.js.map +1 -1
- package/dist/es5/lib/parsers/gml/parse-gml.js +1 -13
- package/dist/es5/lib/parsers/gml/parse-gml.js.map +1 -1
- package/dist/es5/lib/parsers/wms/parse-wms-capabilities.js +197 -54
- package/dist/es5/lib/parsers/wms/parse-wms-capabilities.js.map +1 -1
- package/dist/es5/lib/parsers/wms/parse-wms-error.js +0 -1
- package/dist/es5/lib/parsers/wms/parse-wms-error.js.map +1 -1
- package/dist/es5/lib/parsers/wms/parse-wms-features.js +0 -1
- package/dist/es5/lib/parsers/wms/parse-wms-features.js.map +1 -1
- package/dist/es5/lib/parsers/wms/parse-wms-layer-description.js +0 -1
- package/dist/es5/lib/parsers/wms/parse-wms-layer-description.js.map +1 -1
- package/dist/es5/lib/parsers/xml/parse-xml-helpers.js +67 -0
- package/dist/es5/lib/parsers/xml/parse-xml-helpers.js.map +1 -0
- package/dist/es5/lib/services/arcgis/arcgis-image-service.js +35 -54
- package/dist/es5/lib/services/arcgis/arcgis-image-service.js.map +1 -1
- package/dist/es5/lib/services/arcgis/arcgis-server.js +50 -54
- package/dist/es5/lib/services/arcgis/arcgis-server.js.map +1 -1
- package/dist/es5/lib/services/generic/image-service.js +27 -36
- package/dist/es5/lib/services/generic/image-service.js.map +1 -1
- package/dist/es5/lib/services/ogc/csw-service.js +161 -186
- package/dist/es5/lib/services/ogc/csw-service.js.map +1 -1
- package/dist/es5/lib/services/ogc/wms-service.js +283 -245
- package/dist/es5/lib/services/ogc/wms-service.js.map +1 -1
- package/dist/es5/lib/sources/data-source.js +1 -6
- package/dist/es5/lib/sources/data-source.js.map +1 -1
- package/dist/es5/lib/sources/image-source.js.map +1 -1
- package/dist/es5/lib/sources/tile-source.js.map +1 -1
- package/dist/es5/lib/sources/utils/utils.js +0 -4
- package/dist/es5/lib/sources/utils/utils.js.map +1 -1
- package/dist/es5/wip/arcgis-feature-service.js +2 -7
- package/dist/es5/wip/arcgis-feature-service.js.map +1 -1
- package/dist/es5/wip/data-source.js +0 -2
- package/dist/es5/wip/lib/wcs/parse-wcs-capabilities.js.map +1 -1
- package/dist/es5/wip/lib/wfs/parse-wfs-capabilities.js.map +1 -1
- package/dist/es5/wip/lib/wmts/parse-wmts-capabilities.js.map +1 -1
- package/dist/es5/wip/wcs-capabilities-loader.js +7 -10
- package/dist/es5/wip/wcs-capabilities-loader.js.map +1 -1
- package/dist/es5/wip/wfs-capabilities-loader.js +7 -10
- package/dist/es5/wip/wfs-capabilities-loader.js.map +1 -1
- package/dist/es5/wip/wms-feature-info-loader.js +6 -8
- package/dist/es5/wip/wms-feature-info-loader.js.map +1 -1
- package/dist/es5/wip/wms-layer-description-loader.js +6 -8
- package/dist/es5/wip/wms-layer-description-loader.js.map +1 -1
- package/dist/es5/wip/wmts-capabilities-loader.js +7 -16
- package/dist/es5/wip/wmts-capabilities-loader.js.map +1 -1
- package/dist/es5/wms-capabilities-loader.js +8 -12
- package/dist/es5/wms-capabilities-loader.js.map +1 -1
- package/dist/es5/wms-error-loader.js +7 -9
- package/dist/es5/wms-error-loader.js.map +1 -1
- package/dist/esm/bundle.js +0 -2
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/csw-capabilities-loader.js +1 -5
- package/dist/esm/csw-capabilities-loader.js.map +1 -1
- package/dist/esm/csw-domain-loader.js +1 -4
- package/dist/esm/csw-domain-loader.js.map +1 -1
- package/dist/esm/csw-records-loader.js +1 -4
- package/dist/esm/csw-records-loader.js.map +1 -1
- package/dist/esm/gml-loader.js +1 -4
- package/dist/esm/gml-loader.js.map +1 -1
- package/dist/esm/index.js +0 -11
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lerc-loader.js +1 -4
- package/dist/esm/lerc-loader.js.map +1 -1
- package/dist/esm/lib/create-image-source.js +0 -3
- package/dist/esm/lib/create-image-source.js.map +1 -1
- package/dist/esm/lib/parsers/csw/parse-csw-capabilities.js +0 -3
- package/dist/esm/lib/parsers/csw/parse-csw-capabilities.js.map +1 -1
- package/dist/esm/lib/parsers/csw/parse-csw-domain.js +0 -3
- package/dist/esm/lib/parsers/csw/parse-csw-domain.js.map +1 -1
- package/dist/esm/lib/parsers/csw/parse-csw-records.js +0 -3
- package/dist/esm/lib/parsers/csw/parse-csw-records.js.map +1 -1
- package/dist/esm/lib/parsers/csw/parse-exception-report.js +0 -3
- package/dist/esm/lib/parsers/csw/parse-exception-report.js.map +1 -1
- package/dist/esm/lib/parsers/gml/deep-strict-equal.js +0 -9
- package/dist/esm/lib/parsers/gml/deep-strict-equal.js.map +1 -1
- package/dist/esm/lib/parsers/gml/parse-gml.js +0 -14
- package/dist/esm/lib/parsers/gml/parse-gml.js.map +1 -1
- package/dist/esm/lib/parsers/wms/parse-wms-capabilities.js +151 -42
- package/dist/esm/lib/parsers/wms/parse-wms-capabilities.js.map +1 -1
- package/dist/esm/lib/parsers/wms/parse-wms-error.js +0 -3
- package/dist/esm/lib/parsers/wms/parse-wms-error.js.map +1 -1
- package/dist/esm/lib/parsers/wms/parse-wms-features.js +0 -3
- package/dist/esm/lib/parsers/wms/parse-wms-features.js.map +1 -1
- package/dist/esm/lib/parsers/wms/parse-wms-layer-description.js +0 -3
- package/dist/esm/lib/parsers/wms/parse-wms-layer-description.js.map +1 -1
- package/dist/esm/lib/parsers/xml/parse-xml-helpers.js +53 -0
- package/dist/esm/lib/parsers/xml/parse-xml-helpers.js.map +1 -0
- package/dist/esm/lib/services/arcgis/arcgis-image-service.js +0 -9
- package/dist/esm/lib/services/arcgis/arcgis-image-service.js.map +1 -1
- package/dist/esm/lib/services/arcgis/arcgis-server.js +0 -2
- package/dist/esm/lib/services/arcgis/arcgis-server.js.map +1 -1
- package/dist/esm/lib/services/generic/image-service.js +0 -5
- package/dist/esm/lib/services/generic/image-service.js.map +1 -1
- package/dist/esm/lib/services/ogc/csw-service.js +0 -11
- package/dist/esm/lib/services/ogc/csw-service.js.map +1 -1
- package/dist/esm/lib/services/ogc/wms-service.js +96 -87
- package/dist/esm/lib/services/ogc/wms-service.js.map +1 -1
- package/dist/esm/lib/sources/data-source.js +0 -6
- package/dist/esm/lib/sources/data-source.js.map +1 -1
- package/dist/esm/lib/sources/image-source.js +0 -3
- package/dist/esm/lib/sources/image-source.js.map +1 -1
- package/dist/esm/lib/sources/tile-source.js +0 -3
- package/dist/esm/lib/sources/tile-source.js.map +1 -1
- package/dist/esm/lib/sources/utils/utils.js +0 -5
- package/dist/esm/lib/sources/utils/utils.js.map +1 -1
- package/dist/esm/wip/arcgis-feature-service.js +0 -3
- package/dist/esm/wip/arcgis-feature-service.js.map +1 -1
- package/dist/esm/wip/lib/wcs/parse-wcs-capabilities.js +0 -3
- package/dist/esm/wip/lib/wcs/parse-wcs-capabilities.js.map +1 -1
- package/dist/esm/wip/lib/wfs/parse-wfs-capabilities.js +0 -3
- package/dist/esm/wip/lib/wfs/parse-wfs-capabilities.js.map +1 -1
- package/dist/esm/wip/lib/wmts/parse-wmts-capabilities.js +0 -3
- package/dist/esm/wip/lib/wmts/parse-wmts-capabilities.js.map +1 -1
- package/dist/esm/wip/wcs-capabilities-loader.js +1 -4
- package/dist/esm/wip/wcs-capabilities-loader.js.map +1 -1
- package/dist/esm/wip/wfs-capabilities-loader.js +1 -4
- package/dist/esm/wip/wfs-capabilities-loader.js.map +1 -1
- package/dist/esm/wip/wms-feature-info-loader.js +0 -2
- package/dist/esm/wip/wms-feature-info-loader.js.map +1 -1
- package/dist/esm/wip/wms-layer-description-loader.js +0 -2
- package/dist/esm/wip/wms-layer-description-loader.js.map +1 -1
- package/dist/esm/wip/wmts-capabilities-loader.js +1 -6
- package/dist/esm/wip/wmts-capabilities-loader.js.map +1 -1
- package/dist/esm/wms-capabilities-loader.js +3 -7
- package/dist/esm/wms-capabilities-loader.js.map +1 -1
- package/dist/esm/wms-error-loader.js +1 -4
- package/dist/esm/wms-error-loader.js.map +1 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/lib/parsers/wms/parse-wms-capabilities.d.ts +78 -62
- package/dist/lib/parsers/wms/parse-wms-capabilities.d.ts.map +1 -1
- package/dist/lib/parsers/wms/parse-wms-capabilities.js +165 -1935
- package/dist/lib/parsers/xml/parse-xml-helpers.d.ts +11 -0
- package/dist/lib/parsers/xml/parse-xml-helpers.d.ts.map +1 -0
- package/dist/lib/parsers/xml/parse-xml-helpers.js +68 -0
- package/dist/lib/services/arcgis/arcgis-image-service.js +1 -1
- package/dist/lib/services/generic/image-service.js +1 -1
- package/dist/lib/services/ogc/csw-service.d.ts +1 -1
- package/dist/lib/services/ogc/csw-service.d.ts.map +1 -1
- package/dist/lib/services/ogc/csw-service.js +1 -1
- package/dist/lib/services/ogc/wms-service.d.ts +63 -58
- package/dist/lib/services/ogc/wms-service.d.ts.map +1 -1
- package/dist/lib/services/ogc/wms-service.js +106 -71
- package/dist/lib/sources/image-source.d.ts +3 -9
- package/dist/lib/sources/image-source.d.ts.map +1 -1
- package/dist/wip/wmts-capabilities-loader.d.ts +3 -4
- package/dist/wip/wmts-capabilities-loader.d.ts.map +1 -1
- package/dist/wip/wmts-capabilities-loader.js +1 -0
- package/dist/wms-capabilities-loader.d.ts +6 -1
- package/dist/wms-capabilities-loader.d.ts.map +1 -1
- package/dist/wms-capabilities-loader.js +2 -2
- package/package.json +6 -6
- package/src/index.ts +3 -4
- package/src/lib/parsers/wms/parse-wms-capabilities.ts +293 -2004
- package/src/lib/parsers/xml/parse-xml-helpers.ts +65 -0
- package/src/lib/services/ogc/csw-service.ts +1 -1
- package/src/lib/services/ogc/wms-service.ts +169 -109
- package/src/lib/sources/image-source.ts +3 -9
- package/src/wip/wmts-capabilities-loader.ts +2 -2
- package/src/wms-capabilities-loader.ts +9 -3
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// loaders.gl, MIT license
|
|
2
|
+
|
|
3
|
+
/** A single element of an array is not represented as an array in XML */
|
|
4
|
+
export function getXMLArray(xmlValue: any): any[] {
|
|
5
|
+
// Already an array, return as is
|
|
6
|
+
if (Array.isArray(xmlValue)) {
|
|
7
|
+
return xmlValue;
|
|
8
|
+
}
|
|
9
|
+
// Single value, wrap in array
|
|
10
|
+
if (xmlValue) {
|
|
11
|
+
return [xmlValue];
|
|
12
|
+
}
|
|
13
|
+
// nullish, return empty array
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Get a list of strings from XML */
|
|
18
|
+
export function getXMLStringArray(xmlValue: any): string[] {
|
|
19
|
+
const xmlArray = getXMLArray(xmlValue);
|
|
20
|
+
if (xmlArray.length > 0 && xmlArray.every((_) => typeof _ === 'string')) {
|
|
21
|
+
return xmlArray as string[];
|
|
22
|
+
}
|
|
23
|
+
// TODO - error handling?
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Get XML float */
|
|
28
|
+
export function getXMLFloat(xmlValue: any, defaultValue = undefined): number | undefined {
|
|
29
|
+
switch (typeof xmlValue) {
|
|
30
|
+
case 'number':
|
|
31
|
+
return xmlValue;
|
|
32
|
+
case 'string':
|
|
33
|
+
return parseFloat(xmlValue);
|
|
34
|
+
default:
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Get XML integer */
|
|
40
|
+
export function getXMLInteger(xmlValue: any, defaultValue = undefined): number | undefined {
|
|
41
|
+
switch (typeof xmlValue) {
|
|
42
|
+
case 'number':
|
|
43
|
+
return xmlValue;
|
|
44
|
+
case 'string':
|
|
45
|
+
return parseInt(xmlValue, 10);
|
|
46
|
+
default:
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Somewhat arbitrary boolean parsing */
|
|
52
|
+
export function getXMLBoolean(xmlValue: any): boolean {
|
|
53
|
+
switch (xmlValue) {
|
|
54
|
+
case 'true':
|
|
55
|
+
return true;
|
|
56
|
+
case 'false':
|
|
57
|
+
return false;
|
|
58
|
+
case '1':
|
|
59
|
+
return true;
|
|
60
|
+
case '0':
|
|
61
|
+
return false;
|
|
62
|
+
default:
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -79,7 +79,7 @@ export class CSWService extends DataSource {
|
|
|
79
79
|
return capabilities;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
async getServiceDirectory(options
|
|
82
|
+
async getServiceDirectory(options?: {includeUnknown?: boolean}): Promise<Service[]> {
|
|
83
83
|
const services: Service[] = [];
|
|
84
84
|
const unknownServices: Service[] = [];
|
|
85
85
|
|
|
@@ -21,42 +21,57 @@ import {WMSLayerDescriptionLoader} from '../../../wip/wms-layer-description-load
|
|
|
21
21
|
import type {WMSLoaderOptions} from '../../../wms-error-loader';
|
|
22
22
|
import {WMSErrorLoader} from '../../../wms-error-loader';
|
|
23
23
|
|
|
24
|
+
/** Static WMS parameters (not viewport or selected pixel dependent) that can be provided as defaults */
|
|
25
|
+
export type WMSParameters = {
|
|
26
|
+
/** WMS version */
|
|
27
|
+
version?: '1.3.0' | '1.1.1';
|
|
28
|
+
/** Layers to render */
|
|
29
|
+
layers?: string[];
|
|
30
|
+
/** Coordinate Reference System (CRS) for the image (not the bounding box) */
|
|
31
|
+
crs?: string;
|
|
32
|
+
/** Requested format for the return image */
|
|
33
|
+
format?: 'image/png';
|
|
34
|
+
/** Requested MIME type of returned feature info */
|
|
35
|
+
info_format?: 'text/plain' | 'application/geojson' | 'application/vnd.ogc.gml';
|
|
36
|
+
/** Styling - Not yet supported */
|
|
37
|
+
styles?: unknown;
|
|
38
|
+
/** Any additional parameters specific to this WMSService */
|
|
39
|
+
transparent?: boolean;
|
|
40
|
+
};
|
|
41
|
+
|
|
24
42
|
type WMSCommonParameters = {
|
|
25
|
-
/** In case the endpoint supports multiple services */
|
|
26
|
-
service?: 'WMS';
|
|
27
43
|
/** In case the endpoint supports multiple WMS versions */
|
|
28
|
-
version?: '1.
|
|
44
|
+
version?: '1.3.0' | '1.1.1';
|
|
29
45
|
};
|
|
30
46
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
request?: 'GetCapabilities';
|
|
34
|
-
};
|
|
47
|
+
/** Parameters for GetCapabilities */
|
|
48
|
+
export type WMSGetCapabilitiesParameters = WMSCommonParameters;
|
|
35
49
|
|
|
50
|
+
/** Parameters for GetMap */
|
|
36
51
|
export type WMSGetMapParameters = WMSCommonParameters & {
|
|
37
|
-
/** Request type */
|
|
38
|
-
request?: 'GetMap';
|
|
39
52
|
/** Layers to render */
|
|
40
53
|
layers: string | string[];
|
|
41
|
-
/** Styling */
|
|
42
|
-
styles?: unknown;
|
|
43
54
|
/** bounding box of the requested map image */
|
|
44
55
|
bbox: [number, number, number, number];
|
|
45
56
|
/** pixel width of returned image */
|
|
46
57
|
width: number;
|
|
47
58
|
/** pixels */
|
|
48
59
|
height: number;
|
|
49
|
-
/**
|
|
50
|
-
|
|
60
|
+
/** Coordinate Reference System for the image (not the bounding box). */
|
|
61
|
+
crs?: string;
|
|
62
|
+
/** Styling */
|
|
63
|
+
styles?: unknown;
|
|
64
|
+
/** Don't render background when no data */
|
|
65
|
+
transparent?: boolean;
|
|
51
66
|
/** requested format for the return image */
|
|
52
67
|
format?: 'image/png';
|
|
53
68
|
};
|
|
54
69
|
|
|
55
|
-
|
|
70
|
+
/**
|
|
71
|
+
* Parameters for GetFeatureInfo
|
|
72
|
+
* @see https://imagery.pasda.psu.edu/arcgis/services/pasda/UrbanTreeCanopy_Landcover/MapServer/WmsServer?SERVICE=WMS&
|
|
73
|
+
*/
|
|
56
74
|
export type WMSGetFeatureInfoParameters = WMSCommonParameters & {
|
|
57
|
-
/** Request type */
|
|
58
|
-
request?: 'GetFeatureInfo';
|
|
59
|
-
|
|
60
75
|
/** x coordinate for the feature info request */
|
|
61
76
|
x: number;
|
|
62
77
|
/** y coordinate for the feature info request */
|
|
@@ -64,7 +79,7 @@ export type WMSGetFeatureInfoParameters = WMSCommonParameters & {
|
|
|
64
79
|
/** list of layers to query (could be different from rendered layers) */
|
|
65
80
|
query_layers: string[];
|
|
66
81
|
/** Requested MIME type of returned feature info */
|
|
67
|
-
info_format?: 'text/plain' | 'application/vnd.ogc.gml';
|
|
82
|
+
info_format?: 'text/plain' | 'application/geojson' | 'application/vnd.ogc.gml';
|
|
68
83
|
|
|
69
84
|
/** Layers to render */
|
|
70
85
|
layers: string[];
|
|
@@ -82,32 +97,22 @@ export type WMSGetFeatureInfoParameters = WMSCommonParameters & {
|
|
|
82
97
|
format?: 'image/png';
|
|
83
98
|
};
|
|
84
99
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
request?: 'DescribeLayer';
|
|
88
|
-
};
|
|
100
|
+
/** Parameters for DescribeLayer */
|
|
101
|
+
export type WMSDescribeLayerParameters = WMSCommonParameters;
|
|
89
102
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
103
|
+
/** Parameters for GetLegendGraphic */
|
|
104
|
+
export type WMSGetLegendGraphicParameters = WMSCommonParameters;
|
|
105
|
+
|
|
106
|
+
//
|
|
94
107
|
|
|
95
|
-
/** Properties for
|
|
108
|
+
/** Properties for creating a enw WMS service */
|
|
96
109
|
export type WMSServiceProps = ImageSourceProps & {
|
|
97
110
|
/** Base URL to the service */
|
|
98
111
|
url: string;
|
|
99
|
-
/** WMS
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
|
|
103
|
-
/** SRS for the image (not the bounding box) */
|
|
104
|
-
srs?: string;
|
|
105
|
-
/** Requested format for the return image */
|
|
106
|
-
format?: 'image/png';
|
|
107
|
-
/** Requested MIME type of returned feature info */
|
|
108
|
-
info_format?: 'text/plain' | 'application/vnd.ogc.gml';
|
|
109
|
-
/** Styling */
|
|
110
|
-
styles?: unknown;
|
|
112
|
+
/** Default WMS parameters. If not provided here, must be provided in the various request */
|
|
113
|
+
wmsParameters?: WMSParameters;
|
|
114
|
+
/** Any additional service specific parameters */
|
|
115
|
+
vendorParameters?: Record<string, unknown>;
|
|
111
116
|
};
|
|
112
117
|
|
|
113
118
|
/**
|
|
@@ -121,7 +126,12 @@ export class WMSService extends ImageSource {
|
|
|
121
126
|
static type: 'wms' = 'wms';
|
|
122
127
|
static testURL = (url: string): boolean => url.toLowerCase().includes('wms');
|
|
123
128
|
|
|
124
|
-
|
|
129
|
+
readonly url: string;
|
|
130
|
+
/** Default static WMS parameters */
|
|
131
|
+
wmsParameters: Required<WMSParameters>;
|
|
132
|
+
/** Default static vendor parameters */
|
|
133
|
+
vendorParameters?: Record<string, unknown>;
|
|
134
|
+
|
|
125
135
|
capabilities: WMSCapabilities | null = null;
|
|
126
136
|
|
|
127
137
|
/** A list of loaders used by the WMSService methods */
|
|
@@ -139,17 +149,22 @@ export class WMSService extends ImageSource {
|
|
|
139
149
|
|
|
140
150
|
// TODO - defaults such as version, layers etc could be extracted from a base URL with parameters
|
|
141
151
|
// This would make pasting in any WMS URL more likely to make this class just work.
|
|
152
|
+
// const {baseUrl, parameters} = this._parseWMSUrl(props.url);
|
|
153
|
+
|
|
154
|
+
this.url = props.url;
|
|
142
155
|
|
|
143
|
-
this.
|
|
144
|
-
loadOptions: undefined!,
|
|
156
|
+
this.wmsParameters = {
|
|
145
157
|
layers: undefined!,
|
|
146
158
|
styles: undefined,
|
|
147
|
-
version: '1.
|
|
148
|
-
|
|
159
|
+
version: '1.3.0',
|
|
160
|
+
crs: 'EPSG:4326',
|
|
149
161
|
format: 'image/png',
|
|
150
162
|
info_format: 'text/plain',
|
|
151
|
-
|
|
163
|
+
transparent: undefined!,
|
|
164
|
+
...props.wmsParameters
|
|
152
165
|
};
|
|
166
|
+
|
|
167
|
+
this.vendorParameters = props.vendorParameters || {};
|
|
153
168
|
}
|
|
154
169
|
|
|
155
170
|
// ImageSource implementation
|
|
@@ -159,7 +174,10 @@ export class WMSService extends ImageSource {
|
|
|
159
174
|
}
|
|
160
175
|
|
|
161
176
|
async getImage(parameters: GetImageParameters): Promise<ImageType> {
|
|
162
|
-
|
|
177
|
+
// WMS 1.3.0 renamed SRS to CRS (sigh...)
|
|
178
|
+
const wmsParameters = {...parameters, crs: parameters.srs};
|
|
179
|
+
delete wmsParameters.srs;
|
|
180
|
+
return await this.getMap(wmsParameters);
|
|
163
181
|
}
|
|
164
182
|
|
|
165
183
|
normalizeMetadata(capabilities: WMSCapabilities): ImageSourceMetadata {
|
|
@@ -177,22 +195,22 @@ export class WMSService extends ImageSource {
|
|
|
177
195
|
const response = await this.fetch(url);
|
|
178
196
|
const arrayBuffer = await response.arrayBuffer();
|
|
179
197
|
this._checkResponse(response, arrayBuffer);
|
|
180
|
-
const capabilities = await WMSCapabilitiesLoader.parse(arrayBuffer, this.
|
|
198
|
+
const capabilities = await WMSCapabilitiesLoader.parse(arrayBuffer, this.loadOptions);
|
|
181
199
|
this.capabilities = capabilities;
|
|
182
200
|
return capabilities;
|
|
183
201
|
}
|
|
184
202
|
|
|
185
203
|
/** Get a map image */
|
|
186
204
|
async getMap(
|
|
187
|
-
|
|
205
|
+
wmsParameters: WMSGetMapParameters,
|
|
188
206
|
vendorParameters?: Record<string, unknown>
|
|
189
207
|
): Promise<ImageType> {
|
|
190
|
-
const url = this.getMapURL(
|
|
208
|
+
const url = this.getMapURL(wmsParameters, vendorParameters);
|
|
191
209
|
const response = await this.fetch(url);
|
|
192
210
|
const arrayBuffer = await response.arrayBuffer();
|
|
193
211
|
this._checkResponse(response, arrayBuffer);
|
|
194
212
|
try {
|
|
195
|
-
return await ImageLoader.parse(arrayBuffer, this.
|
|
213
|
+
return await ImageLoader.parse(arrayBuffer, this.loadOptions);
|
|
196
214
|
} catch {
|
|
197
215
|
throw this._parseError(arrayBuffer);
|
|
198
216
|
}
|
|
@@ -200,22 +218,22 @@ export class WMSService extends ImageSource {
|
|
|
200
218
|
|
|
201
219
|
/** Get Feature Info for a coordinate */
|
|
202
220
|
async getFeatureInfo(
|
|
203
|
-
|
|
221
|
+
wmsParameters: WMSGetFeatureInfoParameters,
|
|
204
222
|
vendorParameters?: Record<string, unknown>
|
|
205
223
|
): Promise<WMSFeatureInfo> {
|
|
206
|
-
const url = this.getFeatureInfoURL(
|
|
224
|
+
const url = this.getFeatureInfoURL(wmsParameters, vendorParameters);
|
|
207
225
|
const response = await this.fetch(url);
|
|
208
226
|
const arrayBuffer = await response.arrayBuffer();
|
|
209
227
|
this._checkResponse(response, arrayBuffer);
|
|
210
|
-
return await WMSFeatureInfoLoader.parse(arrayBuffer, this.
|
|
228
|
+
return await WMSFeatureInfoLoader.parse(arrayBuffer, this.loadOptions);
|
|
211
229
|
}
|
|
212
230
|
|
|
213
231
|
/** Get Feature Info for a coordinate */
|
|
214
232
|
async getFeatureInfoText(
|
|
215
|
-
|
|
233
|
+
wmsParameters: WMSGetFeatureInfoParameters,
|
|
216
234
|
vendorParameters?: Record<string, unknown>
|
|
217
235
|
): Promise<string> {
|
|
218
|
-
const url = this.getFeatureInfoURL(
|
|
236
|
+
const url = this.getFeatureInfoURL(wmsParameters, vendorParameters);
|
|
219
237
|
const response = await this.fetch(url);
|
|
220
238
|
const arrayBuffer = await response.arrayBuffer();
|
|
221
239
|
this._checkResponse(response, arrayBuffer);
|
|
@@ -224,27 +242,27 @@ export class WMSService extends ImageSource {
|
|
|
224
242
|
|
|
225
243
|
/** Get more information about a layer */
|
|
226
244
|
async describeLayer(
|
|
227
|
-
|
|
245
|
+
wmsParameters: WMSDescribeLayerParameters,
|
|
228
246
|
vendorParameters?: Record<string, unknown>
|
|
229
247
|
): Promise<WMSLayerDescription> {
|
|
230
|
-
const url = this.describeLayerURL(
|
|
248
|
+
const url = this.describeLayerURL(wmsParameters, vendorParameters);
|
|
231
249
|
const response = await this.fetch(url);
|
|
232
250
|
const arrayBuffer = await response.arrayBuffer();
|
|
233
251
|
this._checkResponse(response, arrayBuffer);
|
|
234
|
-
return await WMSLayerDescriptionLoader.parse(arrayBuffer, this.
|
|
252
|
+
return await WMSLayerDescriptionLoader.parse(arrayBuffer, this.loadOptions);
|
|
235
253
|
}
|
|
236
254
|
|
|
237
255
|
/** Get an image with a semantic legend */
|
|
238
256
|
async getLegendGraphic(
|
|
239
|
-
|
|
257
|
+
wmsParameters: WMSGetLegendGraphicParameters,
|
|
240
258
|
vendorParameters?: Record<string, unknown>
|
|
241
259
|
): Promise<ImageType> {
|
|
242
|
-
const url = this.getLegendGraphicURL(
|
|
260
|
+
const url = this.getLegendGraphicURL(wmsParameters, vendorParameters);
|
|
243
261
|
const response = await this.fetch(url);
|
|
244
262
|
const arrayBuffer = await response.arrayBuffer();
|
|
245
263
|
this._checkResponse(response, arrayBuffer);
|
|
246
264
|
try {
|
|
247
|
-
return await ImageLoader.parse(arrayBuffer, this.
|
|
265
|
+
return await ImageLoader.parse(arrayBuffer, this.loadOptions);
|
|
248
266
|
} catch {
|
|
249
267
|
throw this._parseError(arrayBuffer);
|
|
250
268
|
}
|
|
@@ -259,13 +277,10 @@ export class WMSService extends ImageSource {
|
|
|
259
277
|
vendorParameters?: Record<string, unknown>
|
|
260
278
|
): string {
|
|
261
279
|
const options: Required<WMSGetCapabilitiesParameters> = {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
request: 'GetCapabilities',
|
|
265
|
-
...wmsParameters,
|
|
266
|
-
...vendorParameters
|
|
280
|
+
version: this.wmsParameters.version,
|
|
281
|
+
...wmsParameters
|
|
267
282
|
};
|
|
268
|
-
return this._getWMSUrl(options, vendorParameters);
|
|
283
|
+
return this._getWMSUrl('GetCapabilities', options, vendorParameters);
|
|
269
284
|
}
|
|
270
285
|
|
|
271
286
|
/** Generate a URL for the GetMap request */
|
|
@@ -274,20 +289,18 @@ export class WMSService extends ImageSource {
|
|
|
274
289
|
vendorParameters?: Record<string, unknown>
|
|
275
290
|
): string {
|
|
276
291
|
const options: Required<WMSGetMapParameters> = {
|
|
277
|
-
|
|
278
|
-
version: this.props.version,
|
|
279
|
-
request: 'GetMap',
|
|
292
|
+
version: this.wmsParameters.version,
|
|
280
293
|
// layers: [],
|
|
281
294
|
// bbox: [-77.87304, 40.78975, -77.85828, 40.80228],
|
|
282
295
|
// width: 1200,
|
|
283
296
|
// height: 900,
|
|
284
|
-
styles: this.
|
|
285
|
-
|
|
286
|
-
format: this.
|
|
287
|
-
|
|
288
|
-
...
|
|
297
|
+
styles: this.wmsParameters.styles,
|
|
298
|
+
crs: this.wmsParameters.crs,
|
|
299
|
+
format: this.wmsParameters.format,
|
|
300
|
+
transparent: this.wmsParameters.transparent,
|
|
301
|
+
...wmsParameters
|
|
289
302
|
};
|
|
290
|
-
return this._getWMSUrl(options, vendorParameters);
|
|
303
|
+
return this._getWMSUrl('GetMap', options, vendorParameters);
|
|
291
304
|
}
|
|
292
305
|
|
|
293
306
|
/** Generate a URL for the GetFeatureInfo request */
|
|
@@ -296,9 +309,7 @@ export class WMSService extends ImageSource {
|
|
|
296
309
|
vendorParameters?: Record<string, unknown>
|
|
297
310
|
): string {
|
|
298
311
|
const options: Required<WMSGetFeatureInfoParameters> = {
|
|
299
|
-
|
|
300
|
-
version: this.props.version,
|
|
301
|
-
request: 'GetFeatureInfo',
|
|
312
|
+
version: this.wmsParameters.version,
|
|
302
313
|
// layers: this.props.layers,
|
|
303
314
|
// bbox: [-77.87304, 40.78975, -77.85828, 40.80228],
|
|
304
315
|
// width: 1200,
|
|
@@ -306,14 +317,13 @@ export class WMSService extends ImageSource {
|
|
|
306
317
|
// x: undefined!,
|
|
307
318
|
// y: undefined!,
|
|
308
319
|
// query_layers: [],
|
|
309
|
-
srs: this.
|
|
310
|
-
format: this.
|
|
311
|
-
info_format: this.
|
|
312
|
-
styles: this.
|
|
313
|
-
...wmsParameters
|
|
314
|
-
...vendorParameters
|
|
320
|
+
srs: this.wmsParameters.crs,
|
|
321
|
+
format: this.wmsParameters.format,
|
|
322
|
+
info_format: this.wmsParameters.info_format,
|
|
323
|
+
styles: this.wmsParameters.styles,
|
|
324
|
+
...wmsParameters
|
|
315
325
|
};
|
|
316
|
-
return this._getWMSUrl(options, vendorParameters);
|
|
326
|
+
return this._getWMSUrl('GetFeatureInfo', options, vendorParameters);
|
|
317
327
|
}
|
|
318
328
|
|
|
319
329
|
/** Generate a URL for the GetFeatureInfo request */
|
|
@@ -322,13 +332,10 @@ export class WMSService extends ImageSource {
|
|
|
322
332
|
vendorParameters?: Record<string, unknown>
|
|
323
333
|
): string {
|
|
324
334
|
const options: Required<WMSDescribeLayerParameters> = {
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
request: 'DescribeLayer',
|
|
328
|
-
...wmsParameters,
|
|
329
|
-
...vendorParameters
|
|
335
|
+
version: this.wmsParameters.version,
|
|
336
|
+
...wmsParameters
|
|
330
337
|
};
|
|
331
|
-
return this._getWMSUrl(options, vendorParameters);
|
|
338
|
+
return this._getWMSUrl('DescribeLayer', options, vendorParameters);
|
|
332
339
|
}
|
|
333
340
|
|
|
334
341
|
getLegendGraphicURL(
|
|
@@ -336,45 +343,98 @@ export class WMSService extends ImageSource {
|
|
|
336
343
|
vendorParameters?: Record<string, unknown>
|
|
337
344
|
): string {
|
|
338
345
|
const options: Required<WMSGetLegendGraphicParameters> = {
|
|
339
|
-
|
|
340
|
-
version: this.props.version,
|
|
341
|
-
request: 'GetLegendGraphic',
|
|
346
|
+
version: this.wmsParameters.version,
|
|
342
347
|
// format?
|
|
343
|
-
...wmsParameters
|
|
344
|
-
...vendorParameters
|
|
348
|
+
...wmsParameters
|
|
345
349
|
};
|
|
346
|
-
return this._getWMSUrl(options, vendorParameters);
|
|
350
|
+
return this._getWMSUrl('GetLegendGraphic', options, vendorParameters);
|
|
347
351
|
}
|
|
348
352
|
|
|
349
353
|
// INTERNAL METHODS
|
|
350
354
|
|
|
355
|
+
_parseWMSUrl(url: string): {url: string; parameters: Record<string, unknown>} {
|
|
356
|
+
const [baseUrl, search] = url.split('?');
|
|
357
|
+
const searchParams = search.split('&');
|
|
358
|
+
|
|
359
|
+
const parameters: Record<string, unknown> = {};
|
|
360
|
+
for (const parameter of searchParams) {
|
|
361
|
+
const [key, value] = parameter.split('=');
|
|
362
|
+
parameters[key] = value;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
return {url: baseUrl, parameters};
|
|
366
|
+
}
|
|
367
|
+
|
|
351
368
|
/**
|
|
369
|
+
* Generate a URL with parameters
|
|
352
370
|
* @note case _getWMSUrl may need to be overridden to handle certain backends?
|
|
371
|
+
* @note at the moment, only URLs with parameters are supported (no XML payloads)
|
|
353
372
|
* */
|
|
354
373
|
protected _getWMSUrl(
|
|
355
|
-
|
|
374
|
+
request: string,
|
|
375
|
+
wmsParameters: WMSCommonParameters & {[key: string]: unknown},
|
|
356
376
|
vendorParameters?: Record<string, unknown>
|
|
357
377
|
): string {
|
|
358
|
-
let url = this.
|
|
378
|
+
let url = this.url;
|
|
359
379
|
let first = true;
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
380
|
+
|
|
381
|
+
// Add any vendor searchParams
|
|
382
|
+
const allParameters = {
|
|
383
|
+
service: 'WMS',
|
|
384
|
+
version: wmsParameters.version,
|
|
385
|
+
request,
|
|
386
|
+
...wmsParameters,
|
|
387
|
+
...this.vendorParameters,
|
|
388
|
+
...vendorParameters
|
|
389
|
+
};
|
|
390
|
+
|
|
391
|
+
// Encode the keys
|
|
392
|
+
for (const [key, value] of Object.entries(allParameters)) {
|
|
393
|
+
// hack to preserve test cases. Not super clear if keys should be included when values are undefined
|
|
394
|
+
if (key !== 'transparent' || value) {
|
|
395
|
+
url += first ? '?' : '&';
|
|
396
|
+
first = false;
|
|
397
|
+
url += this._getParameterValue(wmsParameters.version!, key, value);
|
|
367
398
|
}
|
|
368
399
|
}
|
|
400
|
+
|
|
369
401
|
return encodeURI(url);
|
|
370
402
|
}
|
|
371
403
|
|
|
404
|
+
_getParameterValue(version: string, key: string, value: unknown): string {
|
|
405
|
+
// SRS parameter changed to CRS in 1.3.0, in non-backwards compatible way (sigh...)
|
|
406
|
+
if (key === 'crs' && version !== '1.3.0') {
|
|
407
|
+
key = 'srs';
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
key = key.toUpperCase();
|
|
411
|
+
|
|
412
|
+
// TODO - in v1.3.0 only, the order of parameters for BBOX depends on whether the CRS definition has flipped axes
|
|
413
|
+
// You will see this in the GetCapabilities request at 1.3.0 - the response should show the flipped axes.
|
|
414
|
+
// BBOX=xmin,ymin,xmax,ymax NON-FLIPPED
|
|
415
|
+
// BBOX=ymin,xmin,ymax,xmax FLIPPED
|
|
416
|
+
// / EPSG:4326 needs to have flipped axes. 4326 1 WGS 84 Latitude North Longitude East
|
|
417
|
+
// In WMS 1.1.1 EPSG:4326 is wrongly defined as having long/lat coordinate axes. In WMS 1.3.0 the correct axes lat/long are used. CRS:84 is defined by OGC as having the same datum as EPSG:4326 (that is the World Geodetic System 1984 datum ~ EPSG::6326) but axis order of long/lat.
|
|
418
|
+
// CRS:84 was introduced with the publication of the WMS 1.3.0 specification, to overcome this issue.
|
|
419
|
+
|
|
420
|
+
return Array.isArray(value)
|
|
421
|
+
? `${key}=${value.join(',')}`
|
|
422
|
+
: `${key}=${value ? String(value) : ''}`;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
protected async _fetchArrayBuffer(url: string): Promise<ArrayBuffer> {
|
|
426
|
+
const response = await this.fetch(url);
|
|
427
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
428
|
+
this._checkResponse(response, arrayBuffer);
|
|
429
|
+
return arrayBuffer;
|
|
430
|
+
}
|
|
431
|
+
|
|
372
432
|
/** Checks for and parses a WMS XML formatted ServiceError and throws an exception */
|
|
373
433
|
protected _checkResponse(response: Response, arrayBuffer: ArrayBuffer): void {
|
|
374
434
|
const contentType = response.headers['content-type'];
|
|
375
435
|
if (!response.ok || WMSErrorLoader.mimeTypes.includes(contentType)) {
|
|
376
436
|
// We want error responses to throw exceptions, the WMSErrorLoader can do this
|
|
377
|
-
const loadOptions = mergeLoaderOptions<WMSLoaderOptions>(this.
|
|
437
|
+
const loadOptions = mergeLoaderOptions<WMSLoaderOptions>(this.loadOptions, {
|
|
378
438
|
wms: {throwOnError: true}
|
|
379
439
|
});
|
|
380
440
|
const error = WMSErrorLoader.parseSync(arrayBuffer, loadOptions);
|
|
@@ -384,7 +444,7 @@ export class WMSService extends ImageSource {
|
|
|
384
444
|
|
|
385
445
|
/** Error situation detected */
|
|
386
446
|
protected _parseError(arrayBuffer: ArrayBuffer): Error {
|
|
387
|
-
const error = WMSErrorLoader.parseSync(arrayBuffer, this.
|
|
447
|
+
const error = WMSErrorLoader.parseSync(arrayBuffer, this.loadOptions);
|
|
388
448
|
return new Error(error);
|
|
389
449
|
}
|
|
390
450
|
}
|
|
@@ -15,21 +15,15 @@ export type ImageSourceMetadata = {
|
|
|
15
15
|
title?: string;
|
|
16
16
|
abstract?: string;
|
|
17
17
|
keywords: string[];
|
|
18
|
-
|
|
19
|
-
name: string;
|
|
20
|
-
title?: string;
|
|
21
|
-
srs?: string[];
|
|
22
|
-
boundingBox?: [number, number, number, number];
|
|
23
|
-
layers: ImageSourceLayer[];
|
|
24
|
-
};
|
|
18
|
+
layers: ImageSourceLayer[];
|
|
25
19
|
};
|
|
26
20
|
|
|
27
21
|
export type ImageSourceLayer = {
|
|
28
|
-
name
|
|
22
|
+
name?: string;
|
|
29
23
|
title?: string;
|
|
30
24
|
srs?: string[];
|
|
31
25
|
boundingBox?: [number, number, number, number];
|
|
32
|
-
layers
|
|
26
|
+
layers?: ImageSourceLayer[];
|
|
33
27
|
};
|
|
34
28
|
|
|
35
29
|
export type GetImageParameters = {
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
// loaders.gl, MIT license
|
|
2
2
|
|
|
3
3
|
import type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';
|
|
4
|
-
import {WMTSCapabilities} from './lib/wmts/parse-wmts-capabilities';
|
|
4
|
+
// import type {WMTSCapabilities} from './lib/wmts/parse-wmts-capabilities';
|
|
5
5
|
import {parseWMTSCapabilities} from './lib/wmts/parse-wmts-capabilities';
|
|
6
6
|
|
|
7
7
|
// __VERSION__ is injected by babel-plugin-version-inline
|
|
8
8
|
// @ts-ignore TS2304: Cannot find name '__VERSION__'.
|
|
9
9
|
const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
|
|
10
10
|
|
|
11
|
-
export {WMTSCapabilities};
|
|
11
|
+
// export type {WMTSCapabilities};
|
|
12
12
|
|
|
13
13
|
export type WMTSLoaderOptions = LoaderOptions & {
|
|
14
14
|
wmts?: {};
|
|
@@ -12,7 +12,12 @@ const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
|
|
|
12
12
|
export type {WMSCapabilities};
|
|
13
13
|
|
|
14
14
|
export type WMSLoaderOptions = LoaderOptions & {
|
|
15
|
-
wms?: {
|
|
15
|
+
wms?: {
|
|
16
|
+
/** Add inherited layer information to sub layers */
|
|
17
|
+
inheritedLayerProps?: boolean;
|
|
18
|
+
/** Whether to include "raw" XML-derived JSON */
|
|
19
|
+
raw?: boolean;
|
|
20
|
+
};
|
|
16
21
|
};
|
|
17
22
|
|
|
18
23
|
/**
|
|
@@ -32,8 +37,9 @@ export const WMSCapabilitiesLoader = {
|
|
|
32
37
|
wms: {}
|
|
33
38
|
},
|
|
34
39
|
parse: async (arrayBuffer: ArrayBuffer, options?: WMSLoaderOptions) =>
|
|
35
|
-
parseWMSCapabilities(new TextDecoder().decode(arrayBuffer), options),
|
|
36
|
-
parseTextSync: (text: string, options?: WMSLoaderOptions) =>
|
|
40
|
+
parseWMSCapabilities(new TextDecoder().decode(arrayBuffer), options?.wms),
|
|
41
|
+
parseTextSync: (text: string, options?: WMSLoaderOptions) =>
|
|
42
|
+
parseWMSCapabilities(text, options?.wms)
|
|
37
43
|
};
|
|
38
44
|
|
|
39
45
|
function testXMLFile(text: string): boolean {
|