@dsh-gis/dsh-opengis-skill 0.1.0 → 0.1.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.
Files changed (37) hide show
  1. package/.editorconfig +19 -0
  2. package/CHANGELOG.md +96 -0
  3. package/LICENSE +21 -21
  4. package/README.md +91 -30
  5. package/THIRD_PARTY_NOTICES.md +37 -10
  6. package/assets/gdal/reference/raster-tools.md +538 -538
  7. package/assets/gdal/reference/vector-tools.md +149 -149
  8. package/assets/gdal-api/reference/raster-api.md +424 -424
  9. package/assets/gdal-api/reference/vector-api.md +724 -724
  10. package/assets/geometry-api-net/reference/geometry-types.md +243 -243
  11. package/assets/geopandas/reference/core-api.md +221 -221
  12. package/assets/geotools/reference/raster-rendering.md +108 -108
  13. package/assets/geotools/reference/vector-io.md +149 -149
  14. package/assets/jts/reference/geometry-operations.md +303 -303
  15. package/assets/mapsui/SKILL.md +283 -283
  16. package/assets/opengis-all/reference/data-stages.md +608 -608
  17. package/assets/opengis-all/reference/workflow-cheatsheets.md +324 -324
  18. package/assets/opengis-utils-for-java/reference/common-tasks.md +384 -384
  19. package/assets/opengis-utils-for-net/reference/code-patterns.md +124 -124
  20. package/assets/opengis-utils-for-net/reference/util-classes.md +291 -291
  21. package/assets/pyqgis/reference/processing-rendering.md +292 -292
  22. package/assets/pyqgis/reference/vector-raster-layers.md +318 -318
  23. package/assets/qgis-process/SKILL.md +414 -414
  24. package/assets/qgis-process/reference/algorithm-cheatsheet.md +194 -194
  25. package/assets/shapely/reference/operations-reference.md +199 -199
  26. package/cordis.patch.yml +6 -3
  27. package/lib/catalog.d.ts +50 -0
  28. package/lib/catalog.js +238 -0
  29. package/lib/index.d.ts +47 -6
  30. package/lib/index.js +32 -44
  31. package/lib/markdown-links.d.ts +11 -0
  32. package/lib/markdown-links.js +103 -0
  33. package/lib/skill-file.js +104 -17
  34. package/locale/en.json +1 -1
  35. package/locale/zh.json +1 -1
  36. package/package.json +11 -5
  37. package/upstream.json +64 -2
@@ -1,303 +1,303 @@
1
- # JTS Geometry Operations and Index Reference
2
-
3
- > 这是 [../SKILL.md](../SKILL.md) 的补充文件,收录空间关系、集合运算、几何分析、格式读写与空间索引的完整参考。
4
-
5
- ---
6
-
7
- ## 空间关系判断
8
-
9
- ```java
10
- // 八大空间谓词
11
- boolean eq = geomA.equals(geomB); // 几何相等
12
- boolean dj = geomA.disjoint(geomB); // 相离
13
- boolean ix = geomA.intersects(geomB); // 相交
14
- boolean tc = geomA.touches(geomB); // 接触
15
- boolean cr = geomA.crosses(geomB); // 穿越
16
- boolean wn = geomA.within(geomB); // A 在 B 内
17
- boolean ct = geomA.contains(geomB); // A 包含 B
18
- boolean ol = geomA.overlaps(geomB); // 重叠
19
-
20
- // DE-9IM 关系矩阵
21
- boolean rel = geomA.relate(geomB, "T*F**FFF*");
22
- String matrix = geomA.relate(geomB).toString(); // 返回 "212101212" 等
23
-
24
- // 距离判断
25
- boolean near = geomA.isWithinDistance(geomB, 100.0);
26
- ```
27
-
28
- ---
29
-
30
- ## 集合运算
31
-
32
- ```java
33
- // 交集
34
- Geometry intersection = geomA.intersection(geomB);
35
-
36
- // 合并
37
- Geometry union = geomA.union(geomB);
38
-
39
- // 差集
40
- Geometry difference = geomA.difference(geomB);
41
-
42
- // 对称差
43
- Geometry symDiff = geomA.symDifference(geomB);
44
-
45
- // 缓冲区
46
- Geometry buffer = geometry.buffer(10.0); // 默认圆弧端头
47
- Geometry bufferFlat = geometry.buffer(10.0, 8, BufferOp.CAP_FLAT); // 平头端
48
-
49
- // 多几何合并(高性能)
50
- import org.locationtech.jts.operation.union.UnaryUnionOp;
51
- Geometry merged = UnaryUnionOp.union(geometryCollection);
52
-
53
- // 鲁棒叠加运算(推荐)
54
- import org.locationtech.jts.operation.overlayng.OverlayNGRobust;
55
- Geometry robustIntersection = OverlayNGRobust.overlay(geomA, geomB, OverlayNG.INTERSECTION);
56
- Geometry robustUnion = OverlayNGRobust.overlay(geomA, geomB, OverlayNG.UNION);
57
- ```
58
-
59
- ---
60
-
61
- ## 几何分析
62
-
63
- ```java
64
- // 面积与长度
65
- double area = polygon.getArea();
66
- double length = line.getLength();
67
-
68
- // 距离
69
- double dist = geomA.distance(geomB);
70
-
71
- // 质心
72
- Point centroid = geometry.getCentroid();
73
-
74
- // 内部点(保证在几何内部)
75
- Point interiorPoint = geometry.getInteriorPoint();
76
-
77
- // 凸包
78
- Geometry hull = geometry.convexHull();
79
-
80
- // 外接矩形
81
- Envelope env = geometry.getEnvelopeInternal();
82
-
83
- // 有效性检测
84
- boolean valid = geometry.isValid();
85
-
86
- // 详细有效性诊断
87
- import org.locationtech.jts.operation.valid.IsValidOp;
88
- IsValidOp validator = new IsValidOp(geometry);
89
- if (!validator.isValid()) {
90
- System.out.println(validator.getValidationError());
91
- }
92
-
93
- // 几何修复
94
- import org.locationtech.jts.geom.util.GeometryFixer;
95
- Geometry fixed = GeometryFixer.fix(geometry);
96
- ```
97
-
98
- ---
99
-
100
- ## 几何简化
101
-
102
- ```java
103
- import org.locationtech.jts.simplify.TopologyPreservingSimplifier;
104
- import org.locationtech.jts.simplify.DouglasPeuckerSimplifier;
105
-
106
- // 保持拓扑的简化(推荐)
107
- Geometry simplified = TopologyPreservingSimplifier.simplify(geometry, 0.001);
108
-
109
- // Douglas-Peucker 简化(更快,但可能产生自相交)
110
- Geometry dpSimplified = DouglasPeuckerSimplifier.simplify(geometry, 0.001);
111
- ```
112
-
113
- ---
114
-
115
- ## 精度模型
116
-
117
- ```java
118
- // 浮点精度(默认)
119
- PrecisionModel pmFloat = new PrecisionModel();
120
-
121
- // 固定精度(如保留 6 位小数 → scale = 1000000)
122
- PrecisionModel pmFixed = new PrecisionModel(1000000);
123
-
124
- // 使用精度模型创建工厂
125
- GeometryFactory gf = new GeometryFactory(pmFixed);
126
-
127
- // 带 SRID 的工厂
128
- GeometryFactory gfSrid = new GeometryFactory(pmFloat, 4326);
129
- ```
130
-
131
- ---
132
-
133
- ## 格式读写
134
-
135
- ### WKT(Well-Known Text)
136
-
137
- ```java
138
- import org.locationtech.jts.io.WKTReader;
139
- import org.locationtech.jts.io.WKTWriter;
140
-
141
- WKTReader reader = new WKTReader();
142
-
143
- // 读取
144
- Geometry point = reader.read("POINT (116.4 39.9)");
145
- Geometry line = reader.read("LINESTRING (0 0, 10 10, 20 0)");
146
- Geometry poly = reader.read("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))");
147
-
148
- // 写入
149
- WKTWriter writer = new WKTWriter();
150
- String wkt = writer.write(point); // "POINT (116.4 39.9)"
151
-
152
- // 3D WKT
153
- WKTWriter writer3d = new WKTWriter(3);
154
- String wkt3d = writer3d.write(gf.createPoint(new Coordinate(1, 2, 3)));
155
- ```
156
-
157
- ### WKB(Well-Known Binary)
158
-
159
- ```java
160
- import org.locationtech.jts.io.WKBReader;
161
- import org.locationtech.jts.io.WKBWriter;
162
-
163
- // 写入
164
- WKBWriter wkbWriter = new WKBWriter();
165
- byte[] wkb = wkbWriter.write(geometry);
166
-
167
- // 读取
168
- WKBReader wkbReader = new WKBReader();
169
- Geometry geom = wkbReader.read(wkb);
170
-
171
- // 输出 Hex 字符串(常用于数据库交互)
172
- String hex = WKBWriter.toHex(wkb);
173
- byte[] fromHex = WKBReader.hexToBytes(hex);
174
- ```
175
-
176
- ### GeoJSON
177
-
178
- ```java
179
- import org.locationtech.jts.io.geojson.GeoJsonReader;
180
- import org.locationtech.jts.io.geojson.GeoJsonWriter;
181
-
182
- // 读取
183
- GeoJsonReader gjReader = new GeoJsonReader();
184
- Geometry geom = gjReader.read("{\"type\":\"Point\",\"coordinates\":[116.4,39.9]}");
185
-
186
- // 写入
187
- GeoJsonWriter gjWriter = new GeoJsonWriter();
188
- String json = gjWriter.write(geom);
189
- ```
190
-
191
- ---
192
-
193
- ## 空间索引
194
-
195
- ### STRtree(R-tree,推荐用于批量查询)
196
-
197
- ```java
198
- import org.locationtech.jts.index.strtree.STRtree;
199
-
200
- STRtree index = new STRtree();
201
-
202
- // 批量插入(插入后首次查询时自动构建索引)
203
- for (Geometry geom : geometries) {
204
- index.insert(geom.getEnvelopeInternal(), geom);
205
- }
206
-
207
- // 矩形范围查询
208
- Envelope searchEnv = new Envelope(10, 20, 10, 20);
209
- List<?> candidates = index.query(searchEnv);
210
-
211
- // 最近邻查询
212
- import org.locationtech.jts.index.strtree.ItemDistance;
213
- Object nearest = index.nearestNeighbour(
214
- point.getEnvelopeInternal(), point,
215
- (ItemDistance) (itemBoundable1, itemBoundable2) -> {
216
- Geometry g1 = (Geometry) itemBoundable1.getItem();
217
- Geometry g2 = (Geometry) itemBoundable2.getItem();
218
- return g1.distance(g2);
219
- }
220
- );
221
- ```
222
-
223
- ### Quadtree(四叉树,支持动态增删)
224
-
225
- ```java
226
- import org.locationtech.jts.index.quadtree.Quadtree;
227
-
228
- Quadtree qtree = new Quadtree();
229
- qtree.insert(geom.getEnvelopeInternal(), geom);
230
- List<?> results = qtree.query(searchEnv);
231
- qtree.remove(geom.getEnvelopeInternal(), geom);
232
- ```
233
-
234
- ---
235
-
236
- ## PreparedGeometry(加速重复判断)
237
-
238
- 当需要对同一个几何反复进行空间关系判断时(如判断大量点是否在某面内),使用 `PreparedGeometry` 可显著提升性能:
239
-
240
- ```java
241
- import org.locationtech.jts.geom.prep.PreparedGeometry;
242
- import org.locationtech.jts.geom.prep.PreparedGeometryFactory;
243
-
244
- PreparedGeometry prepared = PreparedGeometryFactory.prepare(polygon);
245
-
246
- for (Point pt : points) {
247
- if (prepared.contains(pt)) {
248
- // 命中
249
- }
250
- }
251
- ```
252
-
253
- ---
254
-
255
- ## 线性参考
256
-
257
- ```java
258
- import org.locationtech.jts.linearref.LengthIndexedLine;
259
- import org.locationtech.jts.linearref.LocationIndexedLine;
260
-
261
- LengthIndexedLine lil = new LengthIndexedLine(line);
262
-
263
- // 按长度获取坐标
264
- Coordinate midPoint = lil.extractPoint(line.getLength() / 2);
265
-
266
- // 截取子线
267
- Geometry subLine = lil.extractLine(10.0, 50.0);
268
-
269
- // 计算某点在线上的投影位置(距起点长度)
270
- double index = lil.indexOf(new Coordinate(5, 5));
271
-
272
- // 按位置引用
273
- LocationIndexedLine locLine = new LocationIndexedLine(line);
274
- ```
275
-
276
- ---
277
-
278
- ## 仿射变换
279
-
280
- ```java
281
- import org.locationtech.jts.geom.util.AffineTransformation;
282
-
283
- // 平移
284
- AffineTransformation translate = AffineTransformation.translationInstance(10, 20);
285
- Geometry moved = translate.transform(geometry);
286
-
287
- // 旋转(弧度,绕原点)
288
- AffineTransformation rotate = AffineTransformation.rotationInstance(Math.PI / 4);
289
- Geometry rotated = rotate.transform(geometry);
290
-
291
- // 缩放
292
- AffineTransformation scale = AffineTransformation.scaleInstance(2.0, 2.0);
293
- Geometry scaled = scale.transform(geometry);
294
-
295
- // 组合变换
296
- AffineTransformation combo = new AffineTransformation();
297
- combo.translate(10, 0);
298
- combo.rotate(Math.PI / 6);
299
- Geometry result = combo.transform(geometry);
300
- ```
301
-
302
- ---
303
-
1
+ # JTS Geometry Operations and Index Reference
2
+
3
+ > 这是 [../SKILL.md](../SKILL.md) 的补充文件,收录空间关系、集合运算、几何分析、格式读写与空间索引的完整参考。
4
+
5
+ ---
6
+
7
+ ## 空间关系判断
8
+
9
+ ```java
10
+ // 八大空间谓词
11
+ boolean eq = geomA.equals(geomB); // 几何相等
12
+ boolean dj = geomA.disjoint(geomB); // 相离
13
+ boolean ix = geomA.intersects(geomB); // 相交
14
+ boolean tc = geomA.touches(geomB); // 接触
15
+ boolean cr = geomA.crosses(geomB); // 穿越
16
+ boolean wn = geomA.within(geomB); // A 在 B 内
17
+ boolean ct = geomA.contains(geomB); // A 包含 B
18
+ boolean ol = geomA.overlaps(geomB); // 重叠
19
+
20
+ // DE-9IM 关系矩阵
21
+ boolean rel = geomA.relate(geomB, "T*F**FFF*");
22
+ String matrix = geomA.relate(geomB).toString(); // 返回 "212101212" 等
23
+
24
+ // 距离判断
25
+ boolean near = geomA.isWithinDistance(geomB, 100.0);
26
+ ```
27
+
28
+ ---
29
+
30
+ ## 集合运算
31
+
32
+ ```java
33
+ // 交集
34
+ Geometry intersection = geomA.intersection(geomB);
35
+
36
+ // 合并
37
+ Geometry union = geomA.union(geomB);
38
+
39
+ // 差集
40
+ Geometry difference = geomA.difference(geomB);
41
+
42
+ // 对称差
43
+ Geometry symDiff = geomA.symDifference(geomB);
44
+
45
+ // 缓冲区
46
+ Geometry buffer = geometry.buffer(10.0); // 默认圆弧端头
47
+ Geometry bufferFlat = geometry.buffer(10.0, 8, BufferOp.CAP_FLAT); // 平头端
48
+
49
+ // 多几何合并(高性能)
50
+ import org.locationtech.jts.operation.union.UnaryUnionOp;
51
+ Geometry merged = UnaryUnionOp.union(geometryCollection);
52
+
53
+ // 鲁棒叠加运算(推荐)
54
+ import org.locationtech.jts.operation.overlayng.OverlayNGRobust;
55
+ Geometry robustIntersection = OverlayNGRobust.overlay(geomA, geomB, OverlayNG.INTERSECTION);
56
+ Geometry robustUnion = OverlayNGRobust.overlay(geomA, geomB, OverlayNG.UNION);
57
+ ```
58
+
59
+ ---
60
+
61
+ ## 几何分析
62
+
63
+ ```java
64
+ // 面积与长度
65
+ double area = polygon.getArea();
66
+ double length = line.getLength();
67
+
68
+ // 距离
69
+ double dist = geomA.distance(geomB);
70
+
71
+ // 质心
72
+ Point centroid = geometry.getCentroid();
73
+
74
+ // 内部点(保证在几何内部)
75
+ Point interiorPoint = geometry.getInteriorPoint();
76
+
77
+ // 凸包
78
+ Geometry hull = geometry.convexHull();
79
+
80
+ // 外接矩形
81
+ Envelope env = geometry.getEnvelopeInternal();
82
+
83
+ // 有效性检测
84
+ boolean valid = geometry.isValid();
85
+
86
+ // 详细有效性诊断
87
+ import org.locationtech.jts.operation.valid.IsValidOp;
88
+ IsValidOp validator = new IsValidOp(geometry);
89
+ if (!validator.isValid()) {
90
+ System.out.println(validator.getValidationError());
91
+ }
92
+
93
+ // 几何修复
94
+ import org.locationtech.jts.geom.util.GeometryFixer;
95
+ Geometry fixed = GeometryFixer.fix(geometry);
96
+ ```
97
+
98
+ ---
99
+
100
+ ## 几何简化
101
+
102
+ ```java
103
+ import org.locationtech.jts.simplify.TopologyPreservingSimplifier;
104
+ import org.locationtech.jts.simplify.DouglasPeuckerSimplifier;
105
+
106
+ // 保持拓扑的简化(推荐)
107
+ Geometry simplified = TopologyPreservingSimplifier.simplify(geometry, 0.001);
108
+
109
+ // Douglas-Peucker 简化(更快,但可能产生自相交)
110
+ Geometry dpSimplified = DouglasPeuckerSimplifier.simplify(geometry, 0.001);
111
+ ```
112
+
113
+ ---
114
+
115
+ ## 精度模型
116
+
117
+ ```java
118
+ // 浮点精度(默认)
119
+ PrecisionModel pmFloat = new PrecisionModel();
120
+
121
+ // 固定精度(如保留 6 位小数 → scale = 1000000)
122
+ PrecisionModel pmFixed = new PrecisionModel(1000000);
123
+
124
+ // 使用精度模型创建工厂
125
+ GeometryFactory gf = new GeometryFactory(pmFixed);
126
+
127
+ // 带 SRID 的工厂
128
+ GeometryFactory gfSrid = new GeometryFactory(pmFloat, 4326);
129
+ ```
130
+
131
+ ---
132
+
133
+ ## 格式读写
134
+
135
+ ### WKT(Well-Known Text)
136
+
137
+ ```java
138
+ import org.locationtech.jts.io.WKTReader;
139
+ import org.locationtech.jts.io.WKTWriter;
140
+
141
+ WKTReader reader = new WKTReader();
142
+
143
+ // 读取
144
+ Geometry point = reader.read("POINT (116.4 39.9)");
145
+ Geometry line = reader.read("LINESTRING (0 0, 10 10, 20 0)");
146
+ Geometry poly = reader.read("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))");
147
+
148
+ // 写入
149
+ WKTWriter writer = new WKTWriter();
150
+ String wkt = writer.write(point); // "POINT (116.4 39.9)"
151
+
152
+ // 3D WKT
153
+ WKTWriter writer3d = new WKTWriter(3);
154
+ String wkt3d = writer3d.write(gf.createPoint(new Coordinate(1, 2, 3)));
155
+ ```
156
+
157
+ ### WKB(Well-Known Binary)
158
+
159
+ ```java
160
+ import org.locationtech.jts.io.WKBReader;
161
+ import org.locationtech.jts.io.WKBWriter;
162
+
163
+ // 写入
164
+ WKBWriter wkbWriter = new WKBWriter();
165
+ byte[] wkb = wkbWriter.write(geometry);
166
+
167
+ // 读取
168
+ WKBReader wkbReader = new WKBReader();
169
+ Geometry geom = wkbReader.read(wkb);
170
+
171
+ // 输出 Hex 字符串(常用于数据库交互)
172
+ String hex = WKBWriter.toHex(wkb);
173
+ byte[] fromHex = WKBReader.hexToBytes(hex);
174
+ ```
175
+
176
+ ### GeoJSON
177
+
178
+ ```java
179
+ import org.locationtech.jts.io.geojson.GeoJsonReader;
180
+ import org.locationtech.jts.io.geojson.GeoJsonWriter;
181
+
182
+ // 读取
183
+ GeoJsonReader gjReader = new GeoJsonReader();
184
+ Geometry geom = gjReader.read("{\"type\":\"Point\",\"coordinates\":[116.4,39.9]}");
185
+
186
+ // 写入
187
+ GeoJsonWriter gjWriter = new GeoJsonWriter();
188
+ String json = gjWriter.write(geom);
189
+ ```
190
+
191
+ ---
192
+
193
+ ## 空间索引
194
+
195
+ ### STRtree(R-tree,推荐用于批量查询)
196
+
197
+ ```java
198
+ import org.locationtech.jts.index.strtree.STRtree;
199
+
200
+ STRtree index = new STRtree();
201
+
202
+ // 批量插入(插入后首次查询时自动构建索引)
203
+ for (Geometry geom : geometries) {
204
+ index.insert(geom.getEnvelopeInternal(), geom);
205
+ }
206
+
207
+ // 矩形范围查询
208
+ Envelope searchEnv = new Envelope(10, 20, 10, 20);
209
+ List<?> candidates = index.query(searchEnv);
210
+
211
+ // 最近邻查询
212
+ import org.locationtech.jts.index.strtree.ItemDistance;
213
+ Object nearest = index.nearestNeighbour(
214
+ point.getEnvelopeInternal(), point,
215
+ (ItemDistance) (itemBoundable1, itemBoundable2) -> {
216
+ Geometry g1 = (Geometry) itemBoundable1.getItem();
217
+ Geometry g2 = (Geometry) itemBoundable2.getItem();
218
+ return g1.distance(g2);
219
+ }
220
+ );
221
+ ```
222
+
223
+ ### Quadtree(四叉树,支持动态增删)
224
+
225
+ ```java
226
+ import org.locationtech.jts.index.quadtree.Quadtree;
227
+
228
+ Quadtree qtree = new Quadtree();
229
+ qtree.insert(geom.getEnvelopeInternal(), geom);
230
+ List<?> results = qtree.query(searchEnv);
231
+ qtree.remove(geom.getEnvelopeInternal(), geom);
232
+ ```
233
+
234
+ ---
235
+
236
+ ## PreparedGeometry(加速重复判断)
237
+
238
+ 当需要对同一个几何反复进行空间关系判断时(如判断大量点是否在某面内),使用 `PreparedGeometry` 可显著提升性能:
239
+
240
+ ```java
241
+ import org.locationtech.jts.geom.prep.PreparedGeometry;
242
+ import org.locationtech.jts.geom.prep.PreparedGeometryFactory;
243
+
244
+ PreparedGeometry prepared = PreparedGeometryFactory.prepare(polygon);
245
+
246
+ for (Point pt : points) {
247
+ if (prepared.contains(pt)) {
248
+ // 命中
249
+ }
250
+ }
251
+ ```
252
+
253
+ ---
254
+
255
+ ## 线性参考
256
+
257
+ ```java
258
+ import org.locationtech.jts.linearref.LengthIndexedLine;
259
+ import org.locationtech.jts.linearref.LocationIndexedLine;
260
+
261
+ LengthIndexedLine lil = new LengthIndexedLine(line);
262
+
263
+ // 按长度获取坐标
264
+ Coordinate midPoint = lil.extractPoint(line.getLength() / 2);
265
+
266
+ // 截取子线
267
+ Geometry subLine = lil.extractLine(10.0, 50.0);
268
+
269
+ // 计算某点在线上的投影位置(距起点长度)
270
+ double index = lil.indexOf(new Coordinate(5, 5));
271
+
272
+ // 按位置引用
273
+ LocationIndexedLine locLine = new LocationIndexedLine(line);
274
+ ```
275
+
276
+ ---
277
+
278
+ ## 仿射变换
279
+
280
+ ```java
281
+ import org.locationtech.jts.geom.util.AffineTransformation;
282
+
283
+ // 平移
284
+ AffineTransformation translate = AffineTransformation.translationInstance(10, 20);
285
+ Geometry moved = translate.transform(geometry);
286
+
287
+ // 旋转(弧度,绕原点)
288
+ AffineTransformation rotate = AffineTransformation.rotationInstance(Math.PI / 4);
289
+ Geometry rotated = rotate.transform(geometry);
290
+
291
+ // 缩放
292
+ AffineTransformation scale = AffineTransformation.scaleInstance(2.0, 2.0);
293
+ Geometry scaled = scale.transform(geometry);
294
+
295
+ // 组合变换
296
+ AffineTransformation combo = new AffineTransformation();
297
+ combo.translate(10, 0);
298
+ combo.rotate(Math.PI / 6);
299
+ Geometry result = combo.transform(geometry);
300
+ ```
301
+
302
+ ---
303
+