geo-types-cz 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAgB,MAAM,YAAY,CAAC;AAC1F,OAAO,EAAW,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,IAAI,EAAgB,MAAM,QAAQ,CAAC;AAO5C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD;AAGD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD;AAGD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAcxE;AAGD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAevE;AAGD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,QAAQ,CAmBV;AAGD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CASlE;AAGD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAiB7D;AAGD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAmD9D;AAGD,wBAAgB,8BAA8B,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAiBzF;AAGD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,CA6ExF;AAGD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAiBvE"}
package/dist/utils.js ADDED
@@ -0,0 +1,238 @@
1
+ "use strict";
2
+ /**
3
+ * GIS工具函数
4
+ * 提供常用的地理计算和操作函数
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.degreesToRadians = degreesToRadians;
8
+ exports.radiansToDegrees = radiansToDegrees;
9
+ exports.calculateDistance = calculateDistance;
10
+ exports.calculateBearing = calculateBearing;
11
+ exports.calculateDestination = calculateDestination;
12
+ exports.calculateLineLength = calculateLineLength;
13
+ exports.calculatePolygonArea = calculatePolygonArea;
14
+ exports.calculateGeometryBBox = calculateGeometryBBox;
15
+ exports.calculateFeatureCollectionBBox = calculateFeatureCollectionBBox;
16
+ exports.simplifyLineString = simplifyLineString;
17
+ exports.createBuffer = createBuffer;
18
+ const geometry_1 = require("./geometry");
19
+ const bbox_1 = require("./bbox");
20
+ // 地球半径(米)
21
+ const EARTH_RADIUS = 6378137;
22
+ // 角度转弧度
23
+ function degreesToRadians(degrees) {
24
+ return degrees * (Math.PI / 180);
25
+ }
26
+ // 弧度转角度
27
+ function radiansToDegrees(radians) {
28
+ return radians * (180 / Math.PI);
29
+ }
30
+ // 计算两点间的距离(米)- 使用Haversine公式
31
+ function calculateDistance(pos1, pos2) {
32
+ const [lon1, lat1] = pos1;
33
+ const [lon2, lat2] = pos2;
34
+ const dLat = degreesToRadians(lat2 - lat1);
35
+ const dLon = degreesToRadians(lon2 - lon1);
36
+ const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
37
+ Math.cos(degreesToRadians(lat1)) * Math.cos(degreesToRadians(lat2)) *
38
+ Math.sin(dLon / 2) * Math.sin(dLon / 2);
39
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
40
+ return EARTH_RADIUS * c;
41
+ }
42
+ // 计算方位角(度)
43
+ function calculateBearing(pos1, pos2) {
44
+ const [lon1, lat1] = pos1;
45
+ const [lon2, lat2] = pos2;
46
+ const dLon = degreesToRadians(lon2 - lon1);
47
+ const lat1Rad = degreesToRadians(lat1);
48
+ const lat2Rad = degreesToRadians(lat2);
49
+ const y = Math.sin(dLon) * Math.cos(lat2Rad);
50
+ const x = Math.cos(lat1Rad) * Math.sin(lat2Rad) -
51
+ Math.sin(lat1Rad) * Math.cos(lat2Rad) * Math.cos(dLon);
52
+ const bearing = Math.atan2(y, x);
53
+ return (radiansToDegrees(bearing) + 360) % 360;
54
+ }
55
+ // 根据起点、距离和方位角计算终点
56
+ function calculateDestination(start, distance, bearing) {
57
+ const [lon, lat] = start;
58
+ const bearingRad = degreesToRadians(bearing);
59
+ const latRad = degreesToRadians(lat);
60
+ const lonRad = degreesToRadians(lon);
61
+ const angularDistance = distance / EARTH_RADIUS;
62
+ const destLatRad = Math.asin(Math.sin(latRad) * Math.cos(angularDistance) +
63
+ Math.cos(latRad) * Math.sin(angularDistance) * Math.cos(bearingRad));
64
+ const destLonRad = lonRad + Math.atan2(Math.sin(bearingRad) * Math.sin(angularDistance) * Math.cos(latRad), Math.cos(angularDistance) - Math.sin(latRad) * Math.sin(destLatRad));
65
+ return [radiansToDegrees(destLonRad), radiansToDegrees(destLatRad)];
66
+ }
67
+ // 计算线段长度
68
+ function calculateLineLength(lineString) {
69
+ let totalLength = 0;
70
+ const coordinates = lineString.coordinates;
71
+ for (let i = 1; i < coordinates.length; i++) {
72
+ totalLength += calculateDistance(coordinates[i - 1], coordinates[i]);
73
+ }
74
+ return totalLength;
75
+ }
76
+ // 计算多边形面积(平方米)- 使用球面三角形公式
77
+ function calculatePolygonArea(polygon) {
78
+ const coordinates = polygon.coordinates[0]; // 外环
79
+ let area = 0;
80
+ if (coordinates.length < 3)
81
+ return 0;
82
+ for (let i = 0; i < coordinates.length - 1; i++) {
83
+ const p1 = coordinates[i];
84
+ const p2 = coordinates[i + 1];
85
+ area += degreesToRadians(p2[0] - p1[0]) *
86
+ (2 + Math.sin(degreesToRadians(p1[1])) + Math.sin(degreesToRadians(p2[1])));
87
+ }
88
+ area = Math.abs(area * EARTH_RADIUS * EARTH_RADIUS / 2);
89
+ return area;
90
+ }
91
+ // 计算几何对象的边界框
92
+ function calculateGeometryBBox(geometry) {
93
+ let minLon = Infinity;
94
+ let minLat = Infinity;
95
+ let maxLon = -Infinity;
96
+ let maxLat = -Infinity;
97
+ function processPosition(pos) {
98
+ const [lon, lat] = pos;
99
+ minLon = Math.min(minLon, lon);
100
+ minLat = Math.min(minLat, lat);
101
+ maxLon = Math.max(maxLon, lon);
102
+ maxLat = Math.max(maxLat, lat);
103
+ }
104
+ function processCoordinates(coords) {
105
+ if (Array.isArray(coords[0])) {
106
+ coords.forEach(processCoordinates);
107
+ }
108
+ else {
109
+ processPosition(coords);
110
+ }
111
+ }
112
+ switch (geometry.type) {
113
+ case 'Point':
114
+ processPosition(geometry.coordinates);
115
+ break;
116
+ case 'LineString':
117
+ case 'MultiPoint':
118
+ geometry.coordinates.forEach(processPosition);
119
+ break;
120
+ case 'Polygon':
121
+ case 'MultiLineString':
122
+ geometry.coordinates.forEach(ring => ring.forEach(processPosition));
123
+ break;
124
+ case 'MultiPolygon':
125
+ geometry.coordinates.forEach(polygon => polygon.forEach(ring => ring.forEach(processPosition)));
126
+ break;
127
+ case 'GeometryCollection':
128
+ geometry.geometries.forEach(geom => {
129
+ const bbox = calculateGeometryBBox(geom);
130
+ minLon = Math.min(minLon, bbox[0]);
131
+ minLat = Math.min(minLat, bbox[1]);
132
+ maxLon = Math.max(maxLon, bbox[2]);
133
+ maxLat = Math.max(maxLat, bbox[3]);
134
+ });
135
+ break;
136
+ }
137
+ return (0, bbox_1.createBBox2D)(minLon, minLat, maxLon, maxLat);
138
+ }
139
+ // 计算要素集合的边界框
140
+ function calculateFeatureCollectionBBox(featureCollection) {
141
+ let minLon = Infinity;
142
+ let minLat = Infinity;
143
+ let maxLon = -Infinity;
144
+ let maxLat = -Infinity;
145
+ featureCollection.features.forEach(feature => {
146
+ if (feature.geometry) {
147
+ const bbox = calculateGeometryBBox(feature.geometry);
148
+ minLon = Math.min(minLon, bbox[0]);
149
+ minLat = Math.min(minLat, bbox[1]);
150
+ maxLon = Math.max(maxLon, bbox[2]);
151
+ maxLat = Math.max(maxLat, bbox[3]);
152
+ }
153
+ });
154
+ return (0, bbox_1.createBBox2D)(minLon, minLat, maxLon, maxLat);
155
+ }
156
+ // 简化线段(Douglas-Peucker算法)
157
+ function simplifyLineString(lineString, tolerance) {
158
+ const coordinates = lineString.coordinates;
159
+ if (coordinates.length <= 2) {
160
+ return lineString;
161
+ }
162
+ function perpendicularDistance(point, lineStart, lineEnd) {
163
+ const [x, y] = point;
164
+ const [x1, y1] = lineStart;
165
+ const [x2, y2] = lineEnd;
166
+ const A = x - x1;
167
+ const B = y - y1;
168
+ const C = x2 - x1;
169
+ const D = y2 - y1;
170
+ const dot = A * C + B * D;
171
+ const lenSq = C * C + D * D;
172
+ if (lenSq === 0) {
173
+ return Math.sqrt(A * A + B * B);
174
+ }
175
+ const param = dot / lenSq;
176
+ let xx, yy;
177
+ if (param < 0) {
178
+ xx = x1;
179
+ yy = y1;
180
+ }
181
+ else if (param > 1) {
182
+ xx = x2;
183
+ yy = y2;
184
+ }
185
+ else {
186
+ xx = x1 + param * C;
187
+ yy = y1 + param * D;
188
+ }
189
+ const dx = x - xx;
190
+ const dy = y - yy;
191
+ return Math.sqrt(dx * dx + dy * dy);
192
+ }
193
+ function douglasPeucker(points, tolerance) {
194
+ if (points.length <= 2) {
195
+ return points;
196
+ }
197
+ let maxDistance = 0;
198
+ let maxIndex = 0;
199
+ for (let i = 1; i < points.length - 1; i++) {
200
+ const distance = perpendicularDistance(points[i], points[0], points[points.length - 1]);
201
+ if (distance > maxDistance) {
202
+ maxDistance = distance;
203
+ maxIndex = i;
204
+ }
205
+ }
206
+ if (maxDistance > tolerance) {
207
+ const left = douglasPeucker(points.slice(0, maxIndex + 1), tolerance);
208
+ const right = douglasPeucker(points.slice(maxIndex), tolerance);
209
+ return left.slice(0, -1).concat(right);
210
+ }
211
+ else {
212
+ return [points[0], points[points.length - 1]];
213
+ }
214
+ }
215
+ const simplified = douglasPeucker(coordinates, tolerance);
216
+ return {
217
+ type: lineString.type,
218
+ coordinates: simplified
219
+ };
220
+ }
221
+ // 创建缓冲区(简单的矩形缓冲区)
222
+ function createBuffer(geometry, distance) {
223
+ const [lon, lat] = geometry.coordinates;
224
+ // 简化计算:使用度数作为近似
225
+ const deltaLon = distance / (111320 * Math.cos(degreesToRadians(lat)));
226
+ const deltaLat = distance / 110540;
227
+ return {
228
+ type: geometry_1.GeometryType.Polygon,
229
+ coordinates: [[
230
+ [lon - deltaLon, lat - deltaLat],
231
+ [lon + deltaLon, lat - deltaLat],
232
+ [lon + deltaLon, lat + deltaLat],
233
+ [lon - deltaLon, lat + deltaLat],
234
+ [lon - deltaLon, lat - deltaLat]
235
+ ]]
236
+ };
237
+ }
238
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "geo-types-cz",
3
+ "version": "1.0.0",
4
+ "description": "Complete TypeScript type definitions for GeoJSON and extended GIS types",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "prepublishOnly": "npm run build",
10
+ "test": "echo \"Error: no test specified\" && exit 1",
11
+ "docs:dev": "vitepress dev docs",
12
+ "docs:build": "vitepress build docs",
13
+ "docs:preview": "vitepress preview docs"
14
+ },
15
+ "keywords": [
16
+ "geojson",
17
+ "gis",
18
+ "typescript",
19
+ "types",
20
+ "geometry",
21
+ "mapping",
22
+ "spatial"
23
+ ],
24
+ "author": "Thunder7991",
25
+ "license": "MIT",
26
+ "devDependencies": {
27
+ "typescript": "^5.0.0",
28
+ "vite": "^5.0.0",
29
+ "vitepress": "^1.6.3"
30
+ },
31
+ "files": [
32
+ "dist/**/*",
33
+ "src/**/*",
34
+ "README.md"
35
+ ],
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/Thunder7991/geo-types-cz.git"
39
+ }
40
+ }
package/src/bbox.ts ADDED
@@ -0,0 +1,142 @@
1
+ /**
2
+ * 边界框(BBox)类型定义和工具函数
3
+ */
4
+
5
+ import { Position } from './geometry';
6
+
7
+ // 2D边界框 [west, south, east, north]
8
+ export type BBox2D = [number, number, number, number];
9
+
10
+ // 3D边界框 [west, south, min_elevation, east, north, max_elevation]
11
+ export type BBox3D = [number, number, number, number, number, number];
12
+
13
+ // 边界框联合类型
14
+ export type BBox = BBox2D | BBox3D;
15
+
16
+ // 边界框接口
17
+ export interface BoundingBox {
18
+ west: number;
19
+ south: number;
20
+ east: number;
21
+ north: number;
22
+ minElevation?: number;
23
+ maxElevation?: number;
24
+ }
25
+
26
+ // 类型守卫函数
27
+ export function is2DBBox(bbox: BBox): bbox is BBox2D {
28
+ return bbox.length === 4;
29
+ }
30
+
31
+ export function is3DBBox(bbox: BBox): bbox is BBox3D {
32
+ return bbox.length === 6;
33
+ }
34
+
35
+ // 工具函数
36
+ export function createBBox2D(west: number, south: number, east: number, north: number): BBox2D {
37
+ return [west, south, east, north];
38
+ }
39
+
40
+ export function createBBox3D(
41
+ west: number,
42
+ south: number,
43
+ minElevation: number,
44
+ east: number,
45
+ north: number,
46
+ maxElevation: number
47
+ ): BBox3D {
48
+ return [west, south, minElevation, east, north, maxElevation];
49
+ }
50
+
51
+ // 从边界框数组转换为对象
52
+ export function bboxToObject(bbox: BBox): BoundingBox {
53
+ if (is2DBBox(bbox)) {
54
+ return {
55
+ west: bbox[0],
56
+ south: bbox[1],
57
+ east: bbox[2],
58
+ north: bbox[3]
59
+ };
60
+ } else {
61
+ return {
62
+ west: bbox[0],
63
+ south: bbox[1],
64
+ east: bbox[3],
65
+ north: bbox[4],
66
+ minElevation: bbox[2],
67
+ maxElevation: bbox[5]
68
+ };
69
+ }
70
+ }
71
+
72
+ // 从对象转换为边界框数组
73
+ export function objectToBBox(boundingBox: BoundingBox): BBox {
74
+ if (boundingBox.minElevation !== undefined && boundingBox.maxElevation !== undefined) {
75
+ return createBBox3D(
76
+ boundingBox.west,
77
+ boundingBox.south,
78
+ boundingBox.minElevation,
79
+ boundingBox.east,
80
+ boundingBox.north,
81
+ boundingBox.maxElevation
82
+ );
83
+ } else {
84
+ return createBBox2D(
85
+ boundingBox.west,
86
+ boundingBox.south,
87
+ boundingBox.east,
88
+ boundingBox.north
89
+ );
90
+ }
91
+ }
92
+
93
+ // 计算两个边界框的并集
94
+ export function unionBBox(bbox1: BBox, bbox2: BBox): BBox {
95
+ const obj1 = bboxToObject(bbox1);
96
+ const obj2 = bboxToObject(bbox2);
97
+
98
+ const result: BoundingBox = {
99
+ west: Math.min(obj1.west, obj2.west),
100
+ south: Math.min(obj1.south, obj2.south),
101
+ east: Math.max(obj1.east, obj2.east),
102
+ north: Math.max(obj1.north, obj2.north)
103
+ };
104
+
105
+ if (obj1.minElevation !== undefined && obj2.minElevation !== undefined) {
106
+ result.minElevation = Math.min(obj1.minElevation, obj2.minElevation);
107
+ }
108
+
109
+ if (obj1.maxElevation !== undefined && obj2.maxElevation !== undefined) {
110
+ result.maxElevation = Math.max(obj1.maxElevation, obj2.maxElevation);
111
+ }
112
+
113
+ return objectToBBox(result);
114
+ }
115
+
116
+ // 检查点是否在边界框内
117
+ export function isPositionInBBox(position: Position, bbox: BBox): boolean {
118
+ const [lon, lat, elevation] = position;
119
+ const obj = bboxToObject(bbox);
120
+
121
+ const inBounds = lon >= obj.west && lon <= obj.east && lat >= obj.south && lat <= obj.north;
122
+
123
+ if (elevation !== undefined && obj.minElevation !== undefined && obj.maxElevation !== undefined) {
124
+ return inBounds && elevation >= obj.minElevation && elevation <= obj.maxElevation;
125
+ }
126
+
127
+ return inBounds;
128
+ }
129
+
130
+ // 计算边界框的中心点
131
+ export function getBBoxCenter(bbox: BBox): Position {
132
+ const obj = bboxToObject(bbox);
133
+ const centerLon = (obj.west + obj.east) / 2;
134
+ const centerLat = (obj.south + obj.north) / 2;
135
+
136
+ if (obj.minElevation !== undefined && obj.maxElevation !== undefined) {
137
+ const centerElevation = (obj.minElevation + obj.maxElevation) / 2;
138
+ return [centerLon, centerLat, centerElevation];
139
+ }
140
+
141
+ return [centerLon, centerLat];
142
+ }
package/src/crs.ts ADDED
@@ -0,0 +1,107 @@
1
+ /**
2
+ * 坐标参考系统(CRS)类型定义
3
+ * 虽然GeoJSON RFC 7946不推荐使用CRS,但在实际GIS应用中仍然重要
4
+ */
5
+
6
+ // CRS类型枚举
7
+ export enum CRSType {
8
+ Name = 'name',
9
+ Link = 'link'
10
+ }
11
+
12
+ // 基础CRS接口
13
+ export interface BaseCRS {
14
+ type: CRSType;
15
+ }
16
+
17
+ // 命名CRS
18
+ export interface NamedCRS extends BaseCRS {
19
+ type: CRSType.Name;
20
+ properties: {
21
+ name: string;
22
+ };
23
+ }
24
+
25
+ // 链接CRS
26
+ export interface LinkedCRS extends BaseCRS {
27
+ type: CRSType.Link;
28
+ properties: {
29
+ href: string;
30
+ type?: string;
31
+ };
32
+ }
33
+
34
+ // CRS联合类型
35
+ export type CRS = NamedCRS | LinkedCRS;
36
+
37
+ // 常用的CRS定义
38
+ export const CommonCRS = {
39
+ // WGS84 地理坐标系
40
+ WGS84: {
41
+ type: CRSType.Name,
42
+ properties: {
43
+ name: 'EPSG:4326'
44
+ }
45
+ } as NamedCRS,
46
+
47
+ // Web墨卡托投影
48
+ WebMercator: {
49
+ type: CRSType.Name,
50
+ properties: {
51
+ name: 'EPSG:3857'
52
+ }
53
+ } as NamedCRS,
54
+
55
+ // 中国大地坐标系2000
56
+ CGCS2000: {
57
+ type: CRSType.Name,
58
+ properties: {
59
+ name: 'EPSG:4490'
60
+ }
61
+ } as NamedCRS,
62
+
63
+ // 北京54坐标系
64
+ Beijing54: {
65
+ type: CRSType.Name,
66
+ properties: {
67
+ name: 'EPSG:4214'
68
+ }
69
+ } as NamedCRS,
70
+
71
+ // 西安80坐标系
72
+ Xian80: {
73
+ type: CRSType.Name,
74
+ properties: {
75
+ name: 'EPSG:4610'
76
+ }
77
+ } as NamedCRS
78
+ } as const;
79
+
80
+ // 类型守卫函数
81
+ export function isNamedCRS(crs: CRS): crs is NamedCRS {
82
+ return crs.type === CRSType.Name;
83
+ }
84
+
85
+ export function isLinkedCRS(crs: CRS): crs is LinkedCRS {
86
+ return crs.type === CRSType.Link;
87
+ }
88
+
89
+ // 工具函数
90
+ export function createNamedCRS(name: string): NamedCRS {
91
+ return {
92
+ type: CRSType.Name,
93
+ properties: {
94
+ name
95
+ }
96
+ };
97
+ }
98
+
99
+ export function createLinkedCRS(href: string, type?: string): LinkedCRS {
100
+ return {
101
+ type: CRSType.Link,
102
+ properties: {
103
+ href,
104
+ ...(type && { type })
105
+ }
106
+ };
107
+ }