@honua/react 0.1.0-beta.0 → 0.1.2-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/contract/discovery.d.ts +231 -0
- package/contract/discovery.d.ts.map +1 -0
- package/contract/discovery.js +554 -0
- package/contract/edit-sketch.d.ts +8 -0
- package/contract/edit-sketch.d.ts.map +1 -1
- package/contract/edit-sketch.js +15 -0
- package/contract/edit-snapping.d.ts +160 -0
- package/contract/edit-snapping.d.ts.map +1 -0
- package/contract/edit-snapping.js +675 -0
- package/contract/generated/projjson-v0.7-crs-validator.d.ts +35 -0
- package/contract/generated/projjson-v0.7-crs-validator.d.ts.map +1 -0
- package/contract/generated/projjson-v0.7-crs-validator.js +3941 -0
- package/contract/index.d.ts +11 -2
- package/contract/index.d.ts.map +1 -1
- package/contract/index.js +4 -1
- package/contract/pmtiles.d.ts +31 -0
- package/contract/pmtiles.d.ts.map +1 -1
- package/contract/pmtiles.js +60 -20
- package/contract/protocol-module.d.ts +70 -0
- package/contract/protocol-module.d.ts.map +1 -0
- package/contract/protocol-module.js +1 -0
- package/contract/schema-envelope.d.ts +26 -0
- package/contract/schema-envelope.d.ts.map +1 -0
- package/contract/schema-envelope.js +25 -0
- package/contract/schema.d.ts +582 -0
- package/contract/schema.d.ts.map +1 -0
- package/contract/schema.js +2483 -0
- package/contract/source-capability-support.d.ts +6 -0
- package/contract/source-capability-support.d.ts.map +1 -0
- package/contract/source-capability-support.js +154 -0
- package/contract/source.d.ts +35 -17
- package/contract/source.d.ts.map +1 -1
- package/contract/source.js +267 -71
- package/contract/types.d.ts +140 -4
- package/contract/types.d.ts.map +1 -1
- package/contract/types.js +6 -14
- package/core/bounded-json.d.ts +4 -0
- package/core/bounded-json.d.ts.map +1 -0
- package/core/bounded-json.js +38 -0
- package/core/cache-state.d.ts +9 -0
- package/core/cache-state.d.ts.map +1 -1
- package/core/cache-state.js +10 -0
- package/core/capabilities-xml.d.ts +33 -0
- package/core/capabilities-xml.d.ts.map +1 -0
- package/core/capabilities-xml.js +331 -0
- package/core/client.d.ts +4 -1
- package/core/client.d.ts.map +1 -1
- package/core/client.js +115 -29
- package/core/error-classifications.d.ts +153 -0
- package/core/error-classifications.d.ts.map +1 -0
- package/core/error-classifications.js +140 -0
- package/core/error-code-registry.d.ts +158 -0
- package/core/error-code-registry.d.ts.map +1 -0
- package/core/error-code-registry.js +143 -0
- package/core/error-envelope.d.ts +68 -0
- package/core/error-envelope.d.ts.map +1 -0
- package/core/error-envelope.js +357 -0
- package/core/errors.d.ts +45 -29
- package/core/errors.d.ts.map +1 -1
- package/core/errors.js +97 -50
- package/core/geoparquet-sql.d.ts +30 -2
- package/core/geoparquet-sql.d.ts.map +1 -1
- package/core/geoparquet-sql.js +38 -3
- package/core/odata-key-path.d.ts +12 -0
- package/core/odata-key-path.d.ts.map +1 -0
- package/core/odata-key-path.js +28 -0
- package/core/odata-write-codec.d.ts +66 -0
- package/core/odata-write-codec.d.ts.map +1 -0
- package/core/odata-write-codec.js +1083 -0
- package/core/odata.d.ts +59 -7
- package/core/odata.d.ts.map +1 -1
- package/core/odata.js +431 -99
- package/core/ogc-features.d.ts.map +1 -1
- package/core/ogc-features.js +3 -0
- package/core/ogc-maps.d.ts +7 -0
- package/core/ogc-maps.d.ts.map +1 -1
- package/core/ogc-maps.js +46 -7
- package/core/ogc-processes.d.ts +2 -1
- package/core/ogc-processes.d.ts.map +1 -1
- package/core/ogc-processes.js +33 -5
- package/core/ogc-records.d.ts +9 -0
- package/core/ogc-records.d.ts.map +1 -1
- package/core/ogc-records.js +78 -29
- package/core/ogc-tiles.d.ts +10 -1
- package/core/ogc-tiles.d.ts.map +1 -1
- package/core/ogc-tiles.js +56 -17
- package/core/path-utils.d.ts +9 -0
- package/core/path-utils.d.ts.map +1 -1
- package/core/path-utils.js +19 -0
- package/core/protocol-transport.d.ts +1 -0
- package/core/protocol-transport.d.ts.map +1 -1
- package/core/request-pipeline.d.ts.map +1 -1
- package/core/request-pipeline.js +1 -1
- package/core/spatial-filter.d.ts +8 -4
- package/core/spatial-filter.d.ts.map +1 -1
- package/core/spatial-filter.js +206 -16
- package/core/stac-static.d.ts +6 -2
- package/core/stac-static.d.ts.map +1 -1
- package/core/stac-static.js +260 -69
- package/core/surfaces.d.ts.map +1 -1
- package/core/surfaces.js +69 -5
- package/core/types.d.ts +125 -7
- package/core/types.d.ts.map +1 -1
- package/core/wfs-capabilities.d.ts +2 -0
- package/core/wfs-capabilities.d.ts.map +1 -1
- package/core/wfs-capabilities.js +8 -1
- package/core/wfs.d.ts.map +1 -1
- package/core/wfs.js +10 -0
- package/core/wms-capabilities.d.ts +56 -84
- package/core/wms-capabilities.d.ts.map +1 -1
- package/core/wms-capabilities.js +212 -509
- package/core/wmts-capabilities.d.ts +62 -62
- package/core/wmts-capabilities.d.ts.map +1 -1
- package/core/wmts-capabilities.js +224 -371
- package/esri-compat/editor.d.ts +8 -0
- package/esri-compat/editor.d.ts.map +1 -1
- package/esri-compat/editor.js +13 -0
- package/esri-compat/feature-layer.d.ts +2 -0
- package/esri-compat/feature-layer.d.ts.map +1 -1
- package/esri-compat/feature-layer.js +1 -0
- package/esri-compat/layer-list.d.ts +11 -0
- package/esri-compat/layer-list.d.ts.map +1 -1
- package/esri-compat/layer-list.js +49 -0
- package/esri-compat/legend.d.ts +10 -0
- package/esri-compat/legend.d.ts.map +1 -1
- package/esri-compat/legend.js +27 -0
- package/esri-compat/portal.d.ts +197 -0
- package/esri-compat/portal.d.ts.map +1 -0
- package/esri-compat/portal.js +251 -0
- package/esri-compat/renderer-objects.d.ts +40 -0
- package/esri-compat/renderer-objects.d.ts.map +1 -0
- package/esri-compat/renderer-objects.js +62 -0
- package/esri-compat/sketch.d.ts +43 -0
- package/esri-compat/sketch.d.ts.map +1 -1
- package/esri-compat/sketch.js +46 -0
- package/esri-compat/snapping.d.ts +43 -0
- package/esri-compat/snapping.d.ts.map +1 -0
- package/esri-compat/snapping.js +45 -0
- package/esri-compat/url.d.ts.map +1 -1
- package/esri-compat/url.js +1 -1
- package/esri-compat/widget-host.d.ts +84 -0
- package/esri-compat/widget-host.d.ts.map +1 -0
- package/esri-compat/widget-host.js +159 -0
- package/filter-registry/index.d.ts +145 -0
- package/filter-registry/index.d.ts.map +1 -0
- package/filter-registry/index.js +531 -0
- package/generated-app/errors.d.ts +18 -2
- package/generated-app/errors.d.ts.map +1 -1
- package/generated-app/errors.js +44 -11
- package/map/automatic-mount-integration.d.ts +134 -0
- package/map/automatic-mount-integration.d.ts.map +1 -0
- package/map/automatic-mount-integration.js +305 -0
- package/map/automatic-source-strategy.d.ts +125 -0
- package/map/automatic-source-strategy.d.ts.map +1 -0
- package/map/automatic-source-strategy.js +494 -0
- package/map/data-to-map-bridge.d.ts +293 -0
- package/map/data-to-map-bridge.d.ts.map +1 -0
- package/map/data-to-map-bridge.js +817 -0
- package/map/geojson-projection.d.ts +33 -0
- package/map/geojson-projection.d.ts.map +1 -0
- package/map/geojson-projection.js +118 -0
- package/map/index.d.ts +14 -0
- package/map/index.d.ts.map +1 -1
- package/map/index.js +8 -0
- package/map/raster-source-spec.d.ts +30 -0
- package/map/raster-source-spec.d.ts.map +1 -0
- package/map/raster-source-spec.js +190 -0
- package/map/raster-source-strategy.d.ts +65 -0
- package/map/raster-source-strategy.d.ts.map +1 -0
- package/map/raster-source-strategy.js +232 -0
- package/map/source-to-maplibre.d.ts +91 -0
- package/map/source-to-maplibre.d.ts.map +1 -0
- package/map/source-to-maplibre.js +454 -0
- package/map/temporal-playback.d.ts +139 -0
- package/map/temporal-playback.d.ts.map +1 -0
- package/map/temporal-playback.js +247 -0
- package/package.json +14 -1
- package/query-planner/canonical.d.ts +7 -0
- package/query-planner/canonical.d.ts.map +1 -0
- package/query-planner/canonical.js +145 -0
- package/query-planner/cql2-json.d.ts +17 -0
- package/query-planner/cql2-json.d.ts.map +1 -0
- package/query-planner/cql2-json.js +646 -0
- package/query-planner/diagnostics.d.ts +35 -0
- package/query-planner/diagnostics.d.ts.map +1 -0
- package/query-planner/diagnostics.js +373 -0
- package/query-planner/duckdb.d.ts +79 -0
- package/query-planner/duckdb.d.ts.map +1 -0
- package/query-planner/duckdb.js +758 -0
- package/query-planner/execution-context.d.ts +5 -0
- package/query-planner/execution-context.d.ts.map +1 -0
- package/query-planner/execution-context.js +50 -0
- package/query-planner/executor.d.ts +5 -0
- package/query-planner/executor.d.ts.map +1 -0
- package/query-planner/executor.js +223 -0
- package/query-planner/geoservices.d.ts +91 -0
- package/query-planner/geoservices.d.ts.map +1 -0
- package/query-planner/geoservices.js +667 -0
- package/query-planner/grpc.d.ts +100 -0
- package/query-planner/grpc.d.ts.map +1 -0
- package/query-planner/grpc.js +736 -0
- package/query-planner/index.d.ts +44 -0
- package/query-planner/index.d.ts.map +1 -0
- package/query-planner/index.js +30 -0
- package/query-planner/ir.d.ts +20 -0
- package/query-planner/ir.d.ts.map +1 -0
- package/query-planner/ir.js +417 -0
- package/query-planner/local-aggregate.d.ts +5 -0
- package/query-planner/local-aggregate.d.ts.map +1 -0
- package/query-planner/local-aggregate.js +126 -0
- package/query-planner/odata.d.ts +48 -0
- package/query-planner/odata.d.ts.map +1 -0
- package/query-planner/odata.js +662 -0
- package/query-planner/ogc-compiler.d.ts +55 -0
- package/query-planner/ogc-compiler.d.ts.map +1 -0
- package/query-planner/ogc-compiler.js +480 -0
- package/query-planner/ogc-features.d.ts +53 -0
- package/query-planner/ogc-features.d.ts.map +1 -0
- package/query-planner/ogc-features.js +617 -0
- package/query-planner/planner.d.ts +17 -0
- package/query-planner/planner.d.ts.map +1 -0
- package/query-planner/planner.js +818 -0
- package/query-planner/resource.d.ts +94 -0
- package/query-planner/resource.d.ts.map +1 -0
- package/query-planner/resource.js +526 -0
- package/query-planner/semantic-canonical.d.ts +15 -0
- package/query-planner/semantic-canonical.d.ts.map +1 -0
- package/query-planner/semantic-canonical.js +62 -0
- package/query-planner/semantic-compat.d.ts +10 -0
- package/query-planner/semantic-compat.d.ts.map +1 -0
- package/query-planner/semantic-compat.js +35 -0
- package/query-planner/semantic-compiler.d.ts +64 -0
- package/query-planner/semantic-compiler.d.ts.map +1 -0
- package/query-planner/semantic-compiler.js +81 -0
- package/query-planner/semantic-literals.d.ts +30 -0
- package/query-planner/semantic-literals.d.ts.map +1 -0
- package/query-planner/semantic-literals.js +133 -0
- package/query-planner/semantic-types.d.ts +265 -0
- package/query-planner/semantic-types.d.ts.map +1 -0
- package/query-planner/semantic-types.js +1 -0
- package/query-planner/semantic.d.ts +54 -0
- package/query-planner/semantic.d.ts.map +1 -0
- package/query-planner/semantic.js +1421 -0
- package/query-planner/types.d.ts +560 -0
- package/query-planner/types.d.ts.map +1 -0
- package/query-planner/types.js +49 -0
- package/query-planner/wfs-semantic.d.ts +58 -0
- package/query-planner/wfs-semantic.d.ts.map +1 -0
- package/query-planner/wfs-semantic.js +547 -0
- package/query-planner/wfs.d.ts +6 -0
- package/query-planner/wfs.d.ts.map +1 -0
- package/query-planner/wfs.js +71 -0
- package/react/external-map.d.ts +67 -0
- package/react/external-map.d.ts.map +1 -0
- package/react/external-map.js +63 -0
- package/react/honua-map.d.ts.map +1 -1
- package/react/honua-map.js +3 -2
- package/react/honua-source-layer.d.ts +110 -0
- package/react/honua-source-layer.d.ts.map +1 -0
- package/react/honua-source-layer.js +101 -0
- package/react/hooks.d.ts +28 -0
- package/react/hooks.d.ts.map +1 -1
- package/react/hooks.js +26 -4
- package/react/index.d.ts +8 -0
- package/react/index.d.ts.map +1 -1
- package/react/index.js +5 -0
- package/react/query-cache.d.ts +26 -4
- package/react/query-cache.d.ts.map +1 -1
- package/react/query-cache.js +51 -8
- package/react/selection.d.ts +177 -0
- package/react/selection.d.ts.map +1 -0
- package/react/selection.js +0 -0
- package/react/use-mounted-source.d.ts +69 -0
- package/react/use-mounted-source.d.ts.map +1 -0
- package/react/use-mounted-source.js +346 -0
- package/runtime/edit-snapping.d.ts +107 -0
- package/runtime/edit-snapping.d.ts.map +1 -0
- package/runtime/edit-snapping.js +190 -0
- package/runtime/errors.d.ts +3 -2
- package/runtime/errors.d.ts.map +1 -1
- package/runtime/errors.js +19 -2
- package/runtime/index.d.ts +6 -0
- package/runtime/index.d.ts.map +1 -1
- package/runtime/index.js +3 -0
- package/runtime/maplibre-renderer.d.ts +41 -0
- package/runtime/maplibre-renderer.d.ts.map +1 -0
- package/runtime/maplibre-renderer.js +322 -0
- package/runtime/query-tiles.d.ts +2 -1
- package/runtime/query-tiles.d.ts.map +1 -1
- package/runtime/query-tiles.js +6 -2
- package/runtime/source-bridge.d.ts +4 -4
- package/runtime/source-bridge.d.ts.map +1 -1
- package/runtime/source-bridge.js +9 -56
- package/runtime/style-interactions.d.ts +3 -2
- package/runtime/style-interactions.d.ts.map +1 -1
- package/runtime/style-interactions.js +11 -3
- package/runtime/terra-draw-sketch.d.ts +275 -0
- package/runtime/terra-draw-sketch.d.ts.map +1 -0
- package/runtime/terra-draw-sketch.js +404 -0
- package/source-capability-registry.d.ts +1 -0
- package/source-capability-registry.js +1 -0
- package/source-capability-types.d.ts +186 -0
- package/source-capability-types.js +7 -0
- package/style/index.d.ts +2 -0
- package/style/index.d.ts.map +1 -1
- package/style/index.js +2 -0
- package/style/renderers.d.ts +326 -0
- package/style/renderers.d.ts.map +1 -0
- package/style/renderers.js +517 -0
- package/webmap/convert-renderer.d.ts +24 -3
- package/webmap/convert-renderer.d.ts.map +1 -1
- package/webmap/convert-renderer.js +93 -112
- package/webmap/index.d.ts +1 -1
- package/webmap/index.d.ts.map +1 -1
- package/webmap/index.js +1 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal, dependency-free helpers shared by the MapLibre source adapters:
|
|
3
|
+
* canonical feature → GeoJSON conversion, geometry-kind classification, and
|
|
4
|
+
* geometry-appropriate default paint. Not exported from the `/map` entrypoint.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import type { HonuaTypedFeature } from "../core/types.js";
|
|
9
|
+
import type { AdapterGeoJsonFeature, AdapterGeoJsonFeatureCollection, AdapterGeoJsonGeometry } from "./feature-service-adapter.js";
|
|
10
|
+
/** Coarse geometry classification used to pick MapLibre layer types. */
|
|
11
|
+
export type MapLibreGeometryKind = "point" | "line" | "polygon";
|
|
12
|
+
/** Convert canonical features (GeoJSON or Esri JSON geometry) to GeoJSON. */
|
|
13
|
+
export declare function canonicalFeaturesToGeoJson<T>(features: readonly HonuaTypedFeature<T>[], primaryKey?: string): {
|
|
14
|
+
data: AdapterGeoJsonFeatureCollection;
|
|
15
|
+
unsupported: number;
|
|
16
|
+
};
|
|
17
|
+
/** Best-effort conversion of a canonical geometry value to GeoJSON. */
|
|
18
|
+
export declare function toGeoJsonGeometry(geometry: unknown): AdapterGeoJsonGeometry | null;
|
|
19
|
+
/** Distinct geometry kinds present in a feature array, in point→line→polygon order. */
|
|
20
|
+
export declare function geometryKinds(features: readonly AdapterGeoJsonFeature[]): MapLibreGeometryKind[];
|
|
21
|
+
/** Classify one GeoJSON geometry into a coarse layer kind. */
|
|
22
|
+
export declare function geometryKind(geometry: AdapterGeoJsonGeometry | null): MapLibreGeometryKind | undefined;
|
|
23
|
+
export declare function isGeoJsonGeometryType(value: unknown): value is AdapterGeoJsonGeometry["type"];
|
|
24
|
+
/** Geometry-appropriate default paint shared by the source adapters. */
|
|
25
|
+
export declare function defaultPaint(kind: MapLibreGeometryKind): Readonly<Record<string, unknown>>;
|
|
26
|
+
/** Default paint for the dedicated polygon outline layer. */
|
|
27
|
+
export declare function defaultPolygonOutlinePaint(): Readonly<Record<string, unknown>>;
|
|
28
|
+
export declare function layerType(kind: MapLibreGeometryKind): "circle" | "line" | "fill";
|
|
29
|
+
export declare function mapLibreGeometryType(kind: MapLibreGeometryKind): "Point" | "LineString" | "Polygon";
|
|
30
|
+
/** Normalize an arbitrary descriptor id into a safe MapLibre source id fragment. */
|
|
31
|
+
export declare function safeId(value: string): string;
|
|
32
|
+
export declare function removeUndefined(value: Record<string, unknown>): void;
|
|
33
|
+
//# sourceMappingURL=geojson-projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geojson-projection.d.ts","sourceRoot":"","sources":["../../../src/map/geojson-projection.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,KAAK,EACV,qBAAqB,EACrB,+BAA+B,EAC/B,sBAAsB,EACvB,MAAM,8BAA8B,CAAC;AAEtC,wEAAwE;AACxE,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhE,6EAA6E;AAC7E,wBAAgB,0BAA0B,CAAC,CAAC,EAC1C,QAAQ,EAAE,SAAS,iBAAiB,CAAC,CAAC,CAAC,EAAE,EACzC,UAAU,CAAC,EAAE,MAAM,GAClB;IAAE,IAAI,EAAE,+BAA+B,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAehE;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,sBAAsB,GAAG,IAAI,CAalF;AAED,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,SAAS,qBAAqB,EAAE,GAAG,oBAAoB,EAAE,CAQhG;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,GAAG,oBAAoB,GAAG,SAAS,CAMtG;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAS7F;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,IAAI,EAAE,oBAAoB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAU1F;AAED,6DAA6D;AAC7D,wBAAgB,0BAA0B,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAE9E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,oBAAoB,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAEhF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,CAEnG;AAED,oFAAoF;AACpF,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ5C;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAEpE"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal, dependency-free helpers shared by the MapLibre source adapters:
|
|
3
|
+
* canonical feature → GeoJSON conversion, geometry-kind classification, and
|
|
4
|
+
* geometry-appropriate default paint. Not exported from the `/map` entrypoint.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import { esriGeometryToGeoJson } from "./feature-service-adapter.js";
|
|
9
|
+
/** Convert canonical features (GeoJSON or Esri JSON geometry) to GeoJSON. */
|
|
10
|
+
export function canonicalFeaturesToGeoJson(features, primaryKey) {
|
|
11
|
+
let unsupported = 0;
|
|
12
|
+
const converted = features.map((feature) => {
|
|
13
|
+
const geometry = toGeoJsonGeometry(feature.geometry);
|
|
14
|
+
if (!geometry)
|
|
15
|
+
unsupported += 1;
|
|
16
|
+
const attributes = asAttributes(feature.attributes);
|
|
17
|
+
const id = primaryKey ? attributes[primaryKey] : undefined;
|
|
18
|
+
return {
|
|
19
|
+
type: "Feature",
|
|
20
|
+
...(typeof id === "string" || typeof id === "number" ? { id } : {}),
|
|
21
|
+
geometry,
|
|
22
|
+
properties: attributes,
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
return { data: { type: "FeatureCollection", features: converted }, unsupported };
|
|
26
|
+
}
|
|
27
|
+
/** Best-effort conversion of a canonical geometry value to GeoJSON. */
|
|
28
|
+
export function toGeoJsonGeometry(geometry) {
|
|
29
|
+
if (!geometry || typeof geometry !== "object")
|
|
30
|
+
return null;
|
|
31
|
+
const record = geometry;
|
|
32
|
+
if (isGeoJsonGeometryType(record.type) && "coordinates" in record) {
|
|
33
|
+
return { type: record.type, coordinates: record.coordinates };
|
|
34
|
+
}
|
|
35
|
+
if (Array.isArray(record.points))
|
|
36
|
+
return esriGeometryToGeoJson(record, "esriGeometryMultipoint");
|
|
37
|
+
if (Array.isArray(record.paths))
|
|
38
|
+
return esriGeometryToGeoJson(record, "esriGeometryPolyline");
|
|
39
|
+
if (Array.isArray(record.rings))
|
|
40
|
+
return esriGeometryToGeoJson(record, "esriGeometryPolygon");
|
|
41
|
+
if ("xmin" in record && "ymin" in record && "xmax" in record && "ymax" in record) {
|
|
42
|
+
return esriGeometryToGeoJson(record, "esriGeometryEnvelope");
|
|
43
|
+
}
|
|
44
|
+
return esriGeometryToGeoJson(record, "esriGeometryPoint");
|
|
45
|
+
}
|
|
46
|
+
/** Distinct geometry kinds present in a feature array, in point→line→polygon order. */
|
|
47
|
+
export function geometryKinds(features) {
|
|
48
|
+
const kinds = new Set();
|
|
49
|
+
for (const feature of features) {
|
|
50
|
+
const kind = geometryKind(feature.geometry);
|
|
51
|
+
if (kind)
|
|
52
|
+
kinds.add(kind);
|
|
53
|
+
}
|
|
54
|
+
const order = ["point", "line", "polygon"];
|
|
55
|
+
return order.filter((kind) => kinds.has(kind));
|
|
56
|
+
}
|
|
57
|
+
/** Classify one GeoJSON geometry into a coarse layer kind. */
|
|
58
|
+
export function geometryKind(geometry) {
|
|
59
|
+
const type = geometry?.type;
|
|
60
|
+
if (type === "Point" || type === "MultiPoint")
|
|
61
|
+
return "point";
|
|
62
|
+
if (type === "LineString" || type === "MultiLineString")
|
|
63
|
+
return "line";
|
|
64
|
+
if (type === "Polygon" || type === "MultiPolygon")
|
|
65
|
+
return "polygon";
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
export function isGeoJsonGeometryType(value) {
|
|
69
|
+
return (value === "Point" ||
|
|
70
|
+
value === "MultiPoint" ||
|
|
71
|
+
value === "LineString" ||
|
|
72
|
+
value === "MultiLineString" ||
|
|
73
|
+
value === "Polygon" ||
|
|
74
|
+
value === "MultiPolygon");
|
|
75
|
+
}
|
|
76
|
+
/** Geometry-appropriate default paint shared by the source adapters. */
|
|
77
|
+
export function defaultPaint(kind) {
|
|
78
|
+
if (kind === "point")
|
|
79
|
+
return {
|
|
80
|
+
"circle-color": "#16735b",
|
|
81
|
+
"circle-radius": 6,
|
|
82
|
+
"circle-stroke-color": "#ffffff",
|
|
83
|
+
"circle-stroke-width": 1.5,
|
|
84
|
+
};
|
|
85
|
+
if (kind === "line")
|
|
86
|
+
return { "line-color": "#16735b", "line-width": 2.5 };
|
|
87
|
+
return { "fill-color": "#37a887", "fill-opacity": 0.55, "fill-outline-color": "#0e5643" };
|
|
88
|
+
}
|
|
89
|
+
/** Default paint for the dedicated polygon outline layer. */
|
|
90
|
+
export function defaultPolygonOutlinePaint() {
|
|
91
|
+
return { "line-color": "#0e5643", "line-width": 1.5 };
|
|
92
|
+
}
|
|
93
|
+
export function layerType(kind) {
|
|
94
|
+
return kind === "point" ? "circle" : kind === "line" ? "line" : "fill";
|
|
95
|
+
}
|
|
96
|
+
export function mapLibreGeometryType(kind) {
|
|
97
|
+
return kind === "point" ? "Point" : kind === "line" ? "LineString" : "Polygon";
|
|
98
|
+
}
|
|
99
|
+
/** Normalize an arbitrary descriptor id into a safe MapLibre source id fragment. */
|
|
100
|
+
export function safeId(value) {
|
|
101
|
+
const normalized = value.toLowerCase().replaceAll(/[^a-z0-9_-]+/g, "-");
|
|
102
|
+
let start = 0;
|
|
103
|
+
let end = normalized.length;
|
|
104
|
+
while (start < end && normalized[start] === "-")
|
|
105
|
+
start += 1;
|
|
106
|
+
while (end > start && normalized[end - 1] === "-")
|
|
107
|
+
end -= 1;
|
|
108
|
+
const id = normalized.slice(start, end);
|
|
109
|
+
return id || "source";
|
|
110
|
+
}
|
|
111
|
+
export function removeUndefined(value) {
|
|
112
|
+
for (const key of Object.keys(value))
|
|
113
|
+
if (value[key] === undefined)
|
|
114
|
+
delete value[key];
|
|
115
|
+
}
|
|
116
|
+
function asAttributes(value) {
|
|
117
|
+
return value && typeof value === "object" ? { ...value } : {};
|
|
118
|
+
}
|
package/map/index.d.ts
CHANGED
|
@@ -17,11 +17,25 @@
|
|
|
17
17
|
* @packageDocumentation
|
|
18
18
|
*/
|
|
19
19
|
export { HonuaMap } from "./honua-map.js";
|
|
20
|
+
export { HonuaDataToMapBridgeError, explainDataToMapStrategy, mountSource } from "./data-to-map-bridge.js";
|
|
21
|
+
export type { DataToMapBridgeErrorCode, DataToMapDiagnostic, DataToMapDiagnosticCode, DataToMapLibreMap, DataToMapOverflow, DataToMapStrategy, DataToMapStrategyExplanation, MountedSource, MountedSourceDiagnostics, MountSourceOptions, MountSourcePopupContext, MountSourcePopupOptions, } from "./data-to-map-bridge.js";
|
|
22
|
+
export { AUTOMATIC_MAPLIBRE_PLAN_KIND, AUTOMATIC_MAPLIBRE_PLAN_VERSION, HonuaAutomaticMapLibreStrategyError, MAX_AUTOMATIC_GEOJSON_FEATURES, explainAutomaticSourceToMapLibre, mountAutomaticSourceToMapLibre, } from "./automatic-source-strategy.js";
|
|
23
|
+
export type { AutomaticMapLibreCandidate, AutomaticMapLibreDiagnostic, AutomaticMapLibreErrorCode, AutomaticMapLibreNativeSourceSpec, AutomaticMapLibrePlan, AutomaticMapLibreReasonCode, AutomaticMapLibreStrategy, AutomaticMapLibreWorkflowState, ExplainAutomaticMapLibreOptions, MountedAutomaticMapLibreSource, } from "./automatic-source-strategy.js";
|
|
24
|
+
export { HonuaAutomaticMapLibreIntegrationError, attachAutomaticMapLibreInteractions, } from "./automatic-mount-integration.js";
|
|
25
|
+
export type { AutomaticMapLibreIntegration, AutomaticMapLibreIntegrationDiagnostic, AutomaticMapLibreIntegrationDiagnosticCode, AutomaticMapLibreIntegrationErrorCode, AutomaticMapLibreIntegrationMap, AutomaticMapLibreIntegrationOptions, BindFilterRegistryOptions, RealtimeFeatureStateDelta, } from "./automatic-mount-integration.js";
|
|
20
26
|
export type { HonuaMapOptions, HonuaMapEvent, HonuaMapEventListener, LayerSnapshot, ResolvedMapSource, } from "./honua-map.js";
|
|
21
27
|
export { createHonuaFeatureServiceLayer, createHonuaMapLibreMapOptions, createHonuaMapLibreStyle, createHonuaMapServiceLayer, createHonuaTileServiceLayer, } from "./maplibre-target.js";
|
|
22
28
|
export type { HonuaFeatureServiceLayerOptions, HonuaMapLibreLayerDefinition, HonuaMapLibreLayerOptionsBase, HonuaMapLibreMapOptions, HonuaMapLibreRasterSourceSpecification, HonuaMapLibreStyleOptions, HonuaMapServiceLayerOptions, HonuaTileServiceLayerOptions, } from "./maplibre-target.js";
|
|
23
29
|
export { esriFeaturesToGeoJson, esriGeometryToGeoJson, loadHonuaFeatureServiceGeoJson, registerHonuaFeatureServiceSources, } from "./feature-service-adapter.js";
|
|
24
30
|
export type { AdapterGeoJsonFeature, AdapterGeoJsonFeatureCollection, AdapterGeoJsonGeometry, FeatureServiceAdapterMap, LoadHonuaFeatureServiceGeoJsonOptions, MapLibreGeoJsonSourceSpecification, RegisterHonuaFeatureServiceSourcesResult, } from "./feature-service-adapter.js";
|
|
31
|
+
export { HonuaMapLibreSourceAdapterError, mountSourceToMapLibre, projectSourceToMapLibre, } from "./source-to-maplibre.js";
|
|
32
|
+
export { buildWmsRasterSourceSpec, buildWmtsRasterSourceSpec } from "./raster-source-spec.js";
|
|
33
|
+
export type { MapLibreRasterSourceSpec, RasterSourceSpecOptions, WmsRasterSourceSpecOptions, WmtsRasterSourceSpecOptions, } from "./raster-source-spec.js";
|
|
34
|
+
export { HonuaMapLibreRasterStrategyError, mountRasterSourceToMapLibre, projectRasterSourceToMapLibre, } from "./raster-source-strategy.js";
|
|
35
|
+
export type { MapLibreRasterDiagnostic, MapLibreRasterDiagnosticCode, MapLibreRasterProjection, MapLibreRasterStrategy, MapLibreRasterStrategyErrorCode, MapLibreRasterWorkflowState, MountedMapLibreRasterSource, ProjectRasterSourceToMapLibreOptions, RasterSourceToMapLibreMap, } from "./raster-source-strategy.js";
|
|
36
|
+
export type { MapLibreGeometryKind, MapLibreSourceAdapterErrorCode, MapLibreSourceDiagnostic, MapLibreSourceDiagnosticCode, MapLibreSourceProjection, MapLibreSourceStrategy, MapLibreSourceWorkflowState, MountedMapLibreSource, MountSourceToMapLibreOptions, ProjectSourceToMapLibreOptions, SourceToMapLibreMap, } from "./source-to-maplibre.js";
|
|
25
37
|
export { webmapJsonToMapLibreStyle } from "./webmap-maplibre.js";
|
|
26
38
|
export type { WebMapJsonToMapLibreStyleOptions, WebMapJsonToMapLibreStyleResult, WebMapMapLibreGapKind, WebMapMapLibreManualGap, } from "./webmap-maplibre.js";
|
|
39
|
+
export { HonuaTemporalPlaybackError, createTemporalPlayback } from "./temporal-playback.js";
|
|
40
|
+
export type { TemporalFilterHandle, TemporalFilterMap, TemporalInstant, TemporalPlayback, TemporalPlaybackEventType, TemporalPlaybackOptions, TemporalPlaybackSubscription, TemporalPlaybackTick, TemporalWindow, } from "./temporal-playback.js";
|
|
27
41
|
//# sourceMappingURL=index.d.ts.map
|
package/map/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/map/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EACV,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,EAC7B,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,+BAA+B,EAC/B,4BAA4B,EAC5B,6BAA6B,EAC7B,uBAAuB,EACvB,sCAAsC,EACtC,yBAAyB,EACzB,2BAA2B,EAC3B,4BAA4B,GAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,8BAA8B,EAC9B,kCAAkC,GACnC,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,qBAAqB,EACrB,+BAA+B,EAC/B,sBAAsB,EACtB,wBAAwB,EACxB,qCAAqC,EACrC,kCAAkC,EAClC,wCAAwC,GACzC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,YAAY,EACV,gCAAgC,EAChC,+BAA+B,EAC/B,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/map/index.ts"],"names":[],"mappings":"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"}
|
package/map/index.js
CHANGED
|
@@ -17,6 +17,14 @@
|
|
|
17
17
|
* @packageDocumentation
|
|
18
18
|
*/
|
|
19
19
|
export { HonuaMap } from "./honua-map.js";
|
|
20
|
+
export { HonuaDataToMapBridgeError, explainDataToMapStrategy, mountSource } from "./data-to-map-bridge.js";
|
|
21
|
+
export { AUTOMATIC_MAPLIBRE_PLAN_KIND, AUTOMATIC_MAPLIBRE_PLAN_VERSION, HonuaAutomaticMapLibreStrategyError, MAX_AUTOMATIC_GEOJSON_FEATURES, explainAutomaticSourceToMapLibre, mountAutomaticSourceToMapLibre, } from "./automatic-source-strategy.js";
|
|
22
|
+
export { HonuaAutomaticMapLibreIntegrationError, attachAutomaticMapLibreInteractions, } from "./automatic-mount-integration.js";
|
|
20
23
|
export { createHonuaFeatureServiceLayer, createHonuaMapLibreMapOptions, createHonuaMapLibreStyle, createHonuaMapServiceLayer, createHonuaTileServiceLayer, } from "./maplibre-target.js";
|
|
21
24
|
export { esriFeaturesToGeoJson, esriGeometryToGeoJson, loadHonuaFeatureServiceGeoJson, registerHonuaFeatureServiceSources, } from "./feature-service-adapter.js";
|
|
25
|
+
export { HonuaMapLibreSourceAdapterError, mountSourceToMapLibre, projectSourceToMapLibre, } from "./source-to-maplibre.js";
|
|
26
|
+
export { buildWmsRasterSourceSpec, buildWmtsRasterSourceSpec } from "./raster-source-spec.js";
|
|
27
|
+
export { HonuaMapLibreRasterStrategyError, mountRasterSourceToMapLibre, projectRasterSourceToMapLibre, } from "./raster-source-strategy.js";
|
|
22
28
|
export { webmapJsonToMapLibreStyle } from "./webmap-maplibre.js";
|
|
29
|
+
// Temporal playback (issue #497). All @experimental.
|
|
30
|
+
export { HonuaTemporalPlaybackError, createTemporalPlayback } from "./temporal-playback.js";
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { SourceDescriptor } from "../contract/types.js";
|
|
2
|
+
export interface RasterSourceSpecOptions {
|
|
3
|
+
readonly tileSize?: number;
|
|
4
|
+
readonly format?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface WmsRasterSourceSpecOptions extends RasterSourceSpecOptions {
|
|
7
|
+
readonly transparent?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface WmtsRasterSourceSpecOptions extends RasterSourceSpecOptions {
|
|
10
|
+
readonly minzoom?: number;
|
|
11
|
+
readonly maxzoom?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface MapLibreRasterSourceSpec {
|
|
14
|
+
readonly type: "raster";
|
|
15
|
+
readonly tiles: readonly string[];
|
|
16
|
+
readonly tileSize: number;
|
|
17
|
+
readonly scheme?: "xyz";
|
|
18
|
+
readonly minzoom?: number;
|
|
19
|
+
readonly maxzoom?: number;
|
|
20
|
+
readonly attribution?: string;
|
|
21
|
+
}
|
|
22
|
+
/** Build a MapLibre raster source containing a WMS 1.3 GetMap template. */
|
|
23
|
+
export declare function buildWmsRasterSourceSpec(descriptor: SourceDescriptor, options?: WmsRasterSourceSpecOptions): MapLibreRasterSourceSpec;
|
|
24
|
+
/** Build a MapLibre raster source containing a RESTful WMTS tile template. */
|
|
25
|
+
export declare function buildWmtsRasterSourceSpec(descriptor: SourceDescriptor, options?: WmtsRasterSourceSpecOptions): MapLibreRasterSourceSpec;
|
|
26
|
+
/** Return whether a URL is safe to embed in a browser-owned raster source. */
|
|
27
|
+
export declare function isSafeMapLibreRasterEndpoint(value: string): boolean;
|
|
28
|
+
/** Validate a browser raster tileSize; WMS mirrors it into image dimensions. */
|
|
29
|
+
export declare function validateRasterTileSize(value: number): number;
|
|
30
|
+
//# sourceMappingURL=raster-source-spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raster-source-spec.d.ts","sourceRoot":"","sources":["../../../src/map/raster-source-spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAoE7D,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,0BAA2B,SAAQ,uBAAuB;IACzE,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,2BAA4B,SAAQ,uBAAuB;IAC1E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,2EAA2E;AAC3E,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,gBAAgB,EAC5B,OAAO,GAAE,0BAA+B,GACvC,wBAAwB,CAkC1B;AAED,8EAA8E;AAC9E,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,gBAAgB,EAC5B,OAAO,GAAE,2BAAgC,GACxC,wBAAwB,CA8B1B;AAED,8EAA8E;AAC9E,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAWnE;AAED,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK5D"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { wmtsExtensionForFormat } from "../core/wms-types.js";
|
|
2
|
+
const DEFAULT_RASTER_TILE_SIZE = 256;
|
|
3
|
+
const MAX_RASTER_TILE_SIZE = 4_096;
|
|
4
|
+
const CREDENTIAL_QUERY_KEYS = new Set([
|
|
5
|
+
"accesstoken",
|
|
6
|
+
"apikey",
|
|
7
|
+
"auth",
|
|
8
|
+
"authorization",
|
|
9
|
+
"authtoken",
|
|
10
|
+
"awsaccesskeyid",
|
|
11
|
+
"bearer",
|
|
12
|
+
"bearertoken",
|
|
13
|
+
"clientsecret",
|
|
14
|
+
"code",
|
|
15
|
+
"credential",
|
|
16
|
+
"expires",
|
|
17
|
+
"googleaccessid",
|
|
18
|
+
"idtoken",
|
|
19
|
+
"jwt",
|
|
20
|
+
"key",
|
|
21
|
+
"keypairid",
|
|
22
|
+
"password",
|
|
23
|
+
"passwd",
|
|
24
|
+
"privatekey",
|
|
25
|
+
"policy",
|
|
26
|
+
"pwd",
|
|
27
|
+
"refreshtoken",
|
|
28
|
+
"sas",
|
|
29
|
+
"secret",
|
|
30
|
+
"se",
|
|
31
|
+
"session",
|
|
32
|
+
"sessionid",
|
|
33
|
+
"sig",
|
|
34
|
+
"signature",
|
|
35
|
+
"sp",
|
|
36
|
+
"subscriptionkey",
|
|
37
|
+
"sv",
|
|
38
|
+
"token",
|
|
39
|
+
]);
|
|
40
|
+
const WMS_REQUEST_KEYS = new Set([
|
|
41
|
+
"BBOX",
|
|
42
|
+
"CRS",
|
|
43
|
+
"FORMAT",
|
|
44
|
+
"HEIGHT",
|
|
45
|
+
"LAYERS",
|
|
46
|
+
"REQUEST",
|
|
47
|
+
"SERVICE",
|
|
48
|
+
"SRS",
|
|
49
|
+
"STYLES",
|
|
50
|
+
"TRANSPARENT",
|
|
51
|
+
"VERSION",
|
|
52
|
+
"WIDTH",
|
|
53
|
+
]);
|
|
54
|
+
const WMTS_REQUEST_KEYS = new Set([
|
|
55
|
+
"FORMAT",
|
|
56
|
+
"LAYER",
|
|
57
|
+
"REQUEST",
|
|
58
|
+
"SERVICE",
|
|
59
|
+
"STYLE",
|
|
60
|
+
"TILECOL",
|
|
61
|
+
"TILEMATRIX",
|
|
62
|
+
"TILEMATRIXSET",
|
|
63
|
+
"TILEROW",
|
|
64
|
+
"VERSION",
|
|
65
|
+
]);
|
|
66
|
+
/** Build a MapLibre raster source containing a WMS 1.3 GetMap template. */
|
|
67
|
+
export function buildWmsRasterSourceSpec(descriptor, options = {}) {
|
|
68
|
+
const binding = descriptor.locator.raster;
|
|
69
|
+
if (binding && binding.kind !== "wms-kvp") {
|
|
70
|
+
throw new TypeError(`descriptor for "${descriptor.id}" carries a non-WMS raster binding`);
|
|
71
|
+
}
|
|
72
|
+
const endpoint = requireSafeRasterLocatorUrl(descriptor, binding?.url);
|
|
73
|
+
const tileSize = validateRasterTileSize(options.tileSize ?? DEFAULT_RASTER_TILE_SIZE);
|
|
74
|
+
const format = options.format ?? binding?.format ?? "image/png";
|
|
75
|
+
if (binding && options.format !== undefined && options.format.toLowerCase() !== binding.format.toLowerCase()) {
|
|
76
|
+
throw new TypeError(`descriptor for "${descriptor.id}" was discovered with WMS format "${binding.format}", not "${options.format}"`);
|
|
77
|
+
}
|
|
78
|
+
const transparent = options.transparent ?? true;
|
|
79
|
+
const params = new URLSearchParams(endpoint.search);
|
|
80
|
+
for (const key of [...params.keys()]) {
|
|
81
|
+
if (WMS_REQUEST_KEYS.has(key.toUpperCase()))
|
|
82
|
+
params.delete(key);
|
|
83
|
+
}
|
|
84
|
+
params.set("SERVICE", "WMS");
|
|
85
|
+
params.set("VERSION", "1.3.0");
|
|
86
|
+
params.set("REQUEST", "GetMap");
|
|
87
|
+
params.set("LAYERS", descriptor.locator.typeName ?? "");
|
|
88
|
+
params.set("STYLES", descriptor.locator.styleId ?? "");
|
|
89
|
+
params.set("CRS", "EPSG:3857");
|
|
90
|
+
params.set("FORMAT", format);
|
|
91
|
+
params.set("TRANSPARENT", String(transparent).toUpperCase());
|
|
92
|
+
endpoint.search = "";
|
|
93
|
+
const template = `${endpoint.toString()}?${params.toString()}&BBOX={bbox-epsg-3857}&WIDTH=${tileSize}&HEIGHT=${tileSize}`;
|
|
94
|
+
return {
|
|
95
|
+
type: "raster",
|
|
96
|
+
tiles: [template],
|
|
97
|
+
tileSize,
|
|
98
|
+
...(descriptor.attribution ? { attribution: descriptor.attribution } : {}),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/** Build a MapLibre raster source containing a RESTful WMTS tile template. */
|
|
102
|
+
export function buildWmtsRasterSourceSpec(descriptor, options = {}) {
|
|
103
|
+
const binding = descriptor.locator.raster;
|
|
104
|
+
if (binding?.kind === "wms-kvp") {
|
|
105
|
+
throw new TypeError(`descriptor for "${descriptor.id}" carries a non-WMTS raster binding`);
|
|
106
|
+
}
|
|
107
|
+
const url = requireSafeRasterLocatorUrl(descriptor, binding?.url).toString();
|
|
108
|
+
const format = options.format ?? binding?.format ?? "image/png";
|
|
109
|
+
if (binding && options.format !== undefined && options.format.toLowerCase() !== binding.format.toLowerCase()) {
|
|
110
|
+
throw new TypeError(`descriptor for "${descriptor.id}" was discovered with WMTS format "${binding.format}", not "${options.format}"`);
|
|
111
|
+
}
|
|
112
|
+
const ext = wmtsExtensionForFormat(format);
|
|
113
|
+
const layer = descriptor.locator.typeName ?? "";
|
|
114
|
+
const style = descriptor.locator.styleId ?? "default";
|
|
115
|
+
const tms = descriptor.locator.tileMatrixSetId ?? "WebMercatorQuad";
|
|
116
|
+
const tileUrl = binding
|
|
117
|
+
? binding.kind === "wmts-template"
|
|
118
|
+
? wmtsResourceTemplate(binding.url, layer, style, tms, binding.tileMatrixTemplate)
|
|
119
|
+
: wmtsKvpTemplate(binding.url, layer, style, tms, format, binding.tileMatrixTemplate)
|
|
120
|
+
: `${url}/${encodeURIComponent(layer)}/${encodeURIComponent(style)}/${encodeURIComponent(tms)}/{z}/{y}/{x}.${ext}`;
|
|
121
|
+
return {
|
|
122
|
+
type: "raster",
|
|
123
|
+
tiles: [tileUrl],
|
|
124
|
+
tileSize: validateRasterTileSize(options.tileSize ?? DEFAULT_RASTER_TILE_SIZE),
|
|
125
|
+
scheme: "xyz",
|
|
126
|
+
...(options.minzoom !== undefined ? { minzoom: options.minzoom } : {}),
|
|
127
|
+
...(options.maxzoom !== undefined ? { maxzoom: options.maxzoom } : {}),
|
|
128
|
+
...(descriptor.attribution ? { attribution: descriptor.attribution } : {}),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/** Return whether a URL is safe to embed in a browser-owned raster source. */
|
|
132
|
+
export function isSafeMapLibreRasterEndpoint(value) {
|
|
133
|
+
if (typeof value !== "string" || value.length === 0)
|
|
134
|
+
return false;
|
|
135
|
+
try {
|
|
136
|
+
const url = new URL(value);
|
|
137
|
+
if ((url.protocol !== "https:" && url.protocol !== "http:") || url.username || url.password || url.hash) {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
return [...url.searchParams.keys()].every((key) => !isCredentialQueryKey(key));
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** Validate a browser raster tileSize; WMS mirrors it into image dimensions. */
|
|
147
|
+
export function validateRasterTileSize(value) {
|
|
148
|
+
if (!Number.isSafeInteger(value) || value < 1 || value > MAX_RASTER_TILE_SIZE) {
|
|
149
|
+
throw new RangeError(`tileSize must be a safe integer from 1 through ${MAX_RASTER_TILE_SIZE}.`);
|
|
150
|
+
}
|
|
151
|
+
return value;
|
|
152
|
+
}
|
|
153
|
+
function requireSafeRasterLocatorUrl(descriptor, discoveredUrl) {
|
|
154
|
+
const value = discoveredUrl ?? descriptor.locator.url;
|
|
155
|
+
if (!isSafeMapLibreRasterEndpoint(value)) {
|
|
156
|
+
throw new TypeError(`descriptor for "${descriptor.id}" must use a credential-free HTTP(S) locator.url without a fragment`);
|
|
157
|
+
}
|
|
158
|
+
return new URL(value);
|
|
159
|
+
}
|
|
160
|
+
function isCredentialQueryKey(key) {
|
|
161
|
+
const normalized = key.replace(/[^A-Za-z0-9]/gu, "").toLowerCase();
|
|
162
|
+
return CREDENTIAL_QUERY_KEYS.has(normalized) || normalized.startsWith("xamz") || normalized.startsWith("xgoog");
|
|
163
|
+
}
|
|
164
|
+
function wmtsResourceTemplate(template, layer, style, tileMatrixSet, tileMatrix) {
|
|
165
|
+
return template
|
|
166
|
+
.replaceAll("{Layer}", encodeURIComponent(layer))
|
|
167
|
+
.replaceAll("{Style}", encodeURIComponent(style))
|
|
168
|
+
.replaceAll("{TileMatrixSet}", encodeURIComponent(tileMatrixSet))
|
|
169
|
+
.replaceAll("{TileMatrix}", encodeTemplateValue(tileMatrix))
|
|
170
|
+
.replaceAll("{TileRow}", "{y}")
|
|
171
|
+
.replaceAll("{TileCol}", "{x}");
|
|
172
|
+
}
|
|
173
|
+
function wmtsKvpTemplate(url, layer, style, tileMatrixSet, format, tileMatrix) {
|
|
174
|
+
const request = new URL(url);
|
|
175
|
+
for (const key of [...request.searchParams.keys()]) {
|
|
176
|
+
if (WMTS_REQUEST_KEYS.has(key.toUpperCase()))
|
|
177
|
+
request.searchParams.delete(key);
|
|
178
|
+
}
|
|
179
|
+
request.searchParams.set("SERVICE", "WMTS");
|
|
180
|
+
request.searchParams.set("VERSION", "1.0.0");
|
|
181
|
+
request.searchParams.set("REQUEST", "GetTile");
|
|
182
|
+
request.searchParams.set("LAYER", layer);
|
|
183
|
+
request.searchParams.set("STYLE", style);
|
|
184
|
+
request.searchParams.set("FORMAT", format);
|
|
185
|
+
request.searchParams.set("TILEMATRIXSET", tileMatrixSet);
|
|
186
|
+
return `${request.toString()}&TILEMATRIX=${encodeTemplateValue(tileMatrix)}&TILEROW={y}&TILECOL={x}`;
|
|
187
|
+
}
|
|
188
|
+
function encodeTemplateValue(value) {
|
|
189
|
+
return encodeURIComponent(value).replace(/%7Bz%7D/gi, "{z}");
|
|
190
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { SourceDescriptor } from "../contract/types.js";
|
|
2
|
+
import { type HonuaErrorOptions, HonuaSdkError } from "../core/error-envelope.js";
|
|
3
|
+
import { type MapLibreRasterSourceSpec } from "./raster-source-spec.js";
|
|
4
|
+
export type MapLibreRasterStrategy = "native-raster-tiles" | "wms-raster" | "wmts-raster";
|
|
5
|
+
export type MapLibreRasterWorkflowState = "ready" | "disposed";
|
|
6
|
+
export type MapLibreRasterDiagnosticCode = "strategy-selected" | "cleanup-failed";
|
|
7
|
+
export type MapLibreRasterStrategyErrorCode = "unsupported-strategy" | "capability-mismatch" | "missing-metadata" | "invalid-option" | "source-conflict" | "layer-conflict" | "map-mutation-failed";
|
|
8
|
+
export interface MapLibreRasterDiagnostic {
|
|
9
|
+
readonly code: MapLibreRasterDiagnosticCode;
|
|
10
|
+
readonly severity: "info" | "warning";
|
|
11
|
+
readonly stage: "project" | "dispose";
|
|
12
|
+
readonly fidelity: "exact" | "unsupported";
|
|
13
|
+
readonly sourceId: string;
|
|
14
|
+
readonly strategy: MapLibreRasterStrategy;
|
|
15
|
+
readonly message: string;
|
|
16
|
+
readonly detail?: Readonly<Record<string, unknown>>;
|
|
17
|
+
}
|
|
18
|
+
export declare class HonuaMapLibreRasterStrategyError extends HonuaSdkError {
|
|
19
|
+
readonly code: MapLibreRasterStrategyErrorCode;
|
|
20
|
+
readonly detail?: Readonly<Record<string, unknown>> | undefined;
|
|
21
|
+
constructor(code: MapLibreRasterStrategyErrorCode, message: string, detail?: Readonly<Record<string, unknown>> | undefined, options?: HonuaErrorOptions);
|
|
22
|
+
}
|
|
23
|
+
export interface ProjectRasterSourceToMapLibreOptions {
|
|
24
|
+
readonly sourceId?: string;
|
|
25
|
+
readonly layerId?: string;
|
|
26
|
+
readonly beforeId?: string;
|
|
27
|
+
readonly tileSize?: number;
|
|
28
|
+
readonly format?: string;
|
|
29
|
+
readonly transparent?: boolean;
|
|
30
|
+
readonly minzoom?: number;
|
|
31
|
+
readonly maxzoom?: number;
|
|
32
|
+
readonly paint?: Readonly<Record<string, unknown>>;
|
|
33
|
+
readonly layout?: Readonly<Record<string, unknown>>;
|
|
34
|
+
}
|
|
35
|
+
export interface MapLibreRasterProjection {
|
|
36
|
+
readonly strategy: MapLibreRasterStrategy;
|
|
37
|
+
readonly sourceId: string;
|
|
38
|
+
readonly layerId: string;
|
|
39
|
+
readonly source: MapLibreRasterSourceSpec;
|
|
40
|
+
readonly layer: Readonly<Record<string, unknown>>;
|
|
41
|
+
readonly diagnostics: readonly MapLibreRasterDiagnostic[];
|
|
42
|
+
readonly state: "ready";
|
|
43
|
+
}
|
|
44
|
+
/** Minimal peer-injected MapLibre surface used by the raster mount. */
|
|
45
|
+
export interface RasterSourceToMapLibreMap {
|
|
46
|
+
getSource(id: string): unknown;
|
|
47
|
+
addSource(id: string, source: unknown): void;
|
|
48
|
+
removeSource(id: string): void;
|
|
49
|
+
getLayer(id: string): unknown;
|
|
50
|
+
addLayer(layer: unknown, beforeId?: string): void;
|
|
51
|
+
removeLayer(id: string): void;
|
|
52
|
+
}
|
|
53
|
+
export interface MountedMapLibreRasterSource {
|
|
54
|
+
readonly strategy: MapLibreRasterStrategy;
|
|
55
|
+
readonly sourceId: string;
|
|
56
|
+
readonly layerId: string;
|
|
57
|
+
readonly state: MapLibreRasterWorkflowState;
|
|
58
|
+
readonly diagnostics: readonly MapLibreRasterDiagnostic[];
|
|
59
|
+
dispose(): void;
|
|
60
|
+
}
|
|
61
|
+
/** Select and project the exact raster strategy implied by source metadata. */
|
|
62
|
+
export declare function projectRasterSourceToMapLibre(descriptor: SourceDescriptor, options?: ProjectRasterSourceToMapLibreOptions): MapLibreRasterProjection;
|
|
63
|
+
/** Project and transactionally mount a metadata-selected raster source/layer. */
|
|
64
|
+
export declare function mountRasterSourceToMapLibre(map: RasterSourceToMapLibreMap, descriptor: SourceDescriptor, options?: ProjectRasterSourceToMapLibreOptions): MountedMapLibreRasterSource;
|
|
65
|
+
//# sourceMappingURL=raster-source-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raster-source-strategy.d.ts","sourceRoot":"","sources":["../../../src/map/raster-source-strategy.ts"],"names":[],"mappings":"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"}
|