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.
- package/LICENSE +21 -0
- package/README.md +297 -0
- package/dist/bbox.d.ts +25 -0
- package/dist/bbox.d.ts.map +1 -0
- package/dist/bbox.js +98 -0
- package/dist/bbox.js.map +1 -0
- package/dist/crs.d.ts +37 -0
- package/dist/crs.d.ts.map +1 -0
- package/dist/crs.js +81 -0
- package/dist/crs.js.map +1 -0
- package/dist/extensions.d.ts +150 -0
- package/dist/extensions.d.ts.map +1 -0
- package/dist/extensions.js +63 -0
- package/dist/extensions.js.map +1 -0
- package/dist/feature.d.ts +29 -0
- package/dist/feature.d.ts.map +1 -0
- package/dist/feature.js +42 -0
- package/dist/feature.js.map +1 -0
- package/dist/geometry.d.ts +58 -0
- package/dist/geometry.d.ts.map +1 -0
- package/dist/geometry.js +78 -0
- package/dist/geometry.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +108 -0
- package/dist/index.js.map +1 -0
- package/dist/utils.d.ts +19 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +238 -0
- package/dist/utils.js.map +1 -0
- package/package.json +40 -0
- package/src/bbox.ts +142 -0
- package/src/crs.ts +107 -0
- package/src/extensions.ts +231 -0
- package/src/feature.ts +70 -0
- package/src/geometry.ts +138 -0
- package/src/index.ts +156 -0
- package/src/utils.ts +289 -0
|
@@ -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
|
+
}
|