@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,724 +1,724 @@
1
- # GDAL Vector API Reference
2
-
3
- > 这是 [../SKILL.md](../SKILL.md) 的补充文件,收录 C++/Python/Java/C# 四种语言的矢量读写、格式转换、几何操作与 GeoPackage 示例。
4
-
5
- ---
6
-
7
- ## 矢量数据读取
8
-
9
- ### C++
10
-
11
- ```cpp
12
- #include "ogrsf_frmts.h"
13
-
14
- GDALAllRegister();
15
-
16
- GDALDataset *ds = (GDALDataset *)GDALOpenEx("cities.shp", GDAL_OF_VECTOR, nullptr, nullptr, nullptr);
17
- if (ds == nullptr) { /* 错误处理 */ }
18
-
19
- OGRLayer *layer = ds->GetLayer(0);
20
- layer->ResetReading();
21
-
22
- OGRFeature *feature;
23
- while ((feature = layer->GetNextFeature()) != nullptr) {
24
- // 读取属性
25
- const char *name = feature->GetFieldAsString("NAME");
26
- int pop = feature->GetFieldAsInteger("POPULATION");
27
-
28
- // 读取几何
29
- OGRGeometry *geom = feature->GetGeometryRef();
30
- if (geom != nullptr && wkbFlatten(geom->getGeometryType()) == wkbPoint) {
31
- OGRPoint *pt = (OGRPoint *)geom;
32
- double x = pt->getX();
33
- double y = pt->getY();
34
- }
35
- OGRFeature::DestroyFeature(feature);
36
- }
37
-
38
- GDALClose(ds);
39
- ```
40
-
41
- ### Python
42
-
43
- ```python
44
- from osgeo import ogr
45
-
46
- ds = ogr.Open("cities.shp", 0) # 0 = 只读
47
- if ds is None:
48
- raise RuntimeError("无法打开数据源")
49
-
50
- layer = ds.GetLayer(0)
51
-
52
- for feature in layer:
53
- # 读取属性
54
- name = feature.GetField("NAME")
55
- pop = feature.GetField("POPULATION")
56
-
57
- # 读取几何
58
- geom = feature.GetGeometryRef()
59
- if geom is not None and geom.GetGeometryType() == ogr.wkbPoint:
60
- x = geom.GetX()
61
- y = geom.GetY()
62
-
63
- ds = None
64
- ```
65
-
66
- ### Java
67
-
68
- ```java
69
- import org.gdal.ogr.ogr;
70
- import org.gdal.ogr.DataSource;
71
- import org.gdal.ogr.Layer;
72
- import org.gdal.ogr.Feature;
73
- import org.gdal.ogr.Geometry;
74
-
75
- ogr.RegisterAll();
76
-
77
- DataSource ds = ogr.Open("cities.shp", false); // false = 只读
78
- if (ds == null) { throw new RuntimeException("无法打开数据源"); }
79
-
80
- Layer layer = ds.GetLayer(0);
81
-
82
- Feature feature;
83
- while ((feature = layer.GetNextFeature()) != null) {
84
- // 读取属性
85
- String name = feature.GetFieldAsString("NAME");
86
- int pop = feature.GetFieldAsInteger("POPULATION");
87
-
88
- // 读取几何
89
- Geometry geom = feature.GetGeometryRef();
90
- if (geom != null && geom.GetGeometryType() == ogr.wkbPoint) {
91
- double x = geom.GetX(0);
92
- double y = geom.GetY(0);
93
- }
94
- feature.delete();
95
- }
96
-
97
- ds.delete();
98
- ```
99
-
100
- ### C#
101
-
102
- ```csharp
103
- using OSGeo.OGR;
104
-
105
- Ogr.RegisterAll();
106
-
107
- DataSource ds = Ogr.Open("cities.shp", 0); // 0 = 只读
108
- if (ds == null) { throw new Exception("无法打开数据源"); }
109
-
110
- Layer layer = ds.GetLayerByIndex(0);
111
-
112
- Feature feature;
113
- while ((feature = layer.GetNextFeature()) != null) {
114
- // 读取属性
115
- string name = feature.GetFieldAsString("NAME");
116
- int pop = feature.GetFieldAsInteger("POPULATION");
117
-
118
- // 读取几何
119
- Geometry geom = feature.GetGeometryRef();
120
- if (geom != null && geom.GetGeometryType() == wkbGeometryType.wkbPoint) {
121
- double x = geom.GetX(0);
122
- double y = geom.GetY(0);
123
- }
124
- feature.Dispose();
125
- }
126
-
127
- ds.Dispose();
128
- ```
129
-
130
- ---
131
-
132
- ## 矢量数据创建与写入
133
-
134
- ### C++
135
-
136
- ```cpp
137
- #include "ogrsf_frmts.h"
138
-
139
- GDALAllRegister();
140
-
141
- GDALDriver *driver = GetGDALDriverManager()->GetDriverByName("ESRI Shapefile");
142
- GDALDataset *ds = driver->Create("output.shp", 0, 0, 0, GDT_Unknown, nullptr);
143
-
144
- // 创建图层
145
- OGRSpatialReference srs;
146
- srs.SetWellKnownGeogCS("WGS84");
147
- OGRLayer *layer = ds->CreateLayer("output", &srs, wkbPoint, nullptr);
148
-
149
- // 定义字段
150
- OGRFieldDefn nameField("NAME", OFTString);
151
- nameField.SetWidth(64);
152
- layer->CreateField(&nameField);
153
-
154
- OGRFieldDefn popField("POPULATION", OFTInteger);
155
- layer->CreateField(&popField);
156
-
157
- // 创建要素
158
- OGRFeature *feature = OGRFeature::CreateFeature(layer->GetLayerDefn());
159
- feature->SetField("NAME", "Beijing");
160
- feature->SetField("POPULATION", 21540000);
161
-
162
- OGRPoint pt;
163
- pt.setX(116.4);
164
- pt.setY(39.9);
165
- feature->SetGeometry(&pt);
166
-
167
- layer->CreateFeature(feature);
168
- OGRFeature::DestroyFeature(feature);
169
-
170
- GDALClose(ds);
171
- ```
172
-
173
- ### Python
174
-
175
- ```python
176
- from osgeo import ogr, osr
177
-
178
- driver = ogr.GetDriverByName("ESRI Shapefile")
179
- ds = driver.CreateDataSource("output.shp")
180
-
181
- # 创建图层
182
- srs = osr.SpatialReference()
183
- srs.SetWellKnownGeogCS("WGS84")
184
- layer = ds.CreateLayer("output", srs, ogr.wkbPoint)
185
-
186
- # 定义字段
187
- layer.CreateField(ogr.FieldDefn("NAME", ogr.OFTString))
188
- layer.CreateField(ogr.FieldDefn("POPULATION", ogr.OFTInteger))
189
-
190
- # 创建要素
191
- feature = ogr.Feature(layer.GetLayerDefn())
192
- feature.SetField("NAME", "Beijing")
193
- feature.SetField("POPULATION", 21540000)
194
-
195
- pt = ogr.Geometry(ogr.wkbPoint)
196
- pt.SetPoint_2D(0, 116.4, 39.9)
197
- feature.SetGeometry(pt)
198
-
199
- layer.CreateFeature(feature)
200
- feature = None
201
-
202
- ds = None
203
- ```
204
-
205
- ### Java
206
-
207
- ```java
208
- import org.gdal.ogr.*;
209
- import org.gdal.osr.SpatialReference;
210
-
211
- ogr.RegisterAll();
212
-
213
- Driver driver = ogr.GetDriverByName("ESRI Shapefile");
214
- DataSource ds = driver.CreateDataSource("output.shp");
215
-
216
- // 创建图层
217
- SpatialReference srs = new SpatialReference();
218
- srs.SetWellKnownGeogCS("WGS84");
219
- Layer layer = ds.CreateLayer("output", srs, ogr.wkbPoint);
220
-
221
- // 定义字段
222
- FieldDefn nameField = new FieldDefn("NAME", ogr.OFTString);
223
- nameField.SetWidth(64);
224
- layer.CreateField(nameField);
225
-
226
- FieldDefn popField = new FieldDefn("POPULATION", ogr.OFTInteger);
227
- layer.CreateField(popField);
228
-
229
- // 创建要素
230
- Feature feature = new Feature(layer.GetLayerDefn());
231
- feature.SetField("NAME", "Beijing");
232
- feature.SetField("POPULATION", 21540000);
233
-
234
- Geometry pt = new Geometry(ogr.wkbPoint);
235
- pt.SetPoint_2D(0, 116.4, 39.9);
236
- feature.SetGeometry(pt);
237
-
238
- layer.CreateFeature(feature);
239
- feature.delete();
240
-
241
- ds.delete();
242
- ```
243
-
244
- ### C#
245
-
246
- ```csharp
247
- using OSGeo.OGR;
248
- using OSGeo.OSR;
249
-
250
- Ogr.RegisterAll();
251
-
252
- Driver driver = Ogr.GetDriverByName("ESRI Shapefile");
253
- DataSource ds = driver.CreateDataSource("output.shp", null);
254
-
255
- // 创建图层
256
- SpatialReference srs = new SpatialReference("");
257
- srs.SetWellKnownGeogCS("WGS84");
258
- Layer layer = ds.CreateLayer("output", srs, wkbGeometryType.wkbPoint, null);
259
-
260
- // 定义字段
261
- FieldDefn nameField = new FieldDefn("NAME", FieldType.OFTString);
262
- nameField.SetWidth(64);
263
- layer.CreateField(nameField, 1);
264
-
265
- FieldDefn popField = new FieldDefn("POPULATION", FieldType.OFTInteger);
266
- layer.CreateField(popField, 1);
267
-
268
- // 创建要素
269
- Feature feature = new Feature(layer.GetLayerDefn());
270
- feature.SetField("NAME", "Beijing");
271
- feature.SetField("POPULATION", 21540000);
272
-
273
- Geometry pt = new Geometry(wkbGeometryType.wkbPoint);
274
- pt.SetPoint_2D(0, 116.4, 39.9);
275
- feature.SetGeometry(pt);
276
-
277
- layer.CreateFeature(feature);
278
- feature.Dispose();
279
-
280
- ds.Dispose();
281
- ```
282
-
283
- ---
284
-
285
- ## 矢量格式转换与空间过滤
286
-
287
- ### C++
288
-
289
- ```cpp
290
- #include "ogrsf_frmts.h"
291
-
292
- GDALAllRegister();
293
-
294
- // Shapefile → GeoJSON
295
- GDALDataset *srcDs = (GDALDataset *)GDALOpenEx("input.shp", GDAL_OF_VECTOR, nullptr, nullptr, nullptr);
296
- GDALDriver *jsonDriver = GetGDALDriverManager()->GetDriverByName("GeoJSON");
297
- GDALDataset *dstDs = jsonDriver->Create("output.geojson", 0, 0, 0, GDT_Unknown, nullptr);
298
-
299
- OGRLayer *srcLayer = srcDs->GetLayer(0);
300
-
301
- // 空间过滤(仅北京周边)
302
- OGREnvelope env;
303
- env.MinX = 116.0; env.MaxX = 117.0;
304
- env.MinY = 39.5; env.MaxY = 40.5;
305
- srcLayer->SetSpatialFilterRect(env.MinX, env.MinY, env.MaxX, env.MaxY);
306
-
307
- // 属性过滤
308
- srcLayer->SetAttributeFilter("POPULATION > 1000000");
309
-
310
- // 复制图层
311
- OGRLayer *dstLayer = dstDs->CopyLayer(srcLayer, "filtered");
312
-
313
- GDALClose(dstDs);
314
- GDALClose(srcDs);
315
- ```
316
-
317
- ### Python
318
-
319
- ```python
320
- from osgeo import ogr
321
-
322
- # Shapefile → GeoJSON
323
- src_ds = ogr.Open("input.shp")
324
- src_layer = src_ds.GetLayer(0)
325
-
326
- # 空间过滤
327
- src_layer.SetSpatialFilterRect(116.0, 39.5, 117.0, 40.5)
328
-
329
- # 属性过滤
330
- src_layer.SetAttributeFilter("POPULATION > 1000000")
331
-
332
- # 输出
333
- json_driver = ogr.GetDriverByName("GeoJSON")
334
- dst_ds = json_driver.CreateDataSource("output.geojson")
335
- dst_ds.CopyLayer(src_layer, "filtered")
336
-
337
- dst_ds = None
338
- src_ds = None
339
-
340
- # 或使用 gdal.VectorTranslate(更高级)
341
- from osgeo import gdal
342
-
343
- gdal.VectorTranslate(
344
- "output.geojson",
345
- "input.shp",
346
- format="GeoJSON",
347
- spatFilter=[116.0, 39.5, 117.0, 40.5],
348
- where="POPULATION > 1000000"
349
- )
350
- ```
351
-
352
- ### Java
353
-
354
- ```java
355
- import org.gdal.ogr.*;
356
-
357
- ogr.RegisterAll();
358
-
359
- // Shapefile → GeoJSON
360
- DataSource srcDs = ogr.Open("input.shp", false);
361
- Layer srcLayer = srcDs.GetLayer(0);
362
-
363
- // 空间过滤
364
- srcLayer.SetSpatialFilterRect(116.0, 39.5, 117.0, 40.5);
365
-
366
- // 属性过滤
367
- srcLayer.SetAttributeFilter("POPULATION > 1000000");
368
-
369
- // 输出
370
- Driver jsonDriver = ogr.GetDriverByName("GeoJSON");
371
- DataSource dstDs = jsonDriver.CreateDataSource("output.geojson");
372
- dstDs.CopyLayer(srcLayer, "filtered");
373
-
374
- dstDs.delete();
375
- srcDs.delete();
376
- ```
377
-
378
- ### C#
379
-
380
- ```csharp
381
- using OSGeo.OGR;
382
-
383
- Ogr.RegisterAll();
384
-
385
- // Shapefile → GeoJSON
386
- DataSource srcDs = Ogr.Open("input.shp", 0);
387
- Layer srcLayer = srcDs.GetLayerByIndex(0);
388
-
389
- // 空间过滤
390
- srcLayer.SetSpatialFilterRect(116.0, 39.5, 117.0, 40.5);
391
-
392
- // 属性过滤
393
- srcLayer.SetAttributeFilter("POPULATION > 1000000");
394
-
395
- // 输出
396
- Driver jsonDriver = Ogr.GetDriverByName("GeoJSON");
397
- DataSource dstDs = jsonDriver.CreateDataSource("output.geojson", null);
398
- dstDs.CopyLayer(srcLayer, "filtered", null);
399
-
400
- dstDs.Dispose();
401
- srcDs.Dispose();
402
- ```
403
-
404
- ---
405
-
406
- ## 几何操作
407
-
408
- ### C++
409
-
410
- ```cpp
411
- #include "ogr_geometry.h"
412
-
413
- // 创建几何对象
414
- OGRPoint pt(116.4, 39.9);
415
-
416
- OGRLinearRing ring;
417
- ring.addPoint(0, 0);
418
- ring.addPoint(10, 0);
419
- ring.addPoint(10, 10);
420
- ring.addPoint(0, 10);
421
- ring.closeRings();
422
-
423
- OGRPolygon polygon;
424
- polygon.addRing(&ring);
425
-
426
- // WKT / WKB 互转
427
- char *wkt = nullptr;
428
- polygon.exportToWkt(&wkt);
429
- CPLFree(wkt);
430
-
431
- OGRGeometry *geomFromWkt = nullptr;
432
- OGRGeometryFactory::createFromWkt("POINT(116.4 39.9)", nullptr, &geomFromWkt);
433
- OGRGeometryFactory::destroyGeometry(geomFromWkt);
434
-
435
- // 空间操作
436
- OGRGeometry *buffer = pt.Buffer(1.0); // 缓冲区
437
- OGRGeometry *inter = polygon.Intersection(&pt); // 交集
438
- OGRGeometry *united = polygon.Union(&pt); // 合并
439
- double dist = polygon.Distance(&pt); // 距离
440
- bool contains = polygon.Contains(&pt); // 包含判断
441
- bool intersects = polygon.Intersects(&pt); // 相交判断
442
- double area = polygon.get_Area(); // 面积
443
- double length = polygon.get_Length(); // 周长
444
-
445
- OGRGeometryFactory::destroyGeometry(buffer);
446
- OGRGeometryFactory::destroyGeometry(inter);
447
- OGRGeometryFactory::destroyGeometry(united);
448
- ```
449
-
450
- ### Python
451
-
452
- ```python
453
- from osgeo import ogr
454
-
455
- # 创建几何对象
456
- pt = ogr.Geometry(ogr.wkbPoint)
457
- pt.SetPoint_2D(0, 116.4, 39.9)
458
-
459
- ring = ogr.Geometry(ogr.wkbLinearRing)
460
- ring.AddPoint(0, 0)
461
- ring.AddPoint(10, 0)
462
- ring.AddPoint(10, 10)
463
- ring.AddPoint(0, 10)
464
- ring.CloseRings()
465
-
466
- polygon = ogr.Geometry(ogr.wkbPolygon)
467
- polygon.AddGeometry(ring)
468
-
469
- # WKT / WKB 互转
470
- wkt = polygon.ExportToWkt()
471
- geom_from_wkt = ogr.CreateGeometryFromWkt("POINT(116.4 39.9)")
472
- geom_from_json = ogr.CreateGeometryFromJson('{"type":"Point","coordinates":[116.4,39.9]}')
473
-
474
- # 空间操作
475
- buffer = pt.Buffer(1.0) # 缓冲区
476
- inter = polygon.Intersection(pt) # 交集
477
- united = polygon.Union(pt) # 合并
478
- dist = polygon.Distance(pt) # 距离
479
- contains = polygon.Contains(pt) # 包含判断
480
- intersects = polygon.Intersects(pt) # 相交判断
481
- area = polygon.GetArea() # 面积
482
- length = polygon.Length() # 周长
483
- ```
484
-
485
- ### Java
486
-
487
- ```java
488
- import org.gdal.ogr.Geometry;
489
- import org.gdal.ogr.ogr;
490
-
491
- // 创建几何对象
492
- Geometry pt = new Geometry(ogr.wkbPoint);
493
- pt.SetPoint_2D(0, 116.4, 39.9);
494
-
495
- Geometry ring = new Geometry(ogr.wkbLinearRing);
496
- ring.AddPoint(0, 0, 0);
497
- ring.AddPoint(10, 0, 0);
498
- ring.AddPoint(10, 10, 0);
499
- ring.AddPoint(0, 10, 0);
500
- ring.CloseRings();
501
-
502
- Geometry polygon = new Geometry(ogr.wkbPolygon);
503
- polygon.AddGeometry(ring);
504
-
505
- // WKT / WKB 互转
506
- String wkt = polygon.ExportToWkt();
507
- Geometry geomFromWkt = Geometry.CreateFromWkt("POINT(116.4 39.9)");
508
-
509
- // 空间操作
510
- Geometry buffer = pt.Buffer(1.0); // 缓冲区
511
- Geometry inter = polygon.Intersection(pt); // 交集
512
- Geometry united = polygon.Union(pt); // 合并
513
- double dist = polygon.Distance(pt); // 距离
514
- boolean contains = polygon.Contains(pt); // 包含判断
515
- boolean intersects = polygon.Intersects(pt); // 相交判断
516
- double area = polygon.GetArea(); // 面积
517
- ```
518
-
519
- ### C#
520
-
521
- ```csharp
522
- using OSGeo.OGR;
523
-
524
- // 创建几何对象
525
- Geometry pt = new Geometry(wkbGeometryType.wkbPoint);
526
- pt.SetPoint_2D(0, 116.4, 39.9);
527
-
528
- Geometry ring = new Geometry(wkbGeometryType.wkbLinearRing);
529
- ring.AddPoint(0, 0, 0);
530
- ring.AddPoint(10, 0, 0);
531
- ring.AddPoint(10, 10, 0);
532
- ring.AddPoint(0, 10, 0);
533
- ring.CloseRings();
534
-
535
- Geometry polygon = new Geometry(wkbGeometryType.wkbPolygon);
536
- polygon.AddGeometry(ring);
537
-
538
- // WKT / WKB 互转
539
- string wkt;
540
- polygon.ExportToWkt(out wkt);
541
- Geometry geomFromWkt = Geometry.CreateFromWkt("POINT(116.4 39.9)");
542
-
543
- // 空间操作
544
- Geometry buffer = pt.Buffer(1.0, 30); // 缓冲区
545
- Geometry inter = polygon.Intersection(pt); // 交集
546
- Geometry united = polygon.Union(pt); // 合并
547
- double dist = polygon.Distance(pt); // 距离
548
- bool contains = polygon.Contains(pt); // 包含判断
549
- bool intersects = polygon.Intersects(pt); // 相交判断
550
- double area = polygon.GetArea(); // 面积
551
- ```
552
-
553
- ---
554
-
555
- ## GeoPackage 读写
556
-
557
- GeoPackage 是 OGC 标准的轻量级地理数据库格式,适合替代 Shapefile。
558
-
559
- ### C++
560
-
561
- ```cpp
562
- #include "ogrsf_frmts.h"
563
-
564
- GDALAllRegister();
565
-
566
- // 创建 GeoPackage
567
- GDALDriver *driver = GetGDALDriverManager()->GetDriverByName("GPKG");
568
- GDALDataset *ds = driver->Create("data.gpkg", 0, 0, 0, GDT_Unknown, nullptr);
569
-
570
- OGRSpatialReference srs;
571
- srs.importFromEPSG(4326);
572
- OGRLayer *layer = ds->CreateLayer("points", &srs, wkbPoint, nullptr);
573
-
574
- OGRFieldDefn field("name", OFTString);
575
- layer->CreateField(&field);
576
-
577
- OGRFeature *f = OGRFeature::CreateFeature(layer->GetLayerDefn());
578
- f->SetField("name", "TestPoint");
579
- OGRPoint pt(116.4, 39.9);
580
- f->SetGeometry(&pt);
581
- layer->CreateFeature(f);
582
- OGRFeature::DestroyFeature(f);
583
-
584
- GDALClose(ds);
585
-
586
- // 读取 GeoPackage
587
- GDALDataset *readDs = (GDALDataset *)GDALOpenEx("data.gpkg", GDAL_OF_VECTOR, nullptr, nullptr, nullptr);
588
- OGRLayer *readLayer = readDs->GetLayerByName("points");
589
- readLayer->ResetReading();
590
- OGRFeature *rf;
591
- while ((rf = readLayer->GetNextFeature()) != nullptr) {
592
- printf("%s\n", rf->GetFieldAsString("name"));
593
- OGRFeature::DestroyFeature(rf);
594
- }
595
- GDALClose(readDs);
596
- ```
597
-
598
- ### Python
599
-
600
- ```python
601
- from osgeo import ogr, osr
602
-
603
- # 创建 GeoPackage
604
- driver = ogr.GetDriverByName("GPKG")
605
- ds = driver.CreateDataSource("data.gpkg")
606
-
607
- srs = osr.SpatialReference()
608
- srs.ImportFromEPSG(4326)
609
- layer = ds.CreateLayer("points", srs, ogr.wkbPoint)
610
-
611
- layer.CreateField(ogr.FieldDefn("name", ogr.OFTString))
612
-
613
- feature = ogr.Feature(layer.GetLayerDefn())
614
- feature.SetField("name", "TestPoint")
615
- pt = ogr.Geometry(ogr.wkbPoint)
616
- pt.SetPoint_2D(0, 116.4, 39.9)
617
- feature.SetGeometry(pt)
618
- layer.CreateFeature(feature)
619
-
620
- ds = None
621
-
622
- # 读取 GeoPackage
623
- ds = ogr.Open("data.gpkg")
624
- layer = ds.GetLayerByName("points")
625
- for f in layer:
626
- print(f.GetField("name"))
627
- ds = None
628
- ```
629
-
630
- ### Java
631
-
632
- ```java
633
- import org.gdal.ogr.*;
634
- import org.gdal.osr.SpatialReference;
635
-
636
- ogr.RegisterAll();
637
-
638
- // 创建 GeoPackage
639
- Driver driver = ogr.GetDriverByName("GPKG");
640
- DataSource ds = driver.CreateDataSource("data.gpkg");
641
-
642
- SpatialReference srs = new SpatialReference();
643
- srs.ImportFromEPSG(4326);
644
- Layer layer = ds.CreateLayer("points", srs, ogr.wkbPoint);
645
-
646
- layer.CreateField(new FieldDefn("name", ogr.OFTString));
647
-
648
- Feature feature = new Feature(layer.GetLayerDefn());
649
- feature.SetField("name", "TestPoint");
650
- Geometry pt = new Geometry(ogr.wkbPoint);
651
- pt.SetPoint_2D(0, 116.4, 39.9);
652
- feature.SetGeometry(pt);
653
- layer.CreateFeature(feature);
654
-
655
- ds.delete();
656
-
657
- // 读取 GeoPackage
658
- DataSource readDs = ogr.Open("data.gpkg", false);
659
- Layer readLayer = readDs.GetLayerByName("points");
660
- Feature f;
661
- while ((f = readLayer.GetNextFeature()) != null) {
662
- System.out.println(f.GetFieldAsString("name"));
663
- f.delete();
664
- }
665
- readDs.delete();
666
- ```
667
-
668
- ### C#
669
-
670
- ```csharp
671
- using OSGeo.OGR;
672
- using OSGeo.OSR;
673
-
674
- Ogr.RegisterAll();
675
-
676
- // 创建 GeoPackage
677
- Driver driver = Ogr.GetDriverByName("GPKG");
678
- DataSource ds = driver.CreateDataSource("data.gpkg", null);
679
-
680
- SpatialReference srs = new SpatialReference("");
681
- srs.ImportFromEPSG(4326);
682
- Layer layer = ds.CreateLayer("points", srs, wkbGeometryType.wkbPoint, null);
683
-
684
- layer.CreateField(new FieldDefn("name", FieldType.OFTString), 1);
685
-
686
- Feature feature = new Feature(layer.GetLayerDefn());
687
- feature.SetField("name", "TestPoint");
688
- Geometry pt = new Geometry(wkbGeometryType.wkbPoint);
689
- pt.SetPoint_2D(0, 116.4, 39.9);
690
- feature.SetGeometry(pt);
691
- layer.CreateFeature(feature);
692
-
693
- ds.Dispose();
694
-
695
- // 读取 GeoPackage
696
- DataSource readDs = Ogr.Open("data.gpkg", 0);
697
- Layer readLayer = readDs.GetLayerByName("points");
698
- Feature f;
699
- while ((f = readLayer.GetNextFeature()) != null) {
700
- Console.WriteLine(f.GetFieldAsString("name"));
701
- f.Dispose();
702
- }
703
- readDs.Dispose();
704
- ```
705
-
706
- ---
707
-
708
- ## 常用矢量数据格式
709
-
710
- | 驱动名 | 扩展名 | 说明 |
711
- |---|---|---|
712
- | `ESRI Shapefile` | `.shp` | ESRI Shapefile,经典矢量格式 |
713
- | `GeoJSON` | `.geojson` | GeoJSON,Web 友好格式 |
714
- | `GPKG` | `.gpkg` | GeoPackage,OGC 标准轻量数据库 |
715
- | `PostgreSQL` / `PostGIS` | — | PostGIS 空间数据库 |
716
- | `FlatGeobuf` | `.fgb` | 高性能流式二进制格式 |
717
- | `GML` | `.gml` | OGC GML 格式 |
718
- | `KML` | `.kml` | Google Earth 格式 |
719
- | `CSV` | `.csv` | 逗号分隔值(配合 VRT 指定几何列) |
720
- | `SQLite` | `.sqlite` | SQLite / SpatiaLite 数据库 |
721
- | `XLSX` | `.xlsx` | Excel 表格(只读) |
722
-
723
- ---
724
-
1
+ # GDAL Vector API Reference
2
+
3
+ > 这是 [../SKILL.md](../SKILL.md) 的补充文件,收录 C++/Python/Java/C# 四种语言的矢量读写、格式转换、几何操作与 GeoPackage 示例。
4
+
5
+ ---
6
+
7
+ ## 矢量数据读取
8
+
9
+ ### C++
10
+
11
+ ```cpp
12
+ #include "ogrsf_frmts.h"
13
+
14
+ GDALAllRegister();
15
+
16
+ GDALDataset *ds = (GDALDataset *)GDALOpenEx("cities.shp", GDAL_OF_VECTOR, nullptr, nullptr, nullptr);
17
+ if (ds == nullptr) { /* 错误处理 */ }
18
+
19
+ OGRLayer *layer = ds->GetLayer(0);
20
+ layer->ResetReading();
21
+
22
+ OGRFeature *feature;
23
+ while ((feature = layer->GetNextFeature()) != nullptr) {
24
+ // 读取属性
25
+ const char *name = feature->GetFieldAsString("NAME");
26
+ int pop = feature->GetFieldAsInteger("POPULATION");
27
+
28
+ // 读取几何
29
+ OGRGeometry *geom = feature->GetGeometryRef();
30
+ if (geom != nullptr && wkbFlatten(geom->getGeometryType()) == wkbPoint) {
31
+ OGRPoint *pt = (OGRPoint *)geom;
32
+ double x = pt->getX();
33
+ double y = pt->getY();
34
+ }
35
+ OGRFeature::DestroyFeature(feature);
36
+ }
37
+
38
+ GDALClose(ds);
39
+ ```
40
+
41
+ ### Python
42
+
43
+ ```python
44
+ from osgeo import ogr
45
+
46
+ ds = ogr.Open("cities.shp", 0) # 0 = 只读
47
+ if ds is None:
48
+ raise RuntimeError("无法打开数据源")
49
+
50
+ layer = ds.GetLayer(0)
51
+
52
+ for feature in layer:
53
+ # 读取属性
54
+ name = feature.GetField("NAME")
55
+ pop = feature.GetField("POPULATION")
56
+
57
+ # 读取几何
58
+ geom = feature.GetGeometryRef()
59
+ if geom is not None and geom.GetGeometryType() == ogr.wkbPoint:
60
+ x = geom.GetX()
61
+ y = geom.GetY()
62
+
63
+ ds = None
64
+ ```
65
+
66
+ ### Java
67
+
68
+ ```java
69
+ import org.gdal.ogr.ogr;
70
+ import org.gdal.ogr.DataSource;
71
+ import org.gdal.ogr.Layer;
72
+ import org.gdal.ogr.Feature;
73
+ import org.gdal.ogr.Geometry;
74
+
75
+ ogr.RegisterAll();
76
+
77
+ DataSource ds = ogr.Open("cities.shp", false); // false = 只读
78
+ if (ds == null) { throw new RuntimeException("无法打开数据源"); }
79
+
80
+ Layer layer = ds.GetLayer(0);
81
+
82
+ Feature feature;
83
+ while ((feature = layer.GetNextFeature()) != null) {
84
+ // 读取属性
85
+ String name = feature.GetFieldAsString("NAME");
86
+ int pop = feature.GetFieldAsInteger("POPULATION");
87
+
88
+ // 读取几何
89
+ Geometry geom = feature.GetGeometryRef();
90
+ if (geom != null && geom.GetGeometryType() == ogr.wkbPoint) {
91
+ double x = geom.GetX(0);
92
+ double y = geom.GetY(0);
93
+ }
94
+ feature.delete();
95
+ }
96
+
97
+ ds.delete();
98
+ ```
99
+
100
+ ### C#
101
+
102
+ ```csharp
103
+ using OSGeo.OGR;
104
+
105
+ Ogr.RegisterAll();
106
+
107
+ DataSource ds = Ogr.Open("cities.shp", 0); // 0 = 只读
108
+ if (ds == null) { throw new Exception("无法打开数据源"); }
109
+
110
+ Layer layer = ds.GetLayerByIndex(0);
111
+
112
+ Feature feature;
113
+ while ((feature = layer.GetNextFeature()) != null) {
114
+ // 读取属性
115
+ string name = feature.GetFieldAsString("NAME");
116
+ int pop = feature.GetFieldAsInteger("POPULATION");
117
+
118
+ // 读取几何
119
+ Geometry geom = feature.GetGeometryRef();
120
+ if (geom != null && geom.GetGeometryType() == wkbGeometryType.wkbPoint) {
121
+ double x = geom.GetX(0);
122
+ double y = geom.GetY(0);
123
+ }
124
+ feature.Dispose();
125
+ }
126
+
127
+ ds.Dispose();
128
+ ```
129
+
130
+ ---
131
+
132
+ ## 矢量数据创建与写入
133
+
134
+ ### C++
135
+
136
+ ```cpp
137
+ #include "ogrsf_frmts.h"
138
+
139
+ GDALAllRegister();
140
+
141
+ GDALDriver *driver = GetGDALDriverManager()->GetDriverByName("ESRI Shapefile");
142
+ GDALDataset *ds = driver->Create("output.shp", 0, 0, 0, GDT_Unknown, nullptr);
143
+
144
+ // 创建图层
145
+ OGRSpatialReference srs;
146
+ srs.SetWellKnownGeogCS("WGS84");
147
+ OGRLayer *layer = ds->CreateLayer("output", &srs, wkbPoint, nullptr);
148
+
149
+ // 定义字段
150
+ OGRFieldDefn nameField("NAME", OFTString);
151
+ nameField.SetWidth(64);
152
+ layer->CreateField(&nameField);
153
+
154
+ OGRFieldDefn popField("POPULATION", OFTInteger);
155
+ layer->CreateField(&popField);
156
+
157
+ // 创建要素
158
+ OGRFeature *feature = OGRFeature::CreateFeature(layer->GetLayerDefn());
159
+ feature->SetField("NAME", "Beijing");
160
+ feature->SetField("POPULATION", 21540000);
161
+
162
+ OGRPoint pt;
163
+ pt.setX(116.4);
164
+ pt.setY(39.9);
165
+ feature->SetGeometry(&pt);
166
+
167
+ layer->CreateFeature(feature);
168
+ OGRFeature::DestroyFeature(feature);
169
+
170
+ GDALClose(ds);
171
+ ```
172
+
173
+ ### Python
174
+
175
+ ```python
176
+ from osgeo import ogr, osr
177
+
178
+ driver = ogr.GetDriverByName("ESRI Shapefile")
179
+ ds = driver.CreateDataSource("output.shp")
180
+
181
+ # 创建图层
182
+ srs = osr.SpatialReference()
183
+ srs.SetWellKnownGeogCS("WGS84")
184
+ layer = ds.CreateLayer("output", srs, ogr.wkbPoint)
185
+
186
+ # 定义字段
187
+ layer.CreateField(ogr.FieldDefn("NAME", ogr.OFTString))
188
+ layer.CreateField(ogr.FieldDefn("POPULATION", ogr.OFTInteger))
189
+
190
+ # 创建要素
191
+ feature = ogr.Feature(layer.GetLayerDefn())
192
+ feature.SetField("NAME", "Beijing")
193
+ feature.SetField("POPULATION", 21540000)
194
+
195
+ pt = ogr.Geometry(ogr.wkbPoint)
196
+ pt.SetPoint_2D(0, 116.4, 39.9)
197
+ feature.SetGeometry(pt)
198
+
199
+ layer.CreateFeature(feature)
200
+ feature = None
201
+
202
+ ds = None
203
+ ```
204
+
205
+ ### Java
206
+
207
+ ```java
208
+ import org.gdal.ogr.*;
209
+ import org.gdal.osr.SpatialReference;
210
+
211
+ ogr.RegisterAll();
212
+
213
+ Driver driver = ogr.GetDriverByName("ESRI Shapefile");
214
+ DataSource ds = driver.CreateDataSource("output.shp");
215
+
216
+ // 创建图层
217
+ SpatialReference srs = new SpatialReference();
218
+ srs.SetWellKnownGeogCS("WGS84");
219
+ Layer layer = ds.CreateLayer("output", srs, ogr.wkbPoint);
220
+
221
+ // 定义字段
222
+ FieldDefn nameField = new FieldDefn("NAME", ogr.OFTString);
223
+ nameField.SetWidth(64);
224
+ layer.CreateField(nameField);
225
+
226
+ FieldDefn popField = new FieldDefn("POPULATION", ogr.OFTInteger);
227
+ layer.CreateField(popField);
228
+
229
+ // 创建要素
230
+ Feature feature = new Feature(layer.GetLayerDefn());
231
+ feature.SetField("NAME", "Beijing");
232
+ feature.SetField("POPULATION", 21540000);
233
+
234
+ Geometry pt = new Geometry(ogr.wkbPoint);
235
+ pt.SetPoint_2D(0, 116.4, 39.9);
236
+ feature.SetGeometry(pt);
237
+
238
+ layer.CreateFeature(feature);
239
+ feature.delete();
240
+
241
+ ds.delete();
242
+ ```
243
+
244
+ ### C#
245
+
246
+ ```csharp
247
+ using OSGeo.OGR;
248
+ using OSGeo.OSR;
249
+
250
+ Ogr.RegisterAll();
251
+
252
+ Driver driver = Ogr.GetDriverByName("ESRI Shapefile");
253
+ DataSource ds = driver.CreateDataSource("output.shp", null);
254
+
255
+ // 创建图层
256
+ SpatialReference srs = new SpatialReference("");
257
+ srs.SetWellKnownGeogCS("WGS84");
258
+ Layer layer = ds.CreateLayer("output", srs, wkbGeometryType.wkbPoint, null);
259
+
260
+ // 定义字段
261
+ FieldDefn nameField = new FieldDefn("NAME", FieldType.OFTString);
262
+ nameField.SetWidth(64);
263
+ layer.CreateField(nameField, 1);
264
+
265
+ FieldDefn popField = new FieldDefn("POPULATION", FieldType.OFTInteger);
266
+ layer.CreateField(popField, 1);
267
+
268
+ // 创建要素
269
+ Feature feature = new Feature(layer.GetLayerDefn());
270
+ feature.SetField("NAME", "Beijing");
271
+ feature.SetField("POPULATION", 21540000);
272
+
273
+ Geometry pt = new Geometry(wkbGeometryType.wkbPoint);
274
+ pt.SetPoint_2D(0, 116.4, 39.9);
275
+ feature.SetGeometry(pt);
276
+
277
+ layer.CreateFeature(feature);
278
+ feature.Dispose();
279
+
280
+ ds.Dispose();
281
+ ```
282
+
283
+ ---
284
+
285
+ ## 矢量格式转换与空间过滤
286
+
287
+ ### C++
288
+
289
+ ```cpp
290
+ #include "ogrsf_frmts.h"
291
+
292
+ GDALAllRegister();
293
+
294
+ // Shapefile → GeoJSON
295
+ GDALDataset *srcDs = (GDALDataset *)GDALOpenEx("input.shp", GDAL_OF_VECTOR, nullptr, nullptr, nullptr);
296
+ GDALDriver *jsonDriver = GetGDALDriverManager()->GetDriverByName("GeoJSON");
297
+ GDALDataset *dstDs = jsonDriver->Create("output.geojson", 0, 0, 0, GDT_Unknown, nullptr);
298
+
299
+ OGRLayer *srcLayer = srcDs->GetLayer(0);
300
+
301
+ // 空间过滤(仅北京周边)
302
+ OGREnvelope env;
303
+ env.MinX = 116.0; env.MaxX = 117.0;
304
+ env.MinY = 39.5; env.MaxY = 40.5;
305
+ srcLayer->SetSpatialFilterRect(env.MinX, env.MinY, env.MaxX, env.MaxY);
306
+
307
+ // 属性过滤
308
+ srcLayer->SetAttributeFilter("POPULATION > 1000000");
309
+
310
+ // 复制图层
311
+ OGRLayer *dstLayer = dstDs->CopyLayer(srcLayer, "filtered");
312
+
313
+ GDALClose(dstDs);
314
+ GDALClose(srcDs);
315
+ ```
316
+
317
+ ### Python
318
+
319
+ ```python
320
+ from osgeo import ogr
321
+
322
+ # Shapefile → GeoJSON
323
+ src_ds = ogr.Open("input.shp")
324
+ src_layer = src_ds.GetLayer(0)
325
+
326
+ # 空间过滤
327
+ src_layer.SetSpatialFilterRect(116.0, 39.5, 117.0, 40.5)
328
+
329
+ # 属性过滤
330
+ src_layer.SetAttributeFilter("POPULATION > 1000000")
331
+
332
+ # 输出
333
+ json_driver = ogr.GetDriverByName("GeoJSON")
334
+ dst_ds = json_driver.CreateDataSource("output.geojson")
335
+ dst_ds.CopyLayer(src_layer, "filtered")
336
+
337
+ dst_ds = None
338
+ src_ds = None
339
+
340
+ # 或使用 gdal.VectorTranslate(更高级)
341
+ from osgeo import gdal
342
+
343
+ gdal.VectorTranslate(
344
+ "output.geojson",
345
+ "input.shp",
346
+ format="GeoJSON",
347
+ spatFilter=[116.0, 39.5, 117.0, 40.5],
348
+ where="POPULATION > 1000000"
349
+ )
350
+ ```
351
+
352
+ ### Java
353
+
354
+ ```java
355
+ import org.gdal.ogr.*;
356
+
357
+ ogr.RegisterAll();
358
+
359
+ // Shapefile → GeoJSON
360
+ DataSource srcDs = ogr.Open("input.shp", false);
361
+ Layer srcLayer = srcDs.GetLayer(0);
362
+
363
+ // 空间过滤
364
+ srcLayer.SetSpatialFilterRect(116.0, 39.5, 117.0, 40.5);
365
+
366
+ // 属性过滤
367
+ srcLayer.SetAttributeFilter("POPULATION > 1000000");
368
+
369
+ // 输出
370
+ Driver jsonDriver = ogr.GetDriverByName("GeoJSON");
371
+ DataSource dstDs = jsonDriver.CreateDataSource("output.geojson");
372
+ dstDs.CopyLayer(srcLayer, "filtered");
373
+
374
+ dstDs.delete();
375
+ srcDs.delete();
376
+ ```
377
+
378
+ ### C#
379
+
380
+ ```csharp
381
+ using OSGeo.OGR;
382
+
383
+ Ogr.RegisterAll();
384
+
385
+ // Shapefile → GeoJSON
386
+ DataSource srcDs = Ogr.Open("input.shp", 0);
387
+ Layer srcLayer = srcDs.GetLayerByIndex(0);
388
+
389
+ // 空间过滤
390
+ srcLayer.SetSpatialFilterRect(116.0, 39.5, 117.0, 40.5);
391
+
392
+ // 属性过滤
393
+ srcLayer.SetAttributeFilter("POPULATION > 1000000");
394
+
395
+ // 输出
396
+ Driver jsonDriver = Ogr.GetDriverByName("GeoJSON");
397
+ DataSource dstDs = jsonDriver.CreateDataSource("output.geojson", null);
398
+ dstDs.CopyLayer(srcLayer, "filtered", null);
399
+
400
+ dstDs.Dispose();
401
+ srcDs.Dispose();
402
+ ```
403
+
404
+ ---
405
+
406
+ ## 几何操作
407
+
408
+ ### C++
409
+
410
+ ```cpp
411
+ #include "ogr_geometry.h"
412
+
413
+ // 创建几何对象
414
+ OGRPoint pt(116.4, 39.9);
415
+
416
+ OGRLinearRing ring;
417
+ ring.addPoint(0, 0);
418
+ ring.addPoint(10, 0);
419
+ ring.addPoint(10, 10);
420
+ ring.addPoint(0, 10);
421
+ ring.closeRings();
422
+
423
+ OGRPolygon polygon;
424
+ polygon.addRing(&ring);
425
+
426
+ // WKT / WKB 互转
427
+ char *wkt = nullptr;
428
+ polygon.exportToWkt(&wkt);
429
+ CPLFree(wkt);
430
+
431
+ OGRGeometry *geomFromWkt = nullptr;
432
+ OGRGeometryFactory::createFromWkt("POINT(116.4 39.9)", nullptr, &geomFromWkt);
433
+ OGRGeometryFactory::destroyGeometry(geomFromWkt);
434
+
435
+ // 空间操作
436
+ OGRGeometry *buffer = pt.Buffer(1.0); // 缓冲区
437
+ OGRGeometry *inter = polygon.Intersection(&pt); // 交集
438
+ OGRGeometry *united = polygon.Union(&pt); // 合并
439
+ double dist = polygon.Distance(&pt); // 距离
440
+ bool contains = polygon.Contains(&pt); // 包含判断
441
+ bool intersects = polygon.Intersects(&pt); // 相交判断
442
+ double area = polygon.get_Area(); // 面积
443
+ double length = polygon.get_Length(); // 周长
444
+
445
+ OGRGeometryFactory::destroyGeometry(buffer);
446
+ OGRGeometryFactory::destroyGeometry(inter);
447
+ OGRGeometryFactory::destroyGeometry(united);
448
+ ```
449
+
450
+ ### Python
451
+
452
+ ```python
453
+ from osgeo import ogr
454
+
455
+ # 创建几何对象
456
+ pt = ogr.Geometry(ogr.wkbPoint)
457
+ pt.SetPoint_2D(0, 116.4, 39.9)
458
+
459
+ ring = ogr.Geometry(ogr.wkbLinearRing)
460
+ ring.AddPoint(0, 0)
461
+ ring.AddPoint(10, 0)
462
+ ring.AddPoint(10, 10)
463
+ ring.AddPoint(0, 10)
464
+ ring.CloseRings()
465
+
466
+ polygon = ogr.Geometry(ogr.wkbPolygon)
467
+ polygon.AddGeometry(ring)
468
+
469
+ # WKT / WKB 互转
470
+ wkt = polygon.ExportToWkt()
471
+ geom_from_wkt = ogr.CreateGeometryFromWkt("POINT(116.4 39.9)")
472
+ geom_from_json = ogr.CreateGeometryFromJson('{"type":"Point","coordinates":[116.4,39.9]}')
473
+
474
+ # 空间操作
475
+ buffer = pt.Buffer(1.0) # 缓冲区
476
+ inter = polygon.Intersection(pt) # 交集
477
+ united = polygon.Union(pt) # 合并
478
+ dist = polygon.Distance(pt) # 距离
479
+ contains = polygon.Contains(pt) # 包含判断
480
+ intersects = polygon.Intersects(pt) # 相交判断
481
+ area = polygon.GetArea() # 面积
482
+ length = polygon.Length() # 周长
483
+ ```
484
+
485
+ ### Java
486
+
487
+ ```java
488
+ import org.gdal.ogr.Geometry;
489
+ import org.gdal.ogr.ogr;
490
+
491
+ // 创建几何对象
492
+ Geometry pt = new Geometry(ogr.wkbPoint);
493
+ pt.SetPoint_2D(0, 116.4, 39.9);
494
+
495
+ Geometry ring = new Geometry(ogr.wkbLinearRing);
496
+ ring.AddPoint(0, 0, 0);
497
+ ring.AddPoint(10, 0, 0);
498
+ ring.AddPoint(10, 10, 0);
499
+ ring.AddPoint(0, 10, 0);
500
+ ring.CloseRings();
501
+
502
+ Geometry polygon = new Geometry(ogr.wkbPolygon);
503
+ polygon.AddGeometry(ring);
504
+
505
+ // WKT / WKB 互转
506
+ String wkt = polygon.ExportToWkt();
507
+ Geometry geomFromWkt = Geometry.CreateFromWkt("POINT(116.4 39.9)");
508
+
509
+ // 空间操作
510
+ Geometry buffer = pt.Buffer(1.0); // 缓冲区
511
+ Geometry inter = polygon.Intersection(pt); // 交集
512
+ Geometry united = polygon.Union(pt); // 合并
513
+ double dist = polygon.Distance(pt); // 距离
514
+ boolean contains = polygon.Contains(pt); // 包含判断
515
+ boolean intersects = polygon.Intersects(pt); // 相交判断
516
+ double area = polygon.GetArea(); // 面积
517
+ ```
518
+
519
+ ### C#
520
+
521
+ ```csharp
522
+ using OSGeo.OGR;
523
+
524
+ // 创建几何对象
525
+ Geometry pt = new Geometry(wkbGeometryType.wkbPoint);
526
+ pt.SetPoint_2D(0, 116.4, 39.9);
527
+
528
+ Geometry ring = new Geometry(wkbGeometryType.wkbLinearRing);
529
+ ring.AddPoint(0, 0, 0);
530
+ ring.AddPoint(10, 0, 0);
531
+ ring.AddPoint(10, 10, 0);
532
+ ring.AddPoint(0, 10, 0);
533
+ ring.CloseRings();
534
+
535
+ Geometry polygon = new Geometry(wkbGeometryType.wkbPolygon);
536
+ polygon.AddGeometry(ring);
537
+
538
+ // WKT / WKB 互转
539
+ string wkt;
540
+ polygon.ExportToWkt(out wkt);
541
+ Geometry geomFromWkt = Geometry.CreateFromWkt("POINT(116.4 39.9)");
542
+
543
+ // 空间操作
544
+ Geometry buffer = pt.Buffer(1.0, 30); // 缓冲区
545
+ Geometry inter = polygon.Intersection(pt); // 交集
546
+ Geometry united = polygon.Union(pt); // 合并
547
+ double dist = polygon.Distance(pt); // 距离
548
+ bool contains = polygon.Contains(pt); // 包含判断
549
+ bool intersects = polygon.Intersects(pt); // 相交判断
550
+ double area = polygon.GetArea(); // 面积
551
+ ```
552
+
553
+ ---
554
+
555
+ ## GeoPackage 读写
556
+
557
+ GeoPackage 是 OGC 标准的轻量级地理数据库格式,适合替代 Shapefile。
558
+
559
+ ### C++
560
+
561
+ ```cpp
562
+ #include "ogrsf_frmts.h"
563
+
564
+ GDALAllRegister();
565
+
566
+ // 创建 GeoPackage
567
+ GDALDriver *driver = GetGDALDriverManager()->GetDriverByName("GPKG");
568
+ GDALDataset *ds = driver->Create("data.gpkg", 0, 0, 0, GDT_Unknown, nullptr);
569
+
570
+ OGRSpatialReference srs;
571
+ srs.importFromEPSG(4326);
572
+ OGRLayer *layer = ds->CreateLayer("points", &srs, wkbPoint, nullptr);
573
+
574
+ OGRFieldDefn field("name", OFTString);
575
+ layer->CreateField(&field);
576
+
577
+ OGRFeature *f = OGRFeature::CreateFeature(layer->GetLayerDefn());
578
+ f->SetField("name", "TestPoint");
579
+ OGRPoint pt(116.4, 39.9);
580
+ f->SetGeometry(&pt);
581
+ layer->CreateFeature(f);
582
+ OGRFeature::DestroyFeature(f);
583
+
584
+ GDALClose(ds);
585
+
586
+ // 读取 GeoPackage
587
+ GDALDataset *readDs = (GDALDataset *)GDALOpenEx("data.gpkg", GDAL_OF_VECTOR, nullptr, nullptr, nullptr);
588
+ OGRLayer *readLayer = readDs->GetLayerByName("points");
589
+ readLayer->ResetReading();
590
+ OGRFeature *rf;
591
+ while ((rf = readLayer->GetNextFeature()) != nullptr) {
592
+ printf("%s\n", rf->GetFieldAsString("name"));
593
+ OGRFeature::DestroyFeature(rf);
594
+ }
595
+ GDALClose(readDs);
596
+ ```
597
+
598
+ ### Python
599
+
600
+ ```python
601
+ from osgeo import ogr, osr
602
+
603
+ # 创建 GeoPackage
604
+ driver = ogr.GetDriverByName("GPKG")
605
+ ds = driver.CreateDataSource("data.gpkg")
606
+
607
+ srs = osr.SpatialReference()
608
+ srs.ImportFromEPSG(4326)
609
+ layer = ds.CreateLayer("points", srs, ogr.wkbPoint)
610
+
611
+ layer.CreateField(ogr.FieldDefn("name", ogr.OFTString))
612
+
613
+ feature = ogr.Feature(layer.GetLayerDefn())
614
+ feature.SetField("name", "TestPoint")
615
+ pt = ogr.Geometry(ogr.wkbPoint)
616
+ pt.SetPoint_2D(0, 116.4, 39.9)
617
+ feature.SetGeometry(pt)
618
+ layer.CreateFeature(feature)
619
+
620
+ ds = None
621
+
622
+ # 读取 GeoPackage
623
+ ds = ogr.Open("data.gpkg")
624
+ layer = ds.GetLayerByName("points")
625
+ for f in layer:
626
+ print(f.GetField("name"))
627
+ ds = None
628
+ ```
629
+
630
+ ### Java
631
+
632
+ ```java
633
+ import org.gdal.ogr.*;
634
+ import org.gdal.osr.SpatialReference;
635
+
636
+ ogr.RegisterAll();
637
+
638
+ // 创建 GeoPackage
639
+ Driver driver = ogr.GetDriverByName("GPKG");
640
+ DataSource ds = driver.CreateDataSource("data.gpkg");
641
+
642
+ SpatialReference srs = new SpatialReference();
643
+ srs.ImportFromEPSG(4326);
644
+ Layer layer = ds.CreateLayer("points", srs, ogr.wkbPoint);
645
+
646
+ layer.CreateField(new FieldDefn("name", ogr.OFTString));
647
+
648
+ Feature feature = new Feature(layer.GetLayerDefn());
649
+ feature.SetField("name", "TestPoint");
650
+ Geometry pt = new Geometry(ogr.wkbPoint);
651
+ pt.SetPoint_2D(0, 116.4, 39.9);
652
+ feature.SetGeometry(pt);
653
+ layer.CreateFeature(feature);
654
+
655
+ ds.delete();
656
+
657
+ // 读取 GeoPackage
658
+ DataSource readDs = ogr.Open("data.gpkg", false);
659
+ Layer readLayer = readDs.GetLayerByName("points");
660
+ Feature f;
661
+ while ((f = readLayer.GetNextFeature()) != null) {
662
+ System.out.println(f.GetFieldAsString("name"));
663
+ f.delete();
664
+ }
665
+ readDs.delete();
666
+ ```
667
+
668
+ ### C#
669
+
670
+ ```csharp
671
+ using OSGeo.OGR;
672
+ using OSGeo.OSR;
673
+
674
+ Ogr.RegisterAll();
675
+
676
+ // 创建 GeoPackage
677
+ Driver driver = Ogr.GetDriverByName("GPKG");
678
+ DataSource ds = driver.CreateDataSource("data.gpkg", null);
679
+
680
+ SpatialReference srs = new SpatialReference("");
681
+ srs.ImportFromEPSG(4326);
682
+ Layer layer = ds.CreateLayer("points", srs, wkbGeometryType.wkbPoint, null);
683
+
684
+ layer.CreateField(new FieldDefn("name", FieldType.OFTString), 1);
685
+
686
+ Feature feature = new Feature(layer.GetLayerDefn());
687
+ feature.SetField("name", "TestPoint");
688
+ Geometry pt = new Geometry(wkbGeometryType.wkbPoint);
689
+ pt.SetPoint_2D(0, 116.4, 39.9);
690
+ feature.SetGeometry(pt);
691
+ layer.CreateFeature(feature);
692
+
693
+ ds.Dispose();
694
+
695
+ // 读取 GeoPackage
696
+ DataSource readDs = Ogr.Open("data.gpkg", 0);
697
+ Layer readLayer = readDs.GetLayerByName("points");
698
+ Feature f;
699
+ while ((f = readLayer.GetNextFeature()) != null) {
700
+ Console.WriteLine(f.GetFieldAsString("name"));
701
+ f.Dispose();
702
+ }
703
+ readDs.Dispose();
704
+ ```
705
+
706
+ ---
707
+
708
+ ## 常用矢量数据格式
709
+
710
+ | 驱动名 | 扩展名 | 说明 |
711
+ |---|---|---|
712
+ | `ESRI Shapefile` | `.shp` | ESRI Shapefile,经典矢量格式 |
713
+ | `GeoJSON` | `.geojson` | GeoJSON,Web 友好格式 |
714
+ | `GPKG` | `.gpkg` | GeoPackage,OGC 标准轻量数据库 |
715
+ | `PostgreSQL` / `PostGIS` | — | PostGIS 空间数据库 |
716
+ | `FlatGeobuf` | `.fgb` | 高性能流式二进制格式 |
717
+ | `GML` | `.gml` | OGC GML 格式 |
718
+ | `KML` | `.kml` | Google Earth 格式 |
719
+ | `CSV` | `.csv` | 逗号分隔值(配合 VRT 指定几何列) |
720
+ | `SQLite` | `.sqlite` | SQLite / SpatiaLite 数据库 |
721
+ | `XLSX` | `.xlsx` | Excel 表格(只读) |
722
+
723
+ ---
724
+