@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.
- package/.editorconfig +19 -0
- package/CHANGELOG.md +96 -0
- package/LICENSE +21 -21
- package/README.md +91 -30
- package/THIRD_PARTY_NOTICES.md +37 -10
- package/assets/gdal/reference/raster-tools.md +538 -538
- package/assets/gdal/reference/vector-tools.md +149 -149
- package/assets/gdal-api/reference/raster-api.md +424 -424
- package/assets/gdal-api/reference/vector-api.md +724 -724
- package/assets/geometry-api-net/reference/geometry-types.md +243 -243
- package/assets/geopandas/reference/core-api.md +221 -221
- package/assets/geotools/reference/raster-rendering.md +108 -108
- package/assets/geotools/reference/vector-io.md +149 -149
- package/assets/jts/reference/geometry-operations.md +303 -303
- package/assets/mapsui/SKILL.md +283 -283
- package/assets/opengis-all/reference/data-stages.md +608 -608
- package/assets/opengis-all/reference/workflow-cheatsheets.md +324 -324
- package/assets/opengis-utils-for-java/reference/common-tasks.md +384 -384
- package/assets/opengis-utils-for-net/reference/code-patterns.md +124 -124
- package/assets/opengis-utils-for-net/reference/util-classes.md +291 -291
- package/assets/pyqgis/reference/processing-rendering.md +292 -292
- package/assets/pyqgis/reference/vector-raster-layers.md +318 -318
- package/assets/qgis-process/SKILL.md +414 -414
- package/assets/qgis-process/reference/algorithm-cheatsheet.md +194 -194
- package/assets/shapely/reference/operations-reference.md +199 -199
- package/cordis.patch.yml +6 -3
- package/lib/catalog.d.ts +50 -0
- package/lib/catalog.js +238 -0
- package/lib/index.d.ts +47 -6
- package/lib/index.js +32 -44
- package/lib/markdown-links.d.ts +11 -0
- package/lib/markdown-links.js +103 -0
- package/lib/skill-file.js +104 -17
- package/locale/en.json +1 -1
- package/locale/zh.json +1 -1
- package/package.json +11 -5
- 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
|
+
|