@theseam/ui-common 0.2.17 → 0.3.2
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/breadcrumbs/_breadcrumbs-theme.scss +3 -0
- package/breadcrumbs/breadcrumbs/breadcrumbs.component.scss +10 -0
- package/breadcrumbs/styles/_utilities.scss +3 -0
- package/breadcrumbs/styles/_variables.scss +1 -0
- package/breadcrumbs/theseam-ui-common-breadcrumbs.metadata.json +1 -1
- package/bundles/theseam-ui-common-breadcrumbs.umd.js +2 -1
- package/bundles/theseam-ui-common-breadcrumbs.umd.js.map +1 -1
- package/bundles/theseam-ui-common-form-field.umd.js +1 -1
- package/bundles/theseam-ui-common-form-field.umd.js.map +1 -1
- package/bundles/theseam-ui-common-framework.umd.js +18 -15
- package/bundles/theseam-ui-common-framework.umd.js.map +1 -1
- package/bundles/theseam-ui-common-google-maps.umd.js +2202 -0
- package/bundles/theseam-ui-common-google-maps.umd.js.map +1 -0
- package/bundles/theseam-ui-common-menu.umd.js +1 -0
- package/bundles/theseam-ui-common-menu.umd.js.map +1 -1
- package/bundles/theseam-ui-common-scrollbar.umd.js +1 -1
- package/bundles/theseam-ui-common-scrollbar.umd.js.map +1 -1
- package/bundles/theseam-ui-common-tel-input.umd.js +59 -7
- package/bundles/theseam-ui-common-tel-input.umd.js.map +1 -1
- package/bundles/theseam-ui-common-utils.umd.js +610 -136
- package/bundles/theseam-ui-common-utils.umd.js.map +1 -1
- package/bundles/theseam-ui-common-viewers.umd.js +269 -4
- package/bundles/theseam-ui-common-viewers.umd.js.map +1 -1
- package/bundles/theseam-ui-common-widget.umd.js +1 -1
- package/esm2015/breadcrumbs/breadcrumbs/breadcrumbs.component.js +4 -3
- package/esm2015/form-field/input.directive.js +2 -2
- package/esm2015/framework/base-layout/base-layout.component.js +3 -3
- package/esm2015/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.js +5 -5
- package/esm2015/framework/top-bar/top-bar-title/top-bar-title.component.js +4 -3
- package/esm2015/framework/top-bar/top-bar.component.js +10 -8
- package/esm2015/google-maps/google-maps/google-maps.component.js +261 -0
- package/esm2015/google-maps/google-maps-contextmenu.js +113 -0
- package/esm2015/google-maps/google-maps-controls.service.js +70 -0
- package/esm2015/google-maps/google-maps-feature-helpers.js +177 -0
- package/esm2015/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.component.js +195 -0
- package/esm2015/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.directive.js +163 -0
- package/esm2015/google-maps/google-maps-recenter-button-control/google-maps-recenter-button-control.component.js +57 -0
- package/esm2015/google-maps/google-maps-upload-button-control/google-maps-upload-button-control.component.js +119 -0
- package/esm2015/google-maps/google-maps.module.js +45 -0
- package/esm2015/google-maps/google-maps.service.js +344 -0
- package/esm2015/google-maps/map-control.component.js +65 -0
- package/esm2015/google-maps/map-controls-service.js +4 -0
- package/esm2015/google-maps/map-file-drop/map-file-drop.component.js +135 -0
- package/esm2015/google-maps/map-value-manager.service.js +46 -0
- package/esm2015/google-maps/public-api.js +14 -0
- package/esm2015/google-maps/theseam-ui-common-google-maps.js +6 -0
- package/esm2015/menu/menu-toggle.directive.js +2 -1
- package/esm2015/scrollbar/overlay-scrollbar.directive.js +2 -2
- package/esm2015/tel-input/tel-input/tel-input.component.js +10 -2
- package/esm2015/tel-input/tel-input.directive.js +50 -5
- package/esm2015/utils/geo-json/coerce-feature-collection.js +44 -0
- package/esm2015/utils/geo-json/geo-json-to-area.js +11 -0
- package/esm2015/utils/geo-json/is-feature-collection.validator.js +21 -0
- package/esm2015/utils/geo-json/is-only-geometry-types.js +23 -0
- package/esm2015/utils/geo-json/is-only-geometry-types.validator.js +32 -0
- package/esm2015/utils/geo-json/merge-polygons.js +35 -0
- package/esm2015/utils/geo-json/no-inner-rings.validator.js +63 -0
- package/esm2015/utils/geo-json/no-kinks.validator.js +39 -0
- package/esm2015/utils/geo-json/read-geo-file.js +99 -0
- package/esm2015/utils/geo-json/split-multi-polygons.js +29 -0
- package/esm2015/utils/is-null-or-undefined.js +1 -1
- package/esm2015/utils/public-api.js +11 -1
- package/esm2015/viewers/html-template-viewer/html-template-viewer.component.js +219 -0
- package/esm2015/viewers/html-template-viewer/html-template-viewer.module.js +23 -0
- package/esm2015/viewers/html-template-viewer/index.js +3 -0
- package/esm2015/viewers/public-api.js +2 -1
- package/esm2015/widget/widget/widget.component.js +1 -1
- package/fesm2015/theseam-ui-common-breadcrumbs.js +3 -2
- package/fesm2015/theseam-ui-common-breadcrumbs.js.map +1 -1
- package/fesm2015/theseam-ui-common-form-field.js +1 -1
- package/fesm2015/theseam-ui-common-form-field.js.map +1 -1
- package/fesm2015/theseam-ui-common-framework.js +15 -12
- package/fesm2015/theseam-ui-common-framework.js.map +1 -1
- package/fesm2015/theseam-ui-common-google-maps.js +1729 -0
- package/fesm2015/theseam-ui-common-google-maps.js.map +1 -0
- package/fesm2015/theseam-ui-common-menu.js +1 -0
- package/fesm2015/theseam-ui-common-menu.js.map +1 -1
- package/fesm2015/theseam-ui-common-scrollbar.js +1 -1
- package/fesm2015/theseam-ui-common-scrollbar.js.map +1 -1
- package/fesm2015/theseam-ui-common-tel-input.js +58 -6
- package/fesm2015/theseam-ui-common-tel-input.js.map +1 -1
- package/fesm2015/theseam-ui-common-utils.js +477 -94
- package/fesm2015/theseam-ui-common-utils.js.map +1 -1
- package/fesm2015/theseam-ui-common-viewers.js +237 -2
- package/fesm2015/theseam-ui-common-viewers.js.map +1 -1
- package/fesm2015/theseam-ui-common-widget.js +1 -1
- package/form-field/theseam-ui-common-form-field.metadata.json +1 -1
- package/framework/base-layout/base-layout.component.scss +14 -0
- package/framework/base-layout/styles/_variables.scss +14 -0
- package/framework/theseam-ui-common-framework.metadata.json +1 -1
- package/framework/top-bar/_top-bar-theme.scss +5 -0
- package/framework/top-bar/styles/_utilities.scss +3 -0
- package/framework/top-bar/styles/_variables.scss +18 -0
- package/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.d.ts +3 -1
- package/framework/top-bar/top-bar-menu-button/top-bar-menu-button.component.scss +15 -0
- package/framework/top-bar/top-bar-title/top-bar-title.component.scss +6 -0
- package/framework/top-bar/top-bar.component.d.ts +3 -0
- package/framework/top-bar/top-bar.component.scss +39 -0
- package/google-maps/google-maps/google-maps.component.d.ts +89 -0
- package/google-maps/google-maps-contextmenu.d.ts +15 -0
- package/google-maps/google-maps-controls.service.d.ts +23 -0
- package/google-maps/google-maps-feature-helpers.d.ts +37 -0
- package/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.component.d.ts +104 -0
- package/google-maps/google-maps-places-autocomplete/google-maps-places-autocomplete.directive.d.ts +80 -0
- package/google-maps/google-maps-recenter-button-control/google-maps-recenter-button-control.component.d.ts +21 -0
- package/google-maps/google-maps-upload-button-control/google-maps-upload-button-control.component.d.ts +34 -0
- package/google-maps/google-maps.module.d.ts +2 -0
- package/google-maps/google-maps.service.d.ts +53 -0
- package/google-maps/map-control.component.d.ts +20 -0
- package/google-maps/map-controls-service.d.ts +13 -0
- package/google-maps/map-file-drop/map-file-drop.component.d.ts +34 -0
- package/google-maps/map-value-manager.service.d.ts +18 -0
- package/google-maps/package.json +11 -0
- package/google-maps/public-api.d.ts +13 -0
- package/google-maps/theseam-ui-common-google-maps.d.ts +5 -0
- package/google-maps/theseam-ui-common-google-maps.metadata.json +1 -0
- package/package.json +17 -10
- package/tel-input/tel-input.directive.d.ts +7 -3
- package/tel-input/theseam-ui-common-tel-input.metadata.json +1 -1
- package/utils/geo-json/coerce-feature-collection.d.ts +2 -0
- package/utils/geo-json/geo-json-to-area.d.ts +6 -0
- package/utils/geo-json/is-feature-collection.validator.d.ts +3 -0
- package/utils/geo-json/is-only-geometry-types.d.ts +5 -0
- package/utils/geo-json/is-only-geometry-types.validator.d.ts +4 -0
- package/utils/geo-json/merge-polygons.d.ts +9 -0
- package/utils/geo-json/no-inner-rings.validator.d.ts +10 -0
- package/utils/geo-json/no-kinks.validator.d.ts +3 -0
- package/utils/geo-json/read-geo-file.d.ts +7 -0
- package/utils/geo-json/split-multi-polygons.d.ts +8 -0
- package/utils/is-null-or-undefined.d.ts +1 -1
- package/utils/public-api.d.ts +10 -0
- package/utils/theseam-ui-common-utils.metadata.json +1 -1
- package/viewers/html-template-viewer/html-template-viewer.component.d.ts +67 -0
- package/viewers/html-template-viewer/html-template-viewer.module.d.ts +2 -0
- package/viewers/html-template-viewer/index.d.ts +2 -0
- package/viewers/public-api.d.ts +1 -0
- package/viewers/theseam-ui-common-viewers.metadata.json +1 -1
- package/widget/styles/_variables.scss +2 -0
- package/widget/theseam-ui-common-widget.metadata.json +1 -1
- package/widget/widget/widget.component.scss +2 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns true if the GeoJSON is only specifies geometries.
|
|
3
|
+
*/
|
|
4
|
+
export function isOnlyGeometryTypes(featureCollection, types) {
|
|
5
|
+
if (types.length === 0) {
|
|
6
|
+
if (featureCollection.features.length > 0) {
|
|
7
|
+
// If no types are specified then there can't be any specified types found.
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
// If no types are specified and there are no features then there is
|
|
12
|
+
// nothing to say a specified type isn't found.
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
for (const f of featureCollection.features) {
|
|
17
|
+
if (types.indexOf(f.geometry.type) === -1) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtb25seS1nZW9tZXRyeS10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi91dGlscy9nZW8tanNvbi9pcy1vbmx5LWdlb21ldHJ5LXR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOztHQUVHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLGlCQUFvQyxFQUFFLEtBQXlCO0lBQ2pHLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdEIsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6QywyRUFBMkU7WUFDM0UsT0FBTyxLQUFLLENBQUE7U0FDYjthQUFNO1lBQ0wsb0VBQW9FO1lBQ3BFLCtDQUErQztZQUMvQyxPQUFPLElBQUksQ0FBQTtTQUNaO0tBQ0Y7SUFFRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsRUFBRTtRQUMxQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN6QyxPQUFPLEtBQUssQ0FBQTtTQUNiO0tBQ0Y7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGZWF0dXJlQ29sbGVjdGlvbiwgR2VvbWV0cnkgfSBmcm9tICdnZW9qc29uJ1xyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgR2VvSlNPTiBpcyBvbmx5IHNwZWNpZmllcyBnZW9tZXRyaWVzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seUdlb21ldHJ5VHlwZXMoZmVhdHVyZUNvbGxlY3Rpb246IEZlYXR1cmVDb2xsZWN0aW9uLCB0eXBlczogR2VvbWV0cnlbJ3R5cGUnXVtdKTogYm9vbGVhbiB7XHJcbiAgaWYgKHR5cGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgaWYgKGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gSWYgbm8gdHlwZXMgYXJlIHNwZWNpZmllZCB0aGVuIHRoZXJlIGNhbid0IGJlIGFueSBzcGVjaWZpZWQgdHlwZXMgZm91bmQuXHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gSWYgbm8gdHlwZXMgYXJlIHNwZWNpZmllZCBhbmQgdGhlcmUgYXJlIG5vIGZlYXR1cmVzIHRoZW4gdGhlcmUgaXNcclxuICAgICAgLy8gbm90aGluZyB0byBzYXkgYSBzcGVjaWZpZWQgdHlwZSBpc24ndCBmb3VuZC5cclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZvciAoY29uc3QgZiBvZiBmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcykge1xyXG4gICAgaWYgKHR5cGVzLmluZGV4T2YoZi5nZW9tZXRyeS50eXBlKSA9PT0gLTEpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { isEmptyInputValue } from '../form/is-empty-input-value';
|
|
2
|
+
import { coerceFeatureCollection } from './coerce-feature-collection';
|
|
3
|
+
import { isOnlyGeometryTypes } from './is-only-geometry-types';
|
|
4
|
+
export const IS_ONLY_GEOMETRY_TYPES_VALIDATOR_NAME = 'is-only-geometry-types';
|
|
5
|
+
export function isOnlyGeometryTypesValidator(types) {
|
|
6
|
+
return (control) => {
|
|
7
|
+
// Don't need to validate if there isn't a value. Use `Validators.required` for that.
|
|
8
|
+
if (isEmptyInputValue(control.value)) {
|
|
9
|
+
return null; // don't validate empty values to allow optional controls
|
|
10
|
+
}
|
|
11
|
+
const value = coerceFeatureCollection(control.value);
|
|
12
|
+
if (value === null) {
|
|
13
|
+
// If there isn't a FeatureCollection then there is nothing to validate.
|
|
14
|
+
// Use 'isFeatureCollection' to validate the value is a FeatureCollection.
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
if (!isOnlyGeometryTypes(value, types)) {
|
|
18
|
+
const typesNotAllowed = value.features
|
|
19
|
+
.map(f => f.geometry.type)
|
|
20
|
+
.filter(t => types.indexOf(t) === -1);
|
|
21
|
+
const distinctTypesNotAllowed = Array.from(new Set(typesNotAllowed));
|
|
22
|
+
return {
|
|
23
|
+
[IS_ONLY_GEOMETRY_TYPES_VALIDATOR_NAME]: {
|
|
24
|
+
reason: `Only geometry type${(types.length === 1 ? '' : 's')} ${types.join(', ')} allowed.`,
|
|
25
|
+
notAllowedGeometryTypesFound: distinctTypesNotAllowed,
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtb25seS1nZW9tZXRyeS10eXBlcy52YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vdXRpbHMvZ2VvLWpzb24vaXMtb25seS1nZW9tZXRyeS10eXBlcy52YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDaEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFOUQsTUFBTSxDQUFDLE1BQU0scUNBQXFDLEdBQUcsd0JBQXdCLENBQUE7QUFFN0UsTUFBTSxVQUFVLDRCQUE0QixDQUFDLEtBQXlCO0lBQ3BFLE9BQU8sQ0FBQyxPQUF3QixFQUFFLEVBQUU7UUFDbEMscUZBQXFGO1FBQ3JGLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLE9BQU8sSUFBSSxDQUFBLENBQUMseURBQXlEO1NBQ3RFO1FBRUQsTUFBTSxLQUFLLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXBELElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsQix3RUFBd0U7WUFDeEUsMEVBQTBFO1lBQzFFLE9BQU8sSUFBSSxDQUFBO1NBQ1o7UUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxRQUFRO2lCQUNuQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztpQkFDekIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3ZDLE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFBO1lBQ3BFLE9BQU87Z0JBQ0wsQ0FBQyxxQ0FBcUMsQ0FBQyxFQUFFO29CQUN2QyxNQUFNLEVBQUUscUJBQXFCLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVztvQkFDM0YsNEJBQTRCLEVBQUUsdUJBQXVCO2lCQUN0RDthQUNGLENBQUE7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQyxDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3JtcydcclxuXHJcbmltcG9ydCB7IEdlb21ldHJ5IH0gZnJvbSAnZ2VvanNvbidcclxuXHJcbmltcG9ydCB7IGlzRW1wdHlJbnB1dFZhbHVlIH0gZnJvbSAnLi4vZm9ybS9pcy1lbXB0eS1pbnB1dC12YWx1ZSdcclxuaW1wb3J0IHsgY29lcmNlRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvZXJjZS1mZWF0dXJlLWNvbGxlY3Rpb24nXHJcbmltcG9ydCB7IGlzT25seUdlb21ldHJ5VHlwZXMgfSBmcm9tICcuL2lzLW9ubHktZ2VvbWV0cnktdHlwZXMnXHJcblxyXG5leHBvcnQgY29uc3QgSVNfT05MWV9HRU9NRVRSWV9UWVBFU19WQUxJREFUT1JfTkFNRSA9ICdpcy1vbmx5LWdlb21ldHJ5LXR5cGVzJ1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzT25seUdlb21ldHJ5VHlwZXNWYWxpZGF0b3IodHlwZXM6IEdlb21ldHJ5Wyd0eXBlJ11bXSk6IFZhbGlkYXRvckZuIHtcclxuICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgLy8gRG9uJ3QgbmVlZCB0byB2YWxpZGF0ZSBpZiB0aGVyZSBpc24ndCBhIHZhbHVlLiBVc2UgYFZhbGlkYXRvcnMucmVxdWlyZWRgIGZvciB0aGF0LlxyXG4gICAgaWYgKGlzRW1wdHlJbnB1dFZhbHVlKGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiBudWxsIC8vIGRvbid0IHZhbGlkYXRlIGVtcHR5IHZhbHVlcyB0byBhbGxvdyBvcHRpb25hbCBjb250cm9sc1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZhbHVlID0gY29lcmNlRmVhdHVyZUNvbGxlY3Rpb24oY29udHJvbC52YWx1ZSlcclxuXHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgLy8gSWYgdGhlcmUgaXNuJ3QgYSBGZWF0dXJlQ29sbGVjdGlvbiB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gdmFsaWRhdGUuXHJcbiAgICAgIC8vIFVzZSAnaXNGZWF0dXJlQ29sbGVjdGlvbicgdG8gdmFsaWRhdGUgdGhlIHZhbHVlIGlzIGEgRmVhdHVyZUNvbGxlY3Rpb24uXHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFpc09ubHlHZW9tZXRyeVR5cGVzKHZhbHVlLCB0eXBlcykpIHtcclxuICAgICAgY29uc3QgdHlwZXNOb3RBbGxvd2VkID0gdmFsdWUuZmVhdHVyZXNcclxuICAgICAgICAubWFwKGYgPT4gZi5nZW9tZXRyeS50eXBlKVxyXG4gICAgICAgIC5maWx0ZXIodCA9PiB0eXBlcy5pbmRleE9mKHQpID09PSAtMSlcclxuICAgICAgY29uc3QgZGlzdGluY3RUeXBlc05vdEFsbG93ZWQgPSBBcnJheS5mcm9tKG5ldyBTZXQodHlwZXNOb3RBbGxvd2VkKSlcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBbSVNfT05MWV9HRU9NRVRSWV9UWVBFU19WQUxJREFUT1JfTkFNRV06IHtcclxuICAgICAgICAgIHJlYXNvbjogYE9ubHkgZ2VvbWV0cnkgdHlwZSR7KHR5cGVzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnKX0gJHt0eXBlcy5qb2luKCcsICcpfSBhbGxvd2VkLmAsXHJcbiAgICAgICAgICBub3RBbGxvd2VkR2VvbWV0cnlUeXBlc0ZvdW5kOiBkaXN0aW5jdFR5cGVzTm90QWxsb3dlZCxcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxufVxyXG5cclxuXHJcbiJdfQ==
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge Polygon and MultiPolygon geometries into a single MultiPolygon. Any
|
|
3
|
+
* properties, other than 'coordinates', of the Polygons and MultiPolygons will
|
|
4
|
+
* be lost.
|
|
5
|
+
*
|
|
6
|
+
* NOTE: Polygons and MultPolygons in a GeometryCollection will not be merged.
|
|
7
|
+
*/
|
|
8
|
+
export function mergePolygons(featureCollection) {
|
|
9
|
+
const multiPolygon = {
|
|
10
|
+
type: 'MultiPolygon',
|
|
11
|
+
coordinates: [],
|
|
12
|
+
};
|
|
13
|
+
for (let i = 0; i < featureCollection.features.length; i++) {
|
|
14
|
+
const f = featureCollection.features[i];
|
|
15
|
+
if (f.geometry.type === 'Polygon') {
|
|
16
|
+
multiPolygon.coordinates.push(f.geometry.coordinates);
|
|
17
|
+
featureCollection.features.splice(i, 1);
|
|
18
|
+
i--;
|
|
19
|
+
}
|
|
20
|
+
else if (f.geometry.type === 'MultiPolygon') {
|
|
21
|
+
multiPolygon.coordinates.push(...f.geometry.coordinates);
|
|
22
|
+
featureCollection.features.splice(i, 1);
|
|
23
|
+
i--;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (multiPolygon.coordinates.length > 0) {
|
|
27
|
+
const feature = {
|
|
28
|
+
type: 'Feature',
|
|
29
|
+
geometry: multiPolygon,
|
|
30
|
+
properties: {},
|
|
31
|
+
};
|
|
32
|
+
featureCollection.features.push(feature);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2UtcG9seWdvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vdXRpbHMvZ2VvLWpzb24vbWVyZ2UtcG9seWdvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUE7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxpQkFBb0M7SUFDaEUsTUFBTSxZQUFZLEdBQWlCO1FBQ2pDLElBQUksRUFBRSxjQUFjO1FBQ3BCLFdBQVcsRUFBRSxFQUFFO0tBQ2hCLENBQUE7SUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxRCxNQUFNLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDakMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUNyRCxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtZQUN2QyxDQUFDLEVBQUUsQ0FBQTtTQUNKO2FBQU0sSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxjQUFjLEVBQUU7WUFDN0MsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQ3hELGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ3ZDLENBQUMsRUFBRSxDQUFBO1NBQ0o7S0FDRjtJQUVELElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3ZDLE1BQU0sT0FBTyxHQUFZO1lBQ3ZCLElBQUksRUFBRSxTQUFTO1lBQ2YsUUFBUSxFQUFFLFlBQVk7WUFDdEIsVUFBVSxFQUFFLEVBQUc7U0FDaEIsQ0FBQTtRQUNELGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7S0FDekM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBGZWF0dXJlLFxyXG4gIEZlYXR1cmVDb2xsZWN0aW9uLFxyXG4gIE11bHRpUG9seWdvbixcclxufSBmcm9tICdnZW9qc29uJ1xyXG5cclxuLyoqXHJcbiAqIE1lcmdlIFBvbHlnb24gYW5kIE11bHRpUG9seWdvbiBnZW9tZXRyaWVzIGludG8gYSBzaW5nbGUgTXVsdGlQb2x5Z29uLiBBbnlcclxuICogcHJvcGVydGllcywgb3RoZXIgdGhhbiAnY29vcmRpbmF0ZXMnLCBvZiB0aGUgUG9seWdvbnMgYW5kIE11bHRpUG9seWdvbnMgd2lsbFxyXG4gKiBiZSBsb3N0LlxyXG4gKlxyXG4gKiBOT1RFOiBQb2x5Z29ucyBhbmQgTXVsdFBvbHlnb25zIGluIGEgR2VvbWV0cnlDb2xsZWN0aW9uIHdpbGwgbm90IGJlIG1lcmdlZC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVBvbHlnb25zKGZlYXR1cmVDb2xsZWN0aW9uOiBGZWF0dXJlQ29sbGVjdGlvbik6IHZvaWQge1xyXG4gIGNvbnN0IG11bHRpUG9seWdvbjogTXVsdGlQb2x5Z29uID0ge1xyXG4gICAgdHlwZTogJ011bHRpUG9seWdvbicsXHJcbiAgICBjb29yZGluYXRlczogW10sXHJcbiAgfVxyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBjb25zdCBmID0gZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXNbaV1cclxuICAgIGlmIChmLmdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJykge1xyXG4gICAgICBtdWx0aVBvbHlnb24uY29vcmRpbmF0ZXMucHVzaChmLmdlb21ldHJ5LmNvb3JkaW5hdGVzKVxyXG4gICAgICBmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcy5zcGxpY2UoaSwgMSlcclxuICAgICAgaS0tXHJcbiAgICB9IGVsc2UgaWYgKGYuZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcclxuICAgICAgbXVsdGlQb2x5Z29uLmNvb3JkaW5hdGVzLnB1c2goLi4uZi5nZW9tZXRyeS5jb29yZGluYXRlcylcclxuICAgICAgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMuc3BsaWNlKGksIDEpXHJcbiAgICAgIGktLVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaWYgKG11bHRpUG9seWdvbi5jb29yZGluYXRlcy5sZW5ndGggPiAwKSB7XHJcbiAgICBjb25zdCBmZWF0dXJlOiBGZWF0dXJlID0ge1xyXG4gICAgICB0eXBlOiAnRmVhdHVyZScsXHJcbiAgICAgIGdlb21ldHJ5OiBtdWx0aVBvbHlnb24sXHJcbiAgICAgIHByb3BlcnRpZXM6IHsgfSxcclxuICAgIH1cclxuICAgIGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzLnB1c2goZmVhdHVyZSlcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { isEmptyInputValue } from '../form/is-empty-input-value';
|
|
2
|
+
import { coerceFeatureCollection } from './coerce-feature-collection';
|
|
3
|
+
export const NO_INNER_RINGS_VALIDATOR_NAME = 'no-inner-rings';
|
|
4
|
+
/**
|
|
5
|
+
* Validates that a FeatureCollection does not contain any Polygon with inner
|
|
6
|
+
* rings("holes").
|
|
7
|
+
*
|
|
8
|
+
* NOTE: Only considers Polygon and MultiPolygon. Does not consider
|
|
9
|
+
* GeometryCollection.
|
|
10
|
+
*/
|
|
11
|
+
export function noInnerRingsValidator() {
|
|
12
|
+
return (control) => {
|
|
13
|
+
// Don't need to validate if there isn't a value. Use `Validators.required` for that.
|
|
14
|
+
if (isEmptyInputValue(control.value)) {
|
|
15
|
+
return null; // don't validate empty values to allow optional controls
|
|
16
|
+
}
|
|
17
|
+
const value = coerceFeatureCollection(control.value);
|
|
18
|
+
if (value === null) {
|
|
19
|
+
// If there isn't a FeatureCollection then there is nothing to validate.
|
|
20
|
+
// Use 'isFeatureCollection' to validate the value is a FeatureCollection.
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
if (hasInnerRing(value)) {
|
|
24
|
+
return {
|
|
25
|
+
[NO_INNER_RINGS_VALIDATOR_NAME]: {
|
|
26
|
+
reason: `A shape cannot have an inner ring.`
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Checks if a FeatureCollection contains any geometries with an inner
|
|
35
|
+
* ring("hole").
|
|
36
|
+
*
|
|
37
|
+
* NOTE: Does not consider GeometryCollection.
|
|
38
|
+
*/
|
|
39
|
+
function hasInnerRing(featureCollection) {
|
|
40
|
+
for (const f of featureCollection.features) {
|
|
41
|
+
// The spec says the right-hand rule must be followed, but also specifies
|
|
42
|
+
// that tools should not reject polygons that do not follow the right-hand
|
|
43
|
+
// rule. It does specify that the first ring must be the exterior ring and
|
|
44
|
+
// the others must be the interior. So, this should be safe to just check
|
|
45
|
+
// if there are multiple rings, instead of checking their winding orders.
|
|
46
|
+
//
|
|
47
|
+
// Polygon spec: https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.6
|
|
48
|
+
if (f.geometry.type === 'Polygon') {
|
|
49
|
+
if (f.geometry.coordinates.length > 1) {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else if (f.geometry.type === 'MultiPolygon') {
|
|
54
|
+
for (const coords of f.geometry.coordinates) {
|
|
55
|
+
if (coords.length > 1) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8taW5uZXItcmluZ3MudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tbW9uL3V0aWxzL2dlby1qc29uL25vLWlubmVyLXJpbmdzLnZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUNoRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQTtBQUVyRSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxnQkFBZ0IsQ0FBQTtBQUU3RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLE9BQU8sQ0FBQyxPQUF3QixFQUFFLEVBQUU7UUFDbEMscUZBQXFGO1FBQ3JGLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3BDLE9BQU8sSUFBSSxDQUFBLENBQUMseURBQXlEO1NBQ3RFO1FBRUQsTUFBTSxLQUFLLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXBELElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsQix3RUFBd0U7WUFDeEUsMEVBQTBFO1lBQzFFLE9BQU8sSUFBSSxDQUFBO1NBQ1o7UUFFRCxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN2QixPQUFPO2dCQUNMLENBQUMsNkJBQTZCLENBQUMsRUFBRTtvQkFDL0IsTUFBTSxFQUFFLG9DQUFvQztpQkFDN0M7YUFDRixDQUFBO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUMsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsWUFBWSxDQUFDLGlCQUFvQztJQUN4RCxLQUFLLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsRUFBRTtRQUMxQyx5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLDBFQUEwRTtRQUMxRSx5RUFBeUU7UUFDekUseUVBQXlFO1FBQ3pFLEVBQUU7UUFDRiw0RUFBNEU7UUFDNUUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDakMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQyxPQUFPLElBQUksQ0FBQTthQUNaO1NBQ0Y7YUFBTSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRTtZQUM3QyxLQUFLLE1BQU0sTUFBTSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFO2dCQUMzQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNyQixPQUFPLElBQUksQ0FBQTtpQkFDWjthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3JtcydcclxuXHJcbmltcG9ydCB7IEZlYXR1cmVDb2xsZWN0aW9uIH0gZnJvbSAnZ2VvanNvbidcclxuXHJcbmltcG9ydCB7IGlzRW1wdHlJbnB1dFZhbHVlIH0gZnJvbSAnLi4vZm9ybS9pcy1lbXB0eS1pbnB1dC12YWx1ZSdcclxuaW1wb3J0IHsgY29lcmNlRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvZXJjZS1mZWF0dXJlLWNvbGxlY3Rpb24nXHJcblxyXG5leHBvcnQgY29uc3QgTk9fSU5ORVJfUklOR1NfVkFMSURBVE9SX05BTUUgPSAnbm8taW5uZXItcmluZ3MnXHJcblxyXG4vKipcclxuICogVmFsaWRhdGVzIHRoYXQgYSBGZWF0dXJlQ29sbGVjdGlvbiBkb2VzIG5vdCBjb250YWluIGFueSBQb2x5Z29uIHdpdGggaW5uZXJcclxuICogcmluZ3MoXCJob2xlc1wiKS5cclxuICpcclxuICogTk9URTogT25seSBjb25zaWRlcnMgUG9seWdvbiBhbmQgTXVsdGlQb2x5Z29uLiBEb2VzIG5vdCBjb25zaWRlclxyXG4gKiBHZW9tZXRyeUNvbGxlY3Rpb24uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbm9Jbm5lclJpbmdzVmFsaWRhdG9yKCk6IFZhbGlkYXRvckZuIHtcclxuICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgLy8gRG9uJ3QgbmVlZCB0byB2YWxpZGF0ZSBpZiB0aGVyZSBpc24ndCBhIHZhbHVlLiBVc2UgYFZhbGlkYXRvcnMucmVxdWlyZWRgIGZvciB0aGF0LlxyXG4gICAgaWYgKGlzRW1wdHlJbnB1dFZhbHVlKGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiBudWxsIC8vIGRvbid0IHZhbGlkYXRlIGVtcHR5IHZhbHVlcyB0byBhbGxvdyBvcHRpb25hbCBjb250cm9sc1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZhbHVlID0gY29lcmNlRmVhdHVyZUNvbGxlY3Rpb24oY29udHJvbC52YWx1ZSlcclxuXHJcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgLy8gSWYgdGhlcmUgaXNuJ3QgYSBGZWF0dXJlQ29sbGVjdGlvbiB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gdmFsaWRhdGUuXHJcbiAgICAgIC8vIFVzZSAnaXNGZWF0dXJlQ29sbGVjdGlvbicgdG8gdmFsaWRhdGUgdGhlIHZhbHVlIGlzIGEgRmVhdHVyZUNvbGxlY3Rpb24uXHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhhc0lubmVyUmluZyh2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBbTk9fSU5ORVJfUklOR1NfVkFMSURBVE9SX05BTUVdOiB7XHJcbiAgICAgICAgICByZWFzb246IGBBIHNoYXBlIGNhbm5vdCBoYXZlIGFuIGlubmVyIHJpbmcuYFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2tzIGlmIGEgRmVhdHVyZUNvbGxlY3Rpb24gY29udGFpbnMgYW55IGdlb21ldHJpZXMgd2l0aCBhbiBpbm5lclxyXG4gKiByaW5nKFwiaG9sZVwiKS5cclxuICpcclxuICogTk9URTogRG9lcyBub3QgY29uc2lkZXIgR2VvbWV0cnlDb2xsZWN0aW9uLlxyXG4gKi9cclxuZnVuY3Rpb24gaGFzSW5uZXJSaW5nKGZlYXR1cmVDb2xsZWN0aW9uOiBGZWF0dXJlQ29sbGVjdGlvbik6IGJvb2xlYW4ge1xyXG4gIGZvciAoY29uc3QgZiBvZiBmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlcykge1xyXG4gICAgLy8gVGhlIHNwZWMgc2F5cyB0aGUgcmlnaHQtaGFuZCBydWxlIG11c3QgYmUgZm9sbG93ZWQsIGJ1dCBhbHNvIHNwZWNpZmllc1xyXG4gICAgLy8gdGhhdCB0b29scyBzaG91bGQgbm90IHJlamVjdCBwb2x5Z29ucyB0aGF0IGRvIG5vdCBmb2xsb3cgdGhlIHJpZ2h0LWhhbmRcclxuICAgIC8vIHJ1bGUuIEl0IGRvZXMgc3BlY2lmeSB0aGF0IHRoZSBmaXJzdCByaW5nIG11c3QgYmUgdGhlIGV4dGVyaW9yIHJpbmcgYW5kXHJcbiAgICAvLyB0aGUgb3RoZXJzIG11c3QgYmUgdGhlIGludGVyaW9yLiBTbywgdGhpcyBzaG91bGQgYmUgc2FmZSB0byBqdXN0IGNoZWNrXHJcbiAgICAvLyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgcmluZ3MsIGluc3RlYWQgb2YgY2hlY2tpbmcgdGhlaXIgd2luZGluZyBvcmRlcnMuXHJcbiAgICAvL1xyXG4gICAgLy8gUG9seWdvbiBzcGVjOiBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzc5NDYjc2VjdGlvbi0zLjEuNlxyXG4gICAgaWYgKGYuZ2VvbWV0cnkudHlwZSA9PT0gJ1BvbHlnb24nKSB7XHJcbiAgICAgIGlmIChmLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGYuZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcclxuICAgICAgZm9yIChjb25zdCBjb29yZHMgb2YgZi5nZW9tZXRyeS5jb29yZGluYXRlcykge1xyXG4gICAgICAgIGlmIChjb29yZHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import kinks from '@turf/kinks';
|
|
2
|
+
import { isEmptyInputValue } from '../form/is-empty-input-value';
|
|
3
|
+
import { coerceFeatureCollection } from './coerce-feature-collection';
|
|
4
|
+
const kinkableGeometryTypes = ['LineString', 'MultiLineString', 'MultiPolygon', 'Polygon'];
|
|
5
|
+
export const NO_KINKS_VALIDATOR_NAME = 'no-kinks';
|
|
6
|
+
export function noKinksValidator() {
|
|
7
|
+
return (control) => {
|
|
8
|
+
// Don't need to validate if there isn't a value. Use `Validators.required` for that.
|
|
9
|
+
if (isEmptyInputValue(control.value)) {
|
|
10
|
+
return null; // don't validate empty values to allow optional controls
|
|
11
|
+
}
|
|
12
|
+
const value = coerceFeatureCollection(control.value);
|
|
13
|
+
if (value === null) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const kinksFound = [];
|
|
17
|
+
for (const f of value.features) {
|
|
18
|
+
if (kinkableGeometryTypes.indexOf(f.geometry.type) !== -1) {
|
|
19
|
+
const _kinks = kinks(f);
|
|
20
|
+
if (_kinks.features.length > 0) {
|
|
21
|
+
kinksFound.push({
|
|
22
|
+
feature: f,
|
|
23
|
+
kinks: _kinks,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (kinksFound.length > 0) {
|
|
29
|
+
return {
|
|
30
|
+
[NO_KINKS_VALIDATOR_NAME]: {
|
|
31
|
+
reason: 'Paths should not intersect themself.',
|
|
32
|
+
featuresWithKink: kinksFound,
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8ta2lua3MudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tbW9uL3V0aWxzL2dlby1qc29uL25vLWtpbmtzLnZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssTUFBTSxhQUFhLENBQUE7QUFHL0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDaEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFFckUsTUFBTSxxQkFBcUIsR0FBRyxDQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsU0FBUyxDQUFFLENBQUE7QUFFNUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsVUFBVSxDQUFBO0FBRWpELE1BQU0sVUFBVSxnQkFBZ0I7SUFDOUIsT0FBTyxDQUFDLE9BQXdCLEVBQUUsRUFBRTtRQUNsQyxxRkFBcUY7UUFDckYsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDcEMsT0FBTyxJQUFJLENBQUEsQ0FBQyx5REFBeUQ7U0FDdEU7UUFFRCxNQUFNLEtBQUssR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFcEQsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQ2xCLE9BQU8sSUFBSSxDQUFBO1NBQ1o7UUFFRCxNQUFNLFVBQVUsR0FBcUQsRUFBRSxDQUFBO1FBQ3ZFLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUM5QixJQUFJLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUN6RCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBUSxDQUFDLENBQUE7Z0JBQzlCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUM5QixVQUFVLENBQUMsSUFBSSxDQUFDO3dCQUNkLE9BQU8sRUFBRSxDQUFDO3dCQUNWLEtBQUssRUFBRSxNQUFNO3FCQUNkLENBQUMsQ0FBQTtpQkFDSDthQUNGO1NBQ0Y7UUFFRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLE9BQU87Z0JBQ0wsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFO29CQUN6QixNQUFNLEVBQUUsc0NBQXNDO29CQUM5QyxnQkFBZ0IsRUFBRSxVQUFVO2lCQUM3QjthQUNGLENBQUE7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQyxDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3JtcydcclxuXHJcbmltcG9ydCBraW5rcyBmcm9tICdAdHVyZi9raW5rcydcclxuaW1wb3J0IHsgRmVhdHVyZSwgRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICdnZW9qc29uJ1xyXG5cclxuaW1wb3J0IHsgaXNFbXB0eUlucHV0VmFsdWUgfSBmcm9tICcuLi9mb3JtL2lzLWVtcHR5LWlucHV0LXZhbHVlJ1xyXG5pbXBvcnQgeyBjb2VyY2VGZWF0dXJlQ29sbGVjdGlvbiB9IGZyb20gJy4vY29lcmNlLWZlYXR1cmUtY29sbGVjdGlvbidcclxuXHJcbmNvbnN0IGtpbmthYmxlR2VvbWV0cnlUeXBlcyA9IFsgJ0xpbmVTdHJpbmcnLCAnTXVsdGlMaW5lU3RyaW5nJywgJ011bHRpUG9seWdvbicsICdQb2x5Z29uJyBdXHJcblxyXG5leHBvcnQgY29uc3QgTk9fS0lOS1NfVkFMSURBVE9SX05BTUUgPSAnbm8ta2lua3MnXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbm9LaW5rc1ZhbGlkYXRvcigpOiBWYWxpZGF0b3JGbiB7XHJcbiAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgIC8vIERvbid0IG5lZWQgdG8gdmFsaWRhdGUgaWYgdGhlcmUgaXNuJ3QgYSB2YWx1ZS4gVXNlIGBWYWxpZGF0b3JzLnJlcXVpcmVkYCBmb3IgdGhhdC5cclxuICAgIGlmIChpc0VtcHR5SW5wdXRWYWx1ZShjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gbnVsbCAvLyBkb24ndCB2YWxpZGF0ZSBlbXB0eSB2YWx1ZXMgdG8gYWxsb3cgb3B0aW9uYWwgY29udHJvbHNcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IGNvZXJjZUZlYXR1cmVDb2xsZWN0aW9uKGNvbnRyb2wudmFsdWUpXHJcblxyXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qga2lua3NGb3VuZDogeyBmZWF0dXJlOiBGZWF0dXJlLCBraW5rczogRmVhdHVyZUNvbGxlY3Rpb24gfVtdID0gW11cclxuICAgIGZvciAoY29uc3QgZiBvZiB2YWx1ZS5mZWF0dXJlcykge1xyXG4gICAgICBpZiAoa2lua2FibGVHZW9tZXRyeVR5cGVzLmluZGV4T2YoZi5nZW9tZXRyeS50eXBlKSAhPT0gLTEpIHtcclxuICAgICAgICBjb25zdCBfa2lua3MgPSBraW5rcyhmIGFzIGFueSlcclxuICAgICAgICBpZiAoX2tpbmtzLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGtpbmtzRm91bmQucHVzaCh7XHJcbiAgICAgICAgICAgIGZlYXR1cmU6IGYsXHJcbiAgICAgICAgICAgIGtpbmtzOiBfa2lua3MsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChraW5rc0ZvdW5kLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBbTk9fS0lOS1NfVkFMSURBVE9SX05BTUVdOiB7XHJcbiAgICAgICAgICByZWFzb246ICdQYXRocyBzaG91bGQgbm90IGludGVyc2VjdCB0aGVtc2VsZi4nLFxyXG4gICAgICAgICAgZmVhdHVyZXNXaXRoS2luazoga2lua3NGb3VuZCxcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { isDevMode } from '@angular/core';
|
|
3
|
+
import fileType from '@marklb/file-type';
|
|
4
|
+
const Buffer = require('buffer/').Buffer;
|
|
5
|
+
import shp from 'shpjs';
|
|
6
|
+
import { readFileAsync } from '../file-utils';
|
|
7
|
+
import { withoutProperty } from '../obj-utils';
|
|
8
|
+
/**
|
|
9
|
+
* Reads a File, or buffer of file content, in GeoJSON or ESRI Shapefile format
|
|
10
|
+
* and returns a GeoJSON `FeatureCollection`.
|
|
11
|
+
*/
|
|
12
|
+
export function readGeoFile(fileOrBuffer) {
|
|
13
|
+
var _a;
|
|
14
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
15
|
+
const buffer = yield coerceFileOrBufferToBuffer(fileOrBuffer);
|
|
16
|
+
if (isShpFile(buffer)) {
|
|
17
|
+
return yield parseShpFile(buffer);
|
|
18
|
+
}
|
|
19
|
+
else if (((_a = fileType(buffer)) === null || _a === void 0 ? void 0 : _a.mime) === 'application/zip') {
|
|
20
|
+
try {
|
|
21
|
+
return yield parseShpZip(buffer);
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
// NOTE: If 'shpjs' updates or we switch to a fork, where it doesn't use
|
|
25
|
+
// node buffers, then we can remove this rethrow.
|
|
26
|
+
if (isDevMode()) {
|
|
27
|
+
if (e.message === 'nodebuffer is not supported by this platform') {
|
|
28
|
+
console.warn('Try adding Buffer polyfill.\n' +
|
|
29
|
+
'Install: npm install buffer\n' +
|
|
30
|
+
'Add `global.Buffer = global.Buffer || require(\'buffer\').Buffer` to "src/polyfills.ts"');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
throw e;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return parseGeoJson(buffer);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function coerceFileOrBufferToBuffer(fileOrBuffer) {
|
|
40
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
+
if (fileOrBuffer instanceof File) {
|
|
42
|
+
const arrBuf = yield readFileAsync(fileOrBuffer);
|
|
43
|
+
return Buffer.from(arrBuf);
|
|
44
|
+
}
|
|
45
|
+
return Buffer.from(fileOrBuffer);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// NOTE: Our current version of file-type does not detect shp files. We can
|
|
49
|
+
// remove this function when file-types is upgraded.
|
|
50
|
+
function isShpFile(buffer) {
|
|
51
|
+
const header = [0x27, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
|
|
52
|
+
const offset = 2;
|
|
53
|
+
if (buffer.length < (header.length + offset)) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
for (let i = 0; i < header.length; i++) {
|
|
57
|
+
if (header[i] !== buffer[i + offset]) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
function parseShpFile(buffer) {
|
|
64
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
+
const geometries = yield shp.parseShp(buffer, undefined);
|
|
66
|
+
const featCollection = {
|
|
67
|
+
type: 'FeatureCollection',
|
|
68
|
+
features: geometries.map(geom => ({
|
|
69
|
+
type: 'Feature',
|
|
70
|
+
geometry: geom,
|
|
71
|
+
properties: {}
|
|
72
|
+
}))
|
|
73
|
+
};
|
|
74
|
+
return featCollection;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function parseShpZip(buffer) {
|
|
78
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
+
let featCollection = yield shp.parseZip(buffer, undefined);
|
|
80
|
+
if (Array.isArray(featCollection)) {
|
|
81
|
+
if (featCollection.length === 0) {
|
|
82
|
+
throw Error(`Shape data not found.`);
|
|
83
|
+
}
|
|
84
|
+
else if (featCollection.length > 1) {
|
|
85
|
+
throw Error(`Multiple shape files not supported.`);
|
|
86
|
+
}
|
|
87
|
+
featCollection = featCollection[0];
|
|
88
|
+
}
|
|
89
|
+
return withoutProperty(featCollection, 'fileName');
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function parseGeoJson(buffer) {
|
|
93
|
+
const json = JSON.parse(buffer.toString());
|
|
94
|
+
if ((json === null || json === void 0 ? void 0 : json.type) === 'FeatureCollection' && Array.isArray(json === null || json === void 0 ? void 0 : json.features)) {
|
|
95
|
+
return json;
|
|
96
|
+
}
|
|
97
|
+
throw Error(`Unable to parse as GeoJSON.`);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC1nZW8tZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi91dGlscy9nZW8tanNvbi9yZWFkLWdlby1maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ3pDLE9BQU8sUUFBUSxNQUFNLG1CQUFtQixDQUFBO0FBRXhDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUE7QUFDeEMsT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFBO0FBRXZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUU5Qzs7O0dBR0c7QUFDSCxNQUFNLFVBQWdCLFdBQVcsQ0FBQyxZQUF5Qzs7O1FBQ3pFLE1BQU0sTUFBTSxHQUFHLE1BQU0sMEJBQTBCLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFN0QsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDckIsT0FBTyxNQUFNLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQTtTQUNsQzthQUFNLElBQUksQ0FBQSxNQUFBLFFBQVEsQ0FBQyxNQUFNLENBQUMsMENBQUUsSUFBSSxNQUFLLGlCQUFpQixFQUFFO1lBQ3ZELElBQUk7Z0JBQ0YsT0FBTyxNQUFNLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTthQUNqQztZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLHdFQUF3RTtnQkFDeEUsaURBQWlEO2dCQUNqRCxJQUFJLFNBQVMsRUFBRSxFQUFFO29CQUNmLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyw4Q0FBOEMsRUFBRTt3QkFDaEUsT0FBTyxDQUFDLElBQUksQ0FDViwrQkFBK0I7NEJBQy9CLCtCQUErQjs0QkFDL0IseUZBQXlGLENBQzFGLENBQUE7cUJBQ0Y7aUJBQ0Y7Z0JBQ0QsTUFBTSxDQUFDLENBQUE7YUFDUjtTQUNGO1FBRUQsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUE7O0NBQzVCO0FBRUQsU0FBZSwwQkFBMEIsQ0FBQyxZQUF5Qzs7UUFDakYsSUFBSSxZQUFZLFlBQVksSUFBSSxFQUFFO1lBQ2hDLE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQ2hELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtTQUMzQjtRQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0NBQUE7QUFFRCwyRUFBMkU7QUFDM0Usb0RBQW9EO0FBQ3BELFNBQVMsU0FBUyxDQUFDLE1BQWM7SUFDL0IsTUFBTSxNQUFNLEdBQUcsQ0FBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBRSxDQUFBO0lBQ3pGLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQTtJQUVoQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxFQUFFO1FBQzVDLE9BQU8sS0FBSyxDQUFBO0tBQ2I7SUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN0QyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFO1lBQ3BDLE9BQU8sS0FBSyxDQUFBO1NBQ2I7S0FDRjtJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVELFNBQWUsWUFBWSxDQUFDLE1BQWM7O1FBQ3hDLE1BQU0sVUFBVSxHQUFHLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBZ0IsQ0FBQyxDQUFBO1FBQy9ELE1BQU0sY0FBYyxHQUFzQjtZQUN4QyxJQUFJLEVBQUUsbUJBQW1CO1lBQ3pCLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsVUFBVSxFQUFFLEVBQUc7YUFDaEIsQ0FBQyxDQUFDO1NBQ0osQ0FBQTtRQUNELE9BQU8sY0FBYyxDQUFBO0lBQ3ZCLENBQUM7Q0FBQTtBQUVELFNBQWUsV0FBVyxDQUFDLE1BQWM7O1FBQ3ZDLElBQUksY0FBYyxHQUFHLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBZ0IsQ0FBQyxDQUFBO1FBQ2pFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNqQyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUMvQixNQUFNLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO2FBQ3JDO2lCQUFNLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3BDLE1BQU0sS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUE7YUFDbkQ7WUFDRCxjQUFjLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFBO1NBQ25DO1FBQ0QsT0FBTyxlQUFlLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ3BELENBQUM7Q0FBQTtBQUVELFNBQVMsWUFBWSxDQUFDLE1BQWM7SUFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUUxQyxJQUFJLENBQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLElBQUksTUFBSyxtQkFBbUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxRQUFRLENBQUMsRUFBRTtRQUN2RSxPQUFPLElBQXlCLENBQUE7S0FDakM7SUFFRCxNQUFNLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IGZpbGVUeXBlIGZyb20gJ0BtYXJrbGIvZmlsZS10eXBlJ1xuaW1wb3J0IHsgRmVhdHVyZUNvbGxlY3Rpb24gfSBmcm9tICdnZW9qc29uJ1xuY29uc3QgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyLycpLkJ1ZmZlclxuaW1wb3J0IHNocCBmcm9tICdzaHBqcydcblxuaW1wb3J0IHsgcmVhZEZpbGVBc3luYyB9IGZyb20gJy4uL2ZpbGUtdXRpbHMnXG5pbXBvcnQgeyB3aXRob3V0UHJvcGVydHkgfSBmcm9tICcuLi9vYmotdXRpbHMnXG5cbi8qKlxuICogUmVhZHMgYSBGaWxlLCBvciBidWZmZXIgb2YgZmlsZSBjb250ZW50LCBpbiBHZW9KU09OIG9yIEVTUkkgU2hhcGVmaWxlIGZvcm1hdFxuICogYW5kIHJldHVybnMgYSBHZW9KU09OIGBGZWF0dXJlQ29sbGVjdGlvbmAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkR2VvRmlsZShmaWxlT3JCdWZmZXI6IEZpbGUgfCBBcnJheUJ1ZmZlciB8IEJ1ZmZlcik6IFByb21pc2U8RmVhdHVyZUNvbGxlY3Rpb24+IHtcbiAgY29uc3QgYnVmZmVyID0gYXdhaXQgY29lcmNlRmlsZU9yQnVmZmVyVG9CdWZmZXIoZmlsZU9yQnVmZmVyKVxuXG4gIGlmIChpc1NocEZpbGUoYnVmZmVyKSkge1xuICAgIHJldHVybiBhd2FpdCBwYXJzZVNocEZpbGUoYnVmZmVyKVxuICB9IGVsc2UgaWYgKGZpbGVUeXBlKGJ1ZmZlcik/Lm1pbWUgPT09ICdhcHBsaWNhdGlvbi96aXAnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBwYXJzZVNocFppcChidWZmZXIpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gTk9URTogSWYgJ3NocGpzJyB1cGRhdGVzIG9yIHdlIHN3aXRjaCB0byBhIGZvcmssIHdoZXJlIGl0IGRvZXNuJ3QgdXNlXG4gICAgICAvLyBub2RlIGJ1ZmZlcnMsIHRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzIHJldGhyb3cuXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgaWYgKGUubWVzc2FnZSA9PT0gJ25vZGVidWZmZXIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtJykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdUcnkgYWRkaW5nIEJ1ZmZlciBwb2x5ZmlsbC5cXG4nICtcbiAgICAgICAgICAgICdJbnN0YWxsOiBucG0gaW5zdGFsbCBidWZmZXJcXG4nICtcbiAgICAgICAgICAgICdBZGQgYGdsb2JhbC5CdWZmZXIgPSBnbG9iYWwuQnVmZmVyIHx8IHJlcXVpcmUoXFwnYnVmZmVyXFwnKS5CdWZmZXJgIHRvIFwic3JjL3BvbHlmaWxscy50c1wiJ1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJzZUdlb0pzb24oYnVmZmVyKVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb2VyY2VGaWxlT3JCdWZmZXJUb0J1ZmZlcihmaWxlT3JCdWZmZXI6IEZpbGUgfCBBcnJheUJ1ZmZlciB8IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gIGlmIChmaWxlT3JCdWZmZXIgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgY29uc3QgYXJyQnVmID0gYXdhaXQgcmVhZEZpbGVBc3luYyhmaWxlT3JCdWZmZXIpXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFyckJ1ZilcbiAgfVxuXG4gIHJldHVybiBCdWZmZXIuZnJvbShmaWxlT3JCdWZmZXIpXG59XG5cbi8vIE5PVEU6IE91ciBjdXJyZW50IHZlcnNpb24gb2YgZmlsZS10eXBlIGRvZXMgbm90IGRldGVjdCBzaHAgZmlsZXMuIFdlIGNhblxuLy8gcmVtb3ZlIHRoaXMgZnVuY3Rpb24gd2hlbiBmaWxlLXR5cGVzIGlzIHVwZ3JhZGVkLlxuZnVuY3Rpb24gaXNTaHBGaWxlKGJ1ZmZlcjogQnVmZmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IGhlYWRlciA9IFsgMHgyNywgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCBdXG4gIGNvbnN0IG9mZnNldCA9IDJcblxuICBpZiAoYnVmZmVyLmxlbmd0aCA8IChoZWFkZXIubGVuZ3RoICsgb2Zmc2V0KSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaGVhZGVyW2ldICE9PSBidWZmZXJbaSArIG9mZnNldF0pIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlU2hwRmlsZShidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8RmVhdHVyZUNvbGxlY3Rpb24+IHtcbiAgY29uc3QgZ2VvbWV0cmllcyA9IGF3YWl0IHNocC5wYXJzZVNocChidWZmZXIsIHVuZGVmaW5lZCBhcyBhbnkpXG4gIGNvbnN0IGZlYXRDb2xsZWN0aW9uOiBGZWF0dXJlQ29sbGVjdGlvbiA9IHtcbiAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgIGZlYXR1cmVzOiBnZW9tZXRyaWVzLm1hcChnZW9tID0+ICh7XG4gICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICBnZW9tZXRyeTogZ2VvbSxcbiAgICAgIHByb3BlcnRpZXM6IHsgfVxuICAgIH0pKVxuICB9XG4gIHJldHVybiBmZWF0Q29sbGVjdGlvblxufVxuXG5hc3luYyBmdW5jdGlvbiBwYXJzZVNocFppcChidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8RmVhdHVyZUNvbGxlY3Rpb24+IHtcbiAgbGV0IGZlYXRDb2xsZWN0aW9uID0gYXdhaXQgc2hwLnBhcnNlWmlwKGJ1ZmZlciwgdW5kZWZpbmVkIGFzIGFueSlcbiAgaWYgKEFycmF5LmlzQXJyYXkoZmVhdENvbGxlY3Rpb24pKSB7XG4gICAgaWYgKGZlYXRDb2xsZWN0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFNoYXBlIGRhdGEgbm90IGZvdW5kLmApXG4gICAgfSBlbHNlIGlmIChmZWF0Q29sbGVjdGlvbi5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBFcnJvcihgTXVsdGlwbGUgc2hhcGUgZmlsZXMgbm90IHN1cHBvcnRlZC5gKVxuICAgIH1cbiAgICBmZWF0Q29sbGVjdGlvbiA9IGZlYXRDb2xsZWN0aW9uWzBdXG4gIH1cbiAgcmV0dXJuIHdpdGhvdXRQcm9wZXJ0eShmZWF0Q29sbGVjdGlvbiwgJ2ZpbGVOYW1lJylcbn1cblxuZnVuY3Rpb24gcGFyc2VHZW9Kc29uKGJ1ZmZlcjogQnVmZmVyKTogRmVhdHVyZUNvbGxlY3Rpb24ge1xuICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShidWZmZXIudG9TdHJpbmcoKSlcblxuICBpZiAoanNvbj8udHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJyAmJiBBcnJheS5pc0FycmF5KGpzb24/LmZlYXR1cmVzKSkge1xuICAgIHJldHVybiBqc29uIGFzIEZlYXR1cmVDb2xsZWN0aW9uXG4gIH1cblxuICB0aHJvdyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGFzIEdlb0pTT04uYClcbn1cbiJdfQ==
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Split all MultiPolygon into Polygon. Any properties, other than
|
|
3
|
+
* 'coordinates', of the MultiPolygons will be lost.
|
|
4
|
+
*
|
|
5
|
+
* NOTE: MultiPolygons in a GeometryCollection will not be split.
|
|
6
|
+
*/
|
|
7
|
+
export function splitMultiPolygons(featureCollection) {
|
|
8
|
+
for (let i = 0; i < featureCollection.features.length; i++) {
|
|
9
|
+
if (featureCollection.features[i]) {
|
|
10
|
+
const geometry = featureCollection.features[i].geometry;
|
|
11
|
+
if (geometry.type === 'MultiPolygon') {
|
|
12
|
+
const features = splitMultPolygon(geometry).map(p => ({
|
|
13
|
+
type: 'Feature',
|
|
14
|
+
geometry: p,
|
|
15
|
+
properties: {},
|
|
16
|
+
}));
|
|
17
|
+
featureCollection.features.splice(i, 1, ...features);
|
|
18
|
+
i += Math.max(features.length - 1, 0);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function splitMultPolygon(multiPolygon) {
|
|
24
|
+
return multiPolygon.coordinates.map(c => ({
|
|
25
|
+
type: 'Polygon',
|
|
26
|
+
coordinates: c,
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQtbXVsdGktcG9seWdvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vdXRpbHMvZ2VvLWpzb24vc3BsaXQtbXVsdGktcG9seWdvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0E7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsaUJBQW9DO0lBQ3JFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFELElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2pDLE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUE7WUFDdkQsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRTtnQkFDcEMsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDcEQsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsUUFBUSxFQUFFLENBQUM7b0JBQ1gsVUFBVSxFQUFFLEVBQUc7aUJBQ0osQ0FBQSxDQUFDLENBQUE7Z0JBQ2QsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUE7Z0JBQ3BELENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO2FBQ3RDO1NBQ0Y7S0FDRjtBQUNILENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLFlBQTBCO0lBQ2xELE9BQU8sWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLElBQUksRUFBRSxTQUFTO1FBQ2YsV0FBVyxFQUFFLENBQUM7S0FDZixDQUFDLENBQUMsQ0FBQTtBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb2x5Z29uIH0gZnJvbSAnQHR1cmYvaGVscGVycydcclxuaW1wb3J0IHtcclxuICBGZWF0dXJlLFxyXG4gIEZlYXR1cmVDb2xsZWN0aW9uLFxyXG4gIE11bHRpUG9seWdvbixcclxufSBmcm9tICdnZW9qc29uJ1xyXG5cclxuLyoqXHJcbiAqIFNwbGl0IGFsbCBNdWx0aVBvbHlnb24gaW50byBQb2x5Z29uLiBBbnkgcHJvcGVydGllcywgb3RoZXIgdGhhblxyXG4gKiAnY29vcmRpbmF0ZXMnLCBvZiB0aGUgTXVsdGlQb2x5Z29ucyB3aWxsIGJlIGxvc3QuXHJcbiAqXHJcbiAqIE5PVEU6IE11bHRpUG9seWdvbnMgaW4gYSBHZW9tZXRyeUNvbGxlY3Rpb24gd2lsbCBub3QgYmUgc3BsaXQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRNdWx0aVBvbHlnb25zKGZlYXR1cmVDb2xsZWN0aW9uOiBGZWF0dXJlQ29sbGVjdGlvbik6IHZvaWQge1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcclxuICAgIGlmIChmZWF0dXJlQ29sbGVjdGlvbi5mZWF0dXJlc1tpXSkge1xyXG4gICAgICBjb25zdCBnZW9tZXRyeSA9IGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzW2ldLmdlb21ldHJ5XHJcbiAgICAgIGlmIChnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xyXG4gICAgICAgIGNvbnN0IGZlYXR1cmVzID0gc3BsaXRNdWx0UG9seWdvbihnZW9tZXRyeSkubWFwKHAgPT4gKHtcclxuICAgICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcclxuICAgICAgICAgIGdlb21ldHJ5OiBwLFxyXG4gICAgICAgICAgcHJvcGVydGllczogeyB9LFxyXG4gICAgICAgIH0gYXMgRmVhdHVyZSkpXHJcbiAgICAgICAgZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMuc3BsaWNlKGksIDEsIC4uLmZlYXR1cmVzKVxyXG4gICAgICAgIGkgKz0gTWF0aC5tYXgoZmVhdHVyZXMubGVuZ3RoIC0gMSwgMClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc3BsaXRNdWx0UG9seWdvbihtdWx0aVBvbHlnb246IE11bHRpUG9seWdvbik6IFBvbHlnb25bXSB7XHJcbiAgcmV0dXJuIG11bHRpUG9seWdvbi5jb29yZGluYXRlcy5tYXAoYyA9PiAoe1xyXG4gICAgdHlwZTogJ1BvbHlnb24nLFxyXG4gICAgY29vcmRpbmF0ZXM6IGMsXHJcbiAgfSkpXHJcbn1cclxuIl19
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export function isNullOrUndefined(value) {
|
|
2
2
|
return value === undefined || value === null;
|
|
3
3
|
}
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtbnVsbC1vci11bmRlZmluZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21tb24vdXRpbHMvaXMtbnVsbC1vci11bmRlZmluZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLGlCQUFpQixDQUFJLEtBQTJCO0lBQzlELE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFBO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQ8VD4odmFsdWU6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogdmFsdWUgaXMgKG51bGwgfCB1bmRlZmluZWQpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGxcbn1cbiJdfQ==
|
|
@@ -11,6 +11,16 @@ export * from './form/has-required-control';
|
|
|
11
11
|
export * from './form/is-empty-input-value';
|
|
12
12
|
export * from './operators/index';
|
|
13
13
|
export * from './router/index';
|
|
14
|
+
export * from './geo-json/coerce-feature-collection';
|
|
15
|
+
export * from './geo-json/geo-json-to-area';
|
|
16
|
+
export * from './geo-json/is-feature-collection.validator';
|
|
17
|
+
export * from './geo-json/is-only-geometry-types';
|
|
18
|
+
export * from './geo-json/is-only-geometry-types.validator';
|
|
19
|
+
export * from './geo-json/merge-polygons';
|
|
20
|
+
export * from './geo-json/no-inner-rings.validator';
|
|
21
|
+
export * from './geo-json/no-kinks.validator';
|
|
22
|
+
export * from './geo-json/read-geo-file';
|
|
23
|
+
export * from './geo-json/split-multi-polygons';
|
|
14
24
|
export * from './array-move';
|
|
15
25
|
export * from './calc-percentage';
|
|
16
26
|
export * from './toggle-attribute';
|
|
@@ -36,4 +46,4 @@ export * from './pad-start';
|
|
|
36
46
|
export * from './create-padding';
|
|
37
47
|
export * from './is-numeric';
|
|
38
48
|
export * from './fractional-digits-count';
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbW1vbi91dGlscy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUNBQW1DLENBQUE7QUFFakQsY0FBYyx5QkFBeUIsQ0FBQTtBQUN2QyxjQUFjLHlCQUF5QixDQUFBO0FBQ3ZDLGNBQWMscUNBQXFDLENBQUE7QUFDbkQsY0FBYywrQkFBK0IsQ0FBQTtBQUM3QyxjQUFjLDhCQUE4QixDQUFBO0FBQzVDLGNBQWMscUNBQXFDLENBQUE7QUFDbkQsY0FBYyw4QkFBOEIsQ0FBQTtBQUM1QyxjQUFjLG1DQUFtQyxDQUFBO0FBQ2pELGNBQWMsNkJBQTZCLENBQUE7QUFDM0MsY0FBYyw2QkFBNkIsQ0FBQTtBQUUzQyxjQUFjLG1CQUFtQixDQUFBO0FBRWpDLGNBQWMsZ0JBQWdCLENBQUE7QUFFOUIsY0FBYyxzQ0FBc0MsQ0FBQTtBQUNwRCxjQUFjLDZCQUE2QixDQUFBO0FBQzNDLGNBQWMsNENBQTRDLENBQUE7QUFDMUQsY0FBYyxtQ0FBbUMsQ0FBQTtBQUNqRCxjQUFjLDZDQUE2QyxDQUFBO0FBQzNELGNBQWMsMkJBQTJCLENBQUE7QUFDekMsY0FBYyxxQ0FBcUMsQ0FBQTtBQUNuRCxjQUFjLCtCQUErQixDQUFBO0FBQzdDLGNBQWMsMEJBQTBCLENBQUE7QUFDeEMsY0FBYyxpQ0FBaUMsQ0FBQTtBQUUvQyxjQUFjLGNBQWMsQ0FBQTtBQUM1QixjQUFjLG1CQUFtQixDQUFBO0FBQ2pDLGNBQWMsb0JBQW9CLENBQUE7QUFDbEMsY0FBYyxpQkFBaUIsQ0FBQTtBQUMvQixjQUFjLGVBQWUsQ0FBQTtBQUM3QixjQUFjLHdCQUF3QixDQUFBO0FBQ3RDLGNBQWMsY0FBYyxDQUFBO0FBQzVCLGNBQWMsb0JBQW9CLENBQUE7QUFDbEMsY0FBYyxhQUFhLENBQUE7QUFDM0IsY0FBYyxjQUFjLENBQUE7QUFDNUIsY0FBYyx5QkFBeUIsQ0FBQTtBQUN2QyxjQUFjLDJCQUEyQixDQUFBO0FBQ3pDLGNBQWMsa0JBQWtCLENBQUE7QUFDaEMsY0FBYyxlQUFlLENBQUE7QUFDN0IsY0FBYyx3QkFBd0IsQ0FBQTtBQUN0QyxjQUFjLG1CQUFtQixDQUFBO0FBQ2pDLGNBQWMsb0JBQW9CLENBQUE7QUFDbEMsY0FBYyxnQkFBZ0IsQ0FBQTtBQUM5QixjQUFjLGlCQUFpQixDQUFBO0FBQy9CLGNBQWMsc0JBQXNCLENBQUE7QUFDcEMsY0FBYyxXQUFXLENBQUE7QUFDekIsY0FBYyxhQUFhLENBQUE7QUFDM0IsY0FBYyxrQkFBa0IsQ0FBQTtBQUNoQyxjQUFjLGNBQWMsQ0FBQTtBQUM1QixjQUFjLDJCQUEyQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jZGsvZ2V0LWNsb3Nlc3Qtd2lkZ2V0LWNkay1kcmFnJ1xuXG5leHBvcnQgKiBmcm9tICcuL2Zvcm0vZ2V0LWNvbnRyb2wtbmFtZSdcbmV4cG9ydCAqIGZyb20gJy4vZm9ybS9nZXQtY29udHJvbC1wYXRoJ1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtL29ic2VydmUtY29udHJvbC1pcy1kaWZmZXJlbnQnXG5leHBvcnQgKiBmcm9tICcuL2Zvcm0vb2JzZXJ2ZS1jb250cm9sLXN0YXR1cydcbmV4cG9ydCAqIGZyb20gJy4vZm9ybS9vYnNlcnZlLWNvbnRyb2wtdmFsaWQnXG5leHBvcnQgKiBmcm9tICcuL2Zvcm0vb2JzZXJ2ZS1jb250cm9sLXZhbHVlLWNoYW5nZSdcbmV4cG9ydCAqIGZyb20gJy4vZm9ybS9vYnNlcnZlLWNvbnRyb2wtdmFsdWUnXG5leHBvcnQgKiBmcm9tICcuL2Zvcm0vd2FpdC1vbi1ub24tcGVuZGluZy1zdGF0dXMnXG5leHBvcnQgKiBmcm9tICcuL2Zvcm0vaGFzLXJlcXVpcmVkLWNvbnRyb2wnXG5leHBvcnQgKiBmcm9tICcuL2Zvcm0vaXMtZW1wdHktaW5wdXQtdmFsdWUnXG5cbmV4cG9ydCAqIGZyb20gJy4vb3BlcmF0b3JzL2luZGV4J1xuXG5leHBvcnQgKiBmcm9tICcuL3JvdXRlci9pbmRleCdcblxuZXhwb3J0ICogZnJvbSAnLi9nZW8tanNvbi9jb2VyY2UtZmVhdHVyZS1jb2xsZWN0aW9uJ1xuZXhwb3J0ICogZnJvbSAnLi9nZW8tanNvbi9nZW8tanNvbi10by1hcmVhJ1xuZXhwb3J0ICogZnJvbSAnLi9nZW8tanNvbi9pcy1mZWF0dXJlLWNvbGxlY3Rpb24udmFsaWRhdG9yJ1xuZXhwb3J0ICogZnJvbSAnLi9nZW8tanNvbi9pcy1vbmx5LWdlb21ldHJ5LXR5cGVzJ1xuZXhwb3J0ICogZnJvbSAnLi9nZW8tanNvbi9pcy1vbmx5LWdlb21ldHJ5LXR5cGVzLnZhbGlkYXRvcidcbmV4cG9ydCAqIGZyb20gJy4vZ2VvLWpzb24vbWVyZ2UtcG9seWdvbnMnXG5leHBvcnQgKiBmcm9tICcuL2dlby1qc29uL25vLWlubmVyLXJpbmdzLnZhbGlkYXRvcidcbmV4cG9ydCAqIGZyb20gJy4vZ2VvLWpzb24vbm8ta2lua3MudmFsaWRhdG9yJ1xuZXhwb3J0ICogZnJvbSAnLi9nZW8tanNvbi9yZWFkLWdlby1maWxlJ1xuZXhwb3J0ICogZnJvbSAnLi9nZW8tanNvbi9zcGxpdC1tdWx0aS1wb2x5Z29ucydcblxuZXhwb3J0ICogZnJvbSAnLi9hcnJheS1tb3ZlJ1xuZXhwb3J0ICogZnJvbSAnLi9jYWxjLXBlcmNlbnRhZ2UnXG5leHBvcnQgKiBmcm9tICcuL3RvZ2dsZS1hdHRyaWJ1dGUnXG5leHBvcnQgKiBmcm9tICcuL2dldC1hdHRyaWJ1dGUnXG5leHBvcnQgKiBmcm9tICcuL2lucHV0LW1hc2tzJ1xuZXhwb3J0ICogZnJvbSAnLi9pcy1udWxsLW9yLXVuZGVmaW5lZCdcbmV4cG9ydCAqIGZyb20gJy4vbG9hZC1zdHlsZSdcbmV4cG9ydCAqIGZyb20gJy4vbG9hZC1zdHlsZS1zaGVldCdcbmV4cG9ydCAqIGZyb20gJy4vb2JqLXV0aWxzJ1xuZXhwb3J0ICogZnJvbSAnLi9maWxlLXV0aWxzJ1xuZXhwb3J0ICogZnJvbSAnLi9ub3QtbnVsbC1vci11bmRlZmluZWQnXG5leHBvcnQgKiBmcm9tICcuL3dhaXQtb24tY29uZGl0aW9uLWFzeW5jJ1xuZXhwb3J0ICogZnJvbSAnLi9wb2xsaW5nLXRpY2tlcidcbmV4cG9ydCAqIGZyb20gJy4vcmVmcmVzaGFibGUnXG5leHBvcnQgKiBmcm9tICcuL3dyYXAtaW50by1vYnNlcnZhYmxlJ1xuZXhwb3J0ICogZnJvbSAnLi9pcy1hYnNvbHV0ZS11cmwnXG5leHBvcnQgKiBmcm9tICcuL3N1YnNjcmliZXItY291bnQnXG5leHBvcnQgKiBmcm9tICcuL2hhcy1wcm9wZXJ0eSdcbmV4cG9ydCAqIGZyb20gJy4vaGFzLWF0dHJpYnV0ZSdcbmV4cG9ydCAqIGZyb20gJy4vb2JzZXJ2ZS1xdWVyeS1saXN0J1xuZXhwb3J0ICogZnJvbSAnLi9wYWQtZW5kJ1xuZXhwb3J0ICogZnJvbSAnLi9wYWQtc3RhcnQnXG5leHBvcnQgKiBmcm9tICcuL2NyZWF0ZS1wYWRkaW5nJ1xuZXhwb3J0ICogZnJvbSAnLi9pcy1udW1lcmljJ1xuZXhwb3J0ICogZnJvbSAnLi9mcmFjdGlvbmFsLWRpZ2l0cy1jb3VudCdcbiJdfQ==
|