/
geoIntersects.ts
107 lines (104 loc) · 3.29 KB
/
geoIntersects.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import { geoIntersectsFP, toGeoJSON } from '@terascope/utils';
import { FieldType, GeoShapeType, GeoInput } from '@terascope/types';
import {
FieldValidateConfig,
ProcessMode,
FunctionDefinitionType,
FunctionDefinitionCategory,
FunctionDefinitionExample
} from '../interfaces';
export interface GeoIntersectsArgs {
value: GeoInput;
}
const examples: FunctionDefinitionExample<GeoIntersectsArgs>[] = [
{
args: { value: ['10,10', '10,50', '50,50', '50,10', '10,10'] },
config: { version: 1, fields: { testField: { type: FieldType.GeoJSON } } },
field: 'testField',
input: {
type: GeoShapeType.Point,
coordinates: [20, 20]
},
output: {
type: GeoShapeType.Point,
coordinates: [20, 20]
},
},
{
args: { value: ['10,10', '10,50', '50,50', '50,10', '10,10'] },
config: { version: 1, fields: { testField: { type: FieldType.GeoJSON } } },
field: 'testField',
input: {
type: GeoShapeType.Polygon,
coordinates: [[[0, 0], [0, 15], [15, 15], [15, 0], [0, 0]]]
},
output: {
type: GeoShapeType.Polygon,
coordinates: [[[0, 0], [0, 15], [15, 15], [15, 0], [0, 0]]]
},
},
{
args: {
value: {
type: GeoShapeType.Polygon,
coordinates: [[[0, 0], [0, 15], [15, 15], [15, 0], [0, 0]]]
}
},
config: { version: 1, fields: { testField: { type: FieldType.GeoJSON } } },
field: 'testField',
input: {
type: GeoShapeType.MultiPolygon,
coordinates: [
[
[[10, 10], [10, 50], [50, 50], [50, 10], [10, 10]],
],
[
[[-10, -10], [-10, -50], [-50, -50], [-50, -10], [-10, -10]],
]
]
},
output: {
type: GeoShapeType.MultiPolygon,
coordinates: [
[
[[10, 10], [10, 50], [50, 50], [50, 10], [10, 10]],
],
[
[[-10, -10], [-10, -50], [-50, -50], [-50, -10], [-10, -10]],
]
]
},
},
];
export const geoIntersectsConfig: FieldValidateConfig<GeoIntersectsArgs> = {
name: 'geoIntersects',
type: FunctionDefinitionType.FIELD_VALIDATION,
process_mode: ProcessMode.FULL_VALUES,
category: FunctionDefinitionCategory.GEO,
examples,
description: 'Returns the input if it has at least one point in common with the argument value, otherwise returns null',
create({ args: { value } }) {
return geoIntersectsFP(value);
},
accepts: [
FieldType.GeoJSON,
FieldType.GeoPoint,
FieldType.Geo,
FieldType.Object,
FieldType.String,
FieldType.Number
],
argument_schema: {
value: {
type: FieldType.Any,
description: 'The geo value used to compare with the input geo-entity'
}
},
required_arguments: ['value'],
validate_arguments({ value }) {
const input = toGeoJSON(value);
if (!input) {
throw new Error(`Invalid parameter value: ${JSON.stringify(value)}, is not a valid geo-json`);
}
}
};