@trackunit/geo-json-utils 1.11.57 → 1.11.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trackunit/geo-json-utils",
3
- "version": "1.11.57",
3
+ "version": "1.11.58",
4
4
  "repository": "https://github.com/Trackunit/manager",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "engines": {
@@ -1,69 +1,107 @@
1
1
  import { z } from "zod";
2
2
  /**
3
- * A Position is an array of coordinates. [x, y]
4
- * https://tools.ietf.org/html/rfc7946#section-3.1.1
3
+ * A Position is an array of coordinates. [longitude, latitude] or [longitude, latitude, altitude]
4
+ * RFC 7946 Section 3.1.1: "There MUST be two or more elements. The first two elements
5
+ * are longitude and latitude [...] Altitude or elevation MAY be included as an optional
6
+ * third element."
5
7
  */
6
- export declare const geoJsonPositionSchema: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
8
+ export declare const geoJsonPosition2dSchema: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
9
+ export declare const geoJsonPositionSchema: z.ZodEffects<z.ZodUnion<[z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>]>, [number, number] | [number, number, number], [number, number] | [number, number, number]>;
7
10
  export type GeoJsonPosition = z.infer<typeof geoJsonPositionSchema>;
11
+ export type GeoJsonPosition2d = z.infer<typeof geoJsonPosition2dSchema>;
12
+ /**
13
+ * 2D bounding box of the GeoJSON object.
14
+ * The value of the bbox member is an array of length 4.
15
+ *
16
+ * [west, south, east, north]
17
+ *
18
+ * Note: west may be greater than east for bboxes that cross the
19
+ * antimeridian (RFC 7946 Section 5.2).
20
+ *
21
+ * Zero-height bboxes (north === south) are rejected per RFC 7946 Section 5.2:
22
+ * "The latitude of the northeast corner is always greater than the latitude
23
+ * of the southwest corner." Zero-width bboxes (west === east) are not explicitly
24
+ * forbidden by the RFC for non-antimeridian cases, so they pass.
25
+ */
26
+ export declare const geoJsonBboxSchema: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>;
27
+ export type GeoJsonBbox = z.infer<typeof geoJsonBboxSchema>;
8
28
  /**
9
29
  * Point geometry object.
30
+ * Uses z.object() (not strictObject) so RFC 7946 Section 6.1 "foreign members"
31
+ * (crs, vendor extensions, etc.) are accepted and stripped during parse.
10
32
  * https://tools.ietf.org/html/rfc7946#section-3.1.2
11
33
  */
12
34
  export declare const geoJsonPointSchema: z.ZodObject<{
13
35
  type: z.ZodLiteral<"Point">;
14
- coordinates: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
15
- }, "strict", z.ZodTypeAny, {
36
+ coordinates: z.ZodEffects<z.ZodUnion<[z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>]>, [number, number] | [number, number, number], [number, number] | [number, number, number]>;
37
+ bbox: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>>;
38
+ }, "strip", z.ZodTypeAny, {
16
39
  type: "Point";
17
- coordinates: [number, number];
40
+ coordinates: [number, number] | [number, number, number];
41
+ bbox?: [number, number, number, number] | undefined;
18
42
  }, {
19
43
  type: "Point";
20
- coordinates: [number, number];
44
+ coordinates: [number, number] | [number, number, number];
45
+ bbox?: [number, number, number, number] | undefined;
21
46
  }>;
22
47
  export type GeoJsonPoint = z.infer<typeof geoJsonPointSchema>;
23
48
  /**
24
49
  * MultiPoint geometry object.
25
- * https://tools.ietf.org/html/rfc7946#section-3.1.3
50
+ * Foreign members (RFC 7946 Section 6.1) are stripped during parse.
51
+ * https://tools.ietf.org/html/rfc7946#section-3.1.3
26
52
  */
27
53
  export declare const geoJsonMultiPointSchema: z.ZodObject<{
28
54
  type: z.ZodLiteral<"MultiPoint">;
29
- coordinates: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, "many">;
30
- }, "strict", z.ZodTypeAny, {
55
+ coordinates: z.ZodArray<z.ZodEffects<z.ZodUnion<[z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>]>, [number, number] | [number, number, number], [number, number] | [number, number, number]>, "many">;
56
+ bbox: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>>;
57
+ }, "strip", z.ZodTypeAny, {
31
58
  type: "MultiPoint";
32
- coordinates: [number, number][];
59
+ coordinates: ([number, number] | [number, number, number])[];
60
+ bbox?: [number, number, number, number] | undefined;
33
61
  }, {
34
62
  type: "MultiPoint";
35
- coordinates: [number, number][];
63
+ coordinates: ([number, number] | [number, number, number])[];
64
+ bbox?: [number, number, number, number] | undefined;
36
65
  }>;
37
66
  export type GeoJsonMultiPoint = z.infer<typeof geoJsonMultiPointSchema>;
38
67
  /**
39
68
  * LineString geometry object.
40
69
  * Minimum length of 2 positions.
70
+ * Foreign members (RFC 7946 Section 6.1) are stripped during parse.
41
71
  * https://tools.ietf.org/html/rfc7946#section-3.1.4
42
72
  */
43
73
  export declare const geoJsonLineStringSchema: z.ZodObject<{
44
74
  type: z.ZodLiteral<"LineString">;
45
- coordinates: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, "many">;
46
- }, "strict", z.ZodTypeAny, {
75
+ coordinates: z.ZodArray<z.ZodEffects<z.ZodUnion<[z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>]>, [number, number] | [number, number, number], [number, number] | [number, number, number]>, "many">;
76
+ bbox: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>>;
77
+ }, "strip", z.ZodTypeAny, {
47
78
  type: "LineString";
48
- coordinates: [number, number][];
79
+ coordinates: ([number, number] | [number, number, number])[];
80
+ bbox?: [number, number, number, number] | undefined;
49
81
  }, {
50
82
  type: "LineString";
51
- coordinates: [number, number][];
83
+ coordinates: ([number, number] | [number, number, number])[];
84
+ bbox?: [number, number, number, number] | undefined;
52
85
  }>;
53
86
  export type GeoJsonLineString = z.infer<typeof geoJsonLineStringSchema>;
54
87
  /**
55
88
  * MultiLineString geometry object.
89
+ * Each inner array is a LineString coordinate array (>= 2 positions per RFC 7946 Section 3.1.5).
90
+ * Foreign members (RFC 7946 Section 6.1) are stripped during parse.
56
91
  * https://tools.ietf.org/html/rfc7946#section-3.1.5
57
92
  */
58
93
  export declare const geoJsonMultiLineStringSchema: z.ZodObject<{
59
94
  type: z.ZodLiteral<"MultiLineString">;
60
- coordinates: z.ZodArray<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, "many">, "many">;
61
- }, "strict", z.ZodTypeAny, {
95
+ coordinates: z.ZodArray<z.ZodArray<z.ZodEffects<z.ZodUnion<[z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>]>, [number, number] | [number, number, number], [number, number] | [number, number, number]>, "many">, "many">;
96
+ bbox: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>>;
97
+ }, "strip", z.ZodTypeAny, {
62
98
  type: "MultiLineString";
63
- coordinates: [number, number][][];
99
+ coordinates: ([number, number] | [number, number, number])[][];
100
+ bbox?: [number, number, number, number] | undefined;
64
101
  }, {
65
102
  type: "MultiLineString";
66
- coordinates: [number, number][][];
103
+ coordinates: ([number, number] | [number, number, number])[][];
104
+ bbox?: [number, number, number, number] | undefined;
67
105
  }>;
68
106
  export type GeoJsonMultiLineString = z.infer<typeof geoJsonMultiLineStringSchema>;
69
107
  /**
@@ -78,99 +116,139 @@ export type GeoJsonMultiLineString = z.infer<typeof geoJsonMultiLineStringSchema
78
116
  area it bounds, i.e., exterior rings are counterclockwise, and
79
117
  holes are clockwise
80
118
  */
81
- export declare const geoJsonLinearRingSchema: z.ZodEffects<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, "many">, [number, number][], [number, number][]>;
119
+ export declare const geoJsonLinearRingSchema: z.ZodEffects<z.ZodArray<z.ZodEffects<z.ZodUnion<[z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>]>, [number, number] | [number, number, number], [number, number] | [number, number, number]>, "many">, ([number, number] | [number, number, number])[], ([number, number] | [number, number, number])[]>;
82
120
  export type GeoJsonLinearRing = z.infer<typeof geoJsonLinearRingSchema>;
83
121
  /**
84
122
  * Polygon geometry object.
123
+ * Must have at least one ring (the exterior ring) per RFC 7946 Section 3.1.6.
124
+ * Foreign members (RFC 7946 Section 6.1) are stripped during parse.
85
125
  * https://tools.ietf.org/html/rfc7946#section-3.1.6
86
126
  */
87
127
  export declare const geoJsonPolygonSchema: z.ZodObject<{
88
128
  type: z.ZodLiteral<"Polygon">;
89
- coordinates: z.ZodArray<z.ZodEffects<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, "many">, [number, number][], [number, number][]>, "many">;
90
- }, "strict", z.ZodTypeAny, {
129
+ coordinates: z.ZodArray<z.ZodEffects<z.ZodArray<z.ZodEffects<z.ZodUnion<[z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>]>, [number, number] | [number, number, number], [number, number] | [number, number, number]>, "many">, ([number, number] | [number, number, number])[], ([number, number] | [number, number, number])[]>, "many">;
130
+ bbox: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>>;
131
+ }, "strip", z.ZodTypeAny, {
91
132
  type: "Polygon";
92
- coordinates: [number, number][][];
133
+ coordinates: ([number, number] | [number, number, number])[][];
134
+ bbox?: [number, number, number, number] | undefined;
93
135
  }, {
94
136
  type: "Polygon";
95
- coordinates: [number, number][][];
137
+ coordinates: ([number, number] | [number, number, number])[][];
138
+ bbox?: [number, number, number, number] | undefined;
96
139
  }>;
97
140
  export type GeoJsonPolygon = z.infer<typeof geoJsonPolygonSchema>;
98
141
  /**
99
142
  * MultiPolygon geometry object.
143
+ * Foreign members (RFC 7946 Section 6.1) are stripped during parse.
100
144
  * https://tools.ietf.org/html/rfc7946#section-3.1.7
101
145
  */
102
146
  export declare const geoJsonMultiPolygonSchema: z.ZodObject<{
103
147
  type: z.ZodLiteral<"MultiPolygon">;
104
- coordinates: z.ZodArray<z.ZodArray<z.ZodEffects<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, "many">, [number, number][], [number, number][]>, "many">, "many">;
105
- }, "strict", z.ZodTypeAny, {
148
+ coordinates: z.ZodArray<z.ZodArray<z.ZodEffects<z.ZodArray<z.ZodEffects<z.ZodUnion<[z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>]>, [number, number] | [number, number, number], [number, number] | [number, number, number]>, "many">, ([number, number] | [number, number, number])[], ([number, number] | [number, number, number])[]>, "many">, "many">;
149
+ bbox: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>>;
150
+ }, "strip", z.ZodTypeAny, {
106
151
  type: "MultiPolygon";
107
- coordinates: [number, number][][][];
152
+ coordinates: ([number, number] | [number, number, number])[][][];
153
+ bbox?: [number, number, number, number] | undefined;
108
154
  }, {
109
155
  type: "MultiPolygon";
110
- coordinates: [number, number][][][];
156
+ coordinates: ([number, number] | [number, number, number])[][][];
157
+ bbox?: [number, number, number, number] | undefined;
111
158
  }>;
112
159
  export type GeoJsonMultiPolygon = z.infer<typeof geoJsonMultiPolygonSchema>;
113
- export declare const geoJsonGeometrySchema: z.ZodUnion<[z.ZodObject<{
114
- type: z.ZodLiteral<"Point">;
115
- coordinates: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
116
- }, "strict", z.ZodTypeAny, {
117
- type: "Point";
118
- coordinates: [number, number];
119
- }, {
120
- type: "Point";
121
- coordinates: [number, number];
122
- }>, z.ZodObject<{
123
- type: z.ZodLiteral<"MultiPoint">;
124
- coordinates: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, "many">;
125
- }, "strict", z.ZodTypeAny, {
126
- type: "MultiPoint";
127
- coordinates: [number, number][];
128
- }, {
129
- type: "MultiPoint";
130
- coordinates: [number, number][];
131
- }>, z.ZodObject<{
132
- type: z.ZodLiteral<"LineString">;
133
- coordinates: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, "many">;
134
- }, "strict", z.ZodTypeAny, {
135
- type: "LineString";
136
- coordinates: [number, number][];
137
- }, {
138
- type: "LineString";
139
- coordinates: [number, number][];
140
- }>, z.ZodObject<{
141
- type: z.ZodLiteral<"MultiLineString">;
142
- coordinates: z.ZodArray<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, "many">, "many">;
143
- }, "strict", z.ZodTypeAny, {
144
- type: "MultiLineString";
145
- coordinates: [number, number][][];
146
- }, {
147
- type: "MultiLineString";
148
- coordinates: [number, number][][];
149
- }>, z.ZodObject<{
150
- type: z.ZodLiteral<"Polygon">;
151
- coordinates: z.ZodArray<z.ZodEffects<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, "many">, [number, number][], [number, number][]>, "many">;
152
- }, "strict", z.ZodTypeAny, {
153
- type: "Polygon";
154
- coordinates: [number, number][][];
155
- }, {
156
- type: "Polygon";
157
- coordinates: [number, number][][];
158
- }>, z.ZodObject<{
159
- type: z.ZodLiteral<"MultiPolygon">;
160
- coordinates: z.ZodArray<z.ZodArray<z.ZodEffects<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, "many">, [number, number][], [number, number][]>, "many">, "many">;
161
- }, "strict", z.ZodTypeAny, {
162
- type: "MultiPolygon";
163
- coordinates: [number, number][][][];
164
- }, {
165
- type: "MultiPolygon";
166
- coordinates: [number, number][][][];
167
- }>]>;
168
- export type GeoJsonGeometry = z.infer<typeof geoJsonGeometrySchema>;
169
160
  /**
170
- * 2D bounding box of the GeoJSON object.
171
- * The value of the Bbox member is an array of length 4.
161
+ * GeometryCollection and the recursive Geometry union type.
172
162
  *
173
- * [min_lon, min_lat, max_lon, max_lat]
163
+ * RFC 7946 Section 3.1.8: GeometryCollection contains a "geometries" array
164
+ * of Geometry objects. Because this is recursive (a GeometryCollection can
165
+ * contain other GeometryCollections), the types are defined manually to
166
+ * break the circular z.infer chain.
174
167
  */
175
- export declare const geoJsonBboxSchema: z.ZodEffects<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, [number, number, number, number], [number, number, number, number]>;
176
- export type GeoJsonBbox = z.infer<typeof geoJsonBboxSchema>;
168
+ export type GeoJsonGeometryCollection = {
169
+ readonly type: "GeometryCollection";
170
+ readonly geometries: ReadonlyArray<GeoJsonGeometry>;
171
+ readonly bbox?: GeoJsonBbox;
172
+ };
173
+ export type GeoJsonGeometry = z.infer<typeof geoJsonPointSchema> | z.infer<typeof geoJsonMultiPointSchema> | z.infer<typeof geoJsonLineStringSchema> | z.infer<typeof geoJsonMultiLineStringSchema> | z.infer<typeof geoJsonPolygonSchema> | z.infer<typeof geoJsonMultiPolygonSchema> | GeoJsonGeometryCollection;
174
+ /**
175
+ * GeometryCollection schema.
176
+ * Foreign members (RFC 7946 Section 6.1) are stripped during parse.
177
+ */
178
+ export declare const geoJsonGeometryCollectionSchema: z.ZodType<GeoJsonGeometryCollection>;
179
+ export declare const geoJsonGeometrySchema: z.ZodType<GeoJsonGeometry>;
180
+ /**
181
+ * Feature object.
182
+ * Geometry may be null for unlocated features (RFC 7946 Section 3.2).
183
+ * Foreign members (RFC 7946 Section 6.1) are stripped during parse.
184
+ * https://tools.ietf.org/html/rfc7946#section-3.2
185
+ */
186
+ export declare const geoJsonFeatureSchema: z.ZodObject<{
187
+ type: z.ZodLiteral<"Feature">;
188
+ geometry: z.ZodNullable<z.ZodType<GeoJsonGeometry, z.ZodTypeDef, GeoJsonGeometry>>;
189
+ properties: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
190
+ id: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
191
+ bbox: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>>;
192
+ }, "strip", z.ZodTypeAny, {
193
+ type: "Feature";
194
+ geometry: GeoJsonGeometry | null;
195
+ properties: Record<string, unknown> | null;
196
+ bbox?: [number, number, number, number] | undefined;
197
+ id?: string | number | undefined;
198
+ }, {
199
+ type: "Feature";
200
+ geometry: GeoJsonGeometry | null;
201
+ properties: Record<string, unknown> | null;
202
+ bbox?: [number, number, number, number] | undefined;
203
+ id?: string | number | undefined;
204
+ }>;
205
+ export type GeoJsonFeature = z.infer<typeof geoJsonFeatureSchema>;
206
+ /**
207
+ * FeatureCollection object.
208
+ * Foreign members (RFC 7946 Section 6.1) are stripped during parse.
209
+ * https://tools.ietf.org/html/rfc7946#section-3.3
210
+ */
211
+ export declare const geoJsonFeatureCollectionSchema: z.ZodObject<{
212
+ type: z.ZodLiteral<"FeatureCollection">;
213
+ features: z.ZodArray<z.ZodObject<{
214
+ type: z.ZodLiteral<"Feature">;
215
+ geometry: z.ZodNullable<z.ZodType<GeoJsonGeometry, z.ZodTypeDef, GeoJsonGeometry>>;
216
+ properties: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
217
+ id: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
218
+ bbox: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>>;
219
+ }, "strip", z.ZodTypeAny, {
220
+ type: "Feature";
221
+ geometry: GeoJsonGeometry | null;
222
+ properties: Record<string, unknown> | null;
223
+ bbox?: [number, number, number, number] | undefined;
224
+ id?: string | number | undefined;
225
+ }, {
226
+ type: "Feature";
227
+ geometry: GeoJsonGeometry | null;
228
+ properties: Record<string, unknown> | null;
229
+ bbox?: [number, number, number, number] | undefined;
230
+ id?: string | number | undefined;
231
+ }>, "many">;
232
+ bbox: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>, [number, number, number, number], [number, number, number, number]>>;
233
+ }, "strip", z.ZodTypeAny, {
234
+ type: "FeatureCollection";
235
+ features: {
236
+ type: "Feature";
237
+ geometry: GeoJsonGeometry | null;
238
+ properties: Record<string, unknown> | null;
239
+ bbox?: [number, number, number, number] | undefined;
240
+ id?: string | number | undefined;
241
+ }[];
242
+ bbox?: [number, number, number, number] | undefined;
243
+ }, {
244
+ type: "FeatureCollection";
245
+ features: {
246
+ type: "Feature";
247
+ geometry: GeoJsonGeometry | null;
248
+ properties: Record<string, unknown> | null;
249
+ bbox?: [number, number, number, number] | undefined;
250
+ id?: string | number | undefined;
251
+ }[];
252
+ bbox?: [number, number, number, number] | undefined;
253
+ }>;
254
+ export type GeoJsonFeatureCollection = z.infer<typeof geoJsonFeatureCollectionSchema>;
@@ -1,18 +1,11 @@
1
1
  import { GeoJsonBbox, GeoJsonLinearRing, GeoJsonMultiPolygon, GeoJsonPoint, GeoJsonPolygon, GeoJsonPosition } from "./GeoJsonSchemas";
2
- import { TuGeoJsonPolygonNoHoles } from "./TuGeoJsonSchemas";
3
2
  export declare const EARTH_RADIUS = 6378137;
4
- export interface TuCoordinate {
5
- longitude: number;
6
- latitude: number;
7
- }
8
- interface TuBoundingBox {
9
- nw: TuCoordinate;
10
- se: TuCoordinate;
11
- }
12
3
  /**
13
- * @description Creates a polygon (with no holes) from a bounding box.
4
+ * @description Creates a polygon from a bounding box.
5
+ * Handles antimeridian-crossing bboxes (where west > east) by splitting into
6
+ * a MultiPolygon with one polygon per hemisphere.
14
7
  */
15
- export declare const getPolygonFromBbox: (bbox: GeoJsonBbox) => TuGeoJsonPolygonNoHoles;
8
+ export declare const getPolygonFromBbox: (bbox: GeoJsonBbox) => GeoJsonPolygon | GeoJsonMultiPolygon;
16
9
  /**
17
10
  * @description Creates a bounding box from a GeoJSON Polygon or MultiPolygon.
18
11
  * Handles cases where the polygon crosses the 180/-180 meridian.
@@ -20,26 +13,15 @@ export declare const getPolygonFromBbox: (bbox: GeoJsonBbox) => TuGeoJsonPolygon
20
13
  export declare const getBboxFromGeoJsonPolygon: (polygon: GeoJsonPolygon | GeoJsonMultiPolygon) => GeoJsonBbox | null;
21
14
  /**
22
15
  * @description Creates a round polygon from a point and a radius.
16
+ * Handles antimeridian crossing per RFC 7946 Section 3.1.9 by splitting
17
+ * into a MultiPolygon. Clamps polar latitudes to [-90, 90].
18
+ *
19
+ * Returns null when the polygon crosses the antimeridian but both hemisphere
20
+ * intersections yield zero polygons (e.g. very small polygons near the
21
+ * dateline). In that case, returning the original coordinates would produce
22
+ * invalid geometry per RFC 7946.
23
23
  */
24
- export declare const getPolygonFromPointAndRadius: (point: GeoJsonPoint, radius: number) => GeoJsonPolygon;
25
- /**
26
- * @description Creates a TU bounding box from a GeoJson Polygon.
27
- * Handles cases where the polygon crosses the 180/-180 meridian.
28
- */
29
- export declare const getBoundingBoxFromGeoJsonPolygon: (polygon: GeoJsonPolygon | GeoJsonMultiPolygon) => TuBoundingBox | null;
30
- /**
31
- * @description Creates a GeoJSON MultiPolygon from a TU bounding box.
32
- * It has to return a MultiPolygon because the polygon may cross the 180/-180 meridian
33
- * and we need to avoid the polygon being ambiguous about which side of the meridian it wraps around.
34
- * so if it crosses the meridian, we return a MultiPolygon with two polygons, one for the western hemisphere and one for the eastern hemisphere.
35
- * @param boundingBox The bounding box to create a polygon from
36
- * @returns {GeoJsonMultiPolygon | GeoJsonPolygon} The polygon created from the bounding box
37
- */
38
- export declare const getGeoJsonPolygonFromBoundingBox: (boundingBox: TuBoundingBox) => GeoJsonMultiPolygon | GeoJsonPolygon;
39
- /**
40
- * @description Creates TU point coordinate from a GeoJSON Point.
41
- */
42
- export declare const getPointCoordinateFromGeoJsonPoint: (point: GeoJsonPoint) => TuCoordinate;
24
+ export declare const getPolygonFromPointAndRadius: (point: GeoJsonPoint, radius: number) => GeoJsonPolygon | GeoJsonMultiPolygon | null;
43
25
  /**
44
26
  * @description Gets the extreme point of a polygon in a given direction.
45
27
  * @param {object} params - The parameters object
@@ -60,27 +42,22 @@ export declare const isGeoJsonPositionInLinearRing: ({ position, linearRing, }:
60
42
  }) => boolean | null;
61
43
  /**
62
44
  * @description Checks if a point is inside a polygon.
45
+ * Correctly handles holes per RFC 7946 Section 3.1.6: the first ring is the
46
+ * exterior boundary, subsequent rings are holes. A point inside a hole is
47
+ * considered outside the polygon.
63
48
  */
64
49
  export declare const isGeoJsonPointInPolygon: ({ point, polygon, }: {
65
50
  point: GeoJsonPoint;
66
51
  polygon: GeoJsonPolygon;
67
52
  }) => boolean | null;
68
53
  /**
69
- * Checks if polygon1/multi-polygon1 is fully contained within polygon2/multi-polygon2
54
+ * Checks if polygon1 is fully contained within polygon2.
55
+ * Correctly handles holes per RFC 7946 Section 3.1.6: a polygon inside
56
+ * a hole of polygon2 is NOT considered contained.
70
57
  */
71
58
  export declare const isFullyContainedInGeoJsonPolygon: (polygon1: GeoJsonPolygon, polygon2: GeoJsonPolygon) => boolean | null;
72
59
  /**
73
60
  * @description Gets the intersection between two GeoJSON polygons/multi-polygons.
74
61
  * Returns a MultiPolygon representing the intersection, or null if there is no intersection.
75
- * @param polygon1 The first polygon/multi-polygon to check intersection
76
- * @param polygon2 The second polygon/multi-polygon to check intersection
77
- * @returns {(GeoJsonMultiPolygon | GeoJsonPolygon)} The intersection as either a Polygon or MultiPolygon
78
62
  */
79
63
  export declare const getGeoJsonPolygonIntersection: (polygon1: GeoJsonPolygon | GeoJsonMultiPolygon, polygon2: GeoJsonPolygon | GeoJsonMultiPolygon) => GeoJsonMultiPolygon | GeoJsonPolygon | null;
80
- /**
81
- * @description Creates a TU bounding box from a GeoJSON Bbox.
82
- * @param bbox The GeoJSON Bbox to create a TU bounding box from
83
- * @returns {TuBoundingBox} The TU bounding box created from the GeoJSON Bbox
84
- */
85
- export declare const getBoundingBoxFromGeoJsonBbox: (bbox: GeoJsonBbox) => TuBoundingBox;
86
- export {};
@@ -16,7 +16,7 @@ interface GeoJsonFeature {
16
16
  * @param inconsistentCoordinates Single point, array of points or nested array of points
17
17
  * @returns {GeoJsonPosition[]} Array of standardized coordinates
18
18
  */
19
- export declare const coordinatesToStandardFormat: (inconsistentCoordinates: GeoJsonPosition | Array<GeoJsonPosition> | Array<Array<GeoJsonPosition>> | null | undefined) => [number, number][];
19
+ export declare const coordinatesToStandardFormat: (inconsistentCoordinates: GeoJsonPosition | Array<GeoJsonPosition> | Array<Array<GeoJsonPosition>> | null | undefined) => ([number, number] | [number, number, number])[];
20
20
  /**
21
21
  * @description Extracts a point coordinate from a GeoJSON object.
22
22
  * @param geoObject A GeoJSON object.
@@ -0,0 +1,42 @@
1
+ import { GeoJsonBbox, GeoJsonMultiPolygon, GeoJsonPoint, GeoJsonPolygon, GeoJsonPosition, GeoJsonPosition2d } from "./GeoJsonSchemas";
2
+ /**
3
+ * @description Converts a GeoJSON position (which may have altitude) to a 2D position.
4
+ */
5
+ export declare const toPosition2d: (position: GeoJsonPosition) => GeoJsonPosition2d;
6
+ export interface TuCoordinate {
7
+ longitude: number;
8
+ latitude: number;
9
+ }
10
+ export interface TuBoundingBox {
11
+ nw: TuCoordinate;
12
+ se: TuCoordinate;
13
+ }
14
+ /**
15
+ * @description Creates a TU bounding box from a GeoJson Polygon.
16
+ * Handles cases where the polygon crosses the 180/-180 meridian.
17
+ */
18
+ export declare const getBoundingBoxFromGeoJsonPolygon: (polygon: GeoJsonPolygon | GeoJsonMultiPolygon) => TuBoundingBox | null;
19
+ /**
20
+ * @description Creates a GeoJSON Polygon or MultiPolygon from a TU bounding box.
21
+ * Returns a MultiPolygon when the bounding box crosses the 180/-180 meridian,
22
+ * with one polygon per hemisphere.
23
+ *
24
+ * Returns a 2D-only coordinate type since bounding boxes have no altitude.
25
+ * The return type is assignable to both GeoJsonPolygon | GeoJsonMultiPolygon
26
+ * (for GeoJSON consumers) and GraphQL AreaInput (for query variables).
27
+ */
28
+ export declare const getGeoJsonPolygonFromBoundingBox: (boundingBox: TuBoundingBox) => {
29
+ type: "MultiPolygon";
30
+ coordinates: Array<Array<Array<GeoJsonPosition2d>>>;
31
+ } | {
32
+ type: "Polygon";
33
+ coordinates: Array<Array<GeoJsonPosition2d>>;
34
+ };
35
+ /**
36
+ * @description Creates TU point coordinate from a GeoJSON Point.
37
+ */
38
+ export declare const getPointCoordinateFromGeoJsonPoint: (point: GeoJsonPoint) => TuCoordinate;
39
+ /**
40
+ * @description Creates a TU bounding box from a GeoJSON Bbox.
41
+ */
42
+ export declare const getBoundingBoxFromGeoJsonBbox: (bbox: GeoJsonBbox) => TuBoundingBox;
@@ -4,16 +4,17 @@ import { z } from "zod";
4
4
  *
5
5
  * Same as geoJsonPolygonSchema but type disallows holes by
6
6
  * using tuple of one single linear ring instead of an array.
7
+ * Foreign members (RFC 7946 Section 6.1) are stripped during parse.
7
8
  */
8
9
  export declare const tuGeoJsonPolygonNoHolesSchema: z.ZodObject<{
9
10
  type: z.ZodLiteral<"Polygon">;
10
- coordinates: z.ZodTuple<[z.ZodEffects<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, "many">, [number, number][], [number, number][]>], null>;
11
- }, "strict", z.ZodTypeAny, {
11
+ coordinates: z.ZodTuple<[z.ZodEffects<z.ZodArray<z.ZodEffects<z.ZodUnion<[z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>]>, [number, number] | [number, number, number], [number, number] | [number, number, number]>, "many">, ([number, number] | [number, number, number])[], ([number, number] | [number, number, number])[]>], null>;
12
+ }, "strip", z.ZodTypeAny, {
12
13
  type: "Polygon";
13
- coordinates: [[number, number][]];
14
+ coordinates: [([number, number] | [number, number, number])[]];
14
15
  }, {
15
16
  type: "Polygon";
16
- coordinates: [[number, number][]];
17
+ coordinates: [([number, number] | [number, number, number])[]];
17
18
  }>;
18
19
  export type TuGeoJsonPolygonNoHoles = z.infer<typeof tuGeoJsonPolygonNoHolesSchema>;
19
20
  /**
@@ -21,38 +22,40 @@ export type TuGeoJsonPolygonNoHoles = z.infer<typeof tuGeoJsonPolygonNoHolesSche
21
22
  * For when you wish to define an area by a point and a radius.
22
23
  *
23
24
  * radius is in meters
25
+ * Foreign members are stripped during parse.
24
26
  */
25
27
  export declare const tuGeoJsonPointRadiusSchema: z.ZodObject<{
26
28
  type: z.ZodLiteral<"PointRadius">;
27
- coordinates: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
29
+ coordinates: z.ZodEffects<z.ZodUnion<[z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>]>, [number, number] | [number, number, number], [number, number] | [number, number, number]>;
28
30
  radius: z.ZodNumber;
29
- }, "strict", z.ZodTypeAny, {
31
+ }, "strip", z.ZodTypeAny, {
30
32
  type: "PointRadius";
31
- coordinates: [number, number];
33
+ coordinates: [number, number] | [number, number, number];
32
34
  radius: number;
33
35
  }, {
34
36
  type: "PointRadius";
35
- coordinates: [number, number];
37
+ coordinates: [number, number] | [number, number, number];
36
38
  radius: number;
37
39
  }>;
38
40
  export type TuGeoJsonPointRadius = z.infer<typeof tuGeoJsonPointRadiusSchema>;
39
41
  /**
40
42
  * A Polygon with exactly 5 points and 4 horizontal/vertical sides that form a normal rectangular box.
43
+ * Foreign members are stripped during parse.
41
44
  */
42
45
  export declare const tuGeoJsonRectangularBoxPolygonSchema: z.ZodEffects<z.ZodObject<{
43
46
  type: z.ZodLiteral<"Polygon">;
44
- coordinates: z.ZodArray<z.ZodEffects<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, "many">, [number, number][], [number, number][]>, "many">;
45
- }, "strict", z.ZodTypeAny, {
47
+ coordinates: z.ZodArray<z.ZodEffects<z.ZodArray<z.ZodEffects<z.ZodUnion<[z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>]>, [number, number] | [number, number, number], [number, number] | [number, number, number]>, "many">, ([number, number] | [number, number, number])[], ([number, number] | [number, number, number])[]>, "many">;
48
+ }, "strip", z.ZodTypeAny, {
46
49
  type: "Polygon";
47
- coordinates: [number, number][][];
50
+ coordinates: ([number, number] | [number, number, number])[][];
48
51
  }, {
49
52
  type: "Polygon";
50
- coordinates: [number, number][][];
53
+ coordinates: ([number, number] | [number, number, number])[][];
51
54
  }>, {
52
55
  type: "Polygon";
53
- coordinates: [number, number][][];
56
+ coordinates: ([number, number] | [number, number, number])[][];
54
57
  }, {
55
58
  type: "Polygon";
56
- coordinates: [number, number][][];
59
+ coordinates: ([number, number] | [number, number, number])[][];
57
60
  }>;
58
61
  export type TuGeoJsonRectangularBoxPolygon = z.infer<typeof tuGeoJsonRectangularBoxPolygonSchema>;
package/src/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from "./GeoJsonSchemas";
2
2
  export * from "./GeoJsonUtils";
3
- export * from "./meridianUtils";
4
- export * from "./TUGeoJsonObjectBridgeUtils";
3
+ export * from "./MeridianUtils";
4
+ export * from "./TuGeoJsonBridgeUtils";
5
+ export * from "./TuGeoJsonConversions";
5
6
  export * from "./TuGeoJsonSchemas";
File without changes