package gdal

  1. Overview
  2. Docs

Source file layer.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
open Ctypes

type t = T.t
let t = T.t
let t_opt = T.t_opt

exception Layer_error

let err = T.err Layer_error

(* Raw bindings *)
let get_name =
  Lib.c "OGR_L_GetName"
    (t @-> returning string)

let get_geom_type =
  Lib.c "OGR_L_GetGeomType"
    (t @-> returning nativeint)

let get_geom_type t =
  get_geom_type t
  |> Geometry.wkb_of_nativeint

let get_spatial_filter =
  Lib.c "OGR_L_GetSpatialFilter"
    (t @-> returning Geometry.t)

let set_spatial_filter =
  Lib.c "OGR_L_SetSpatialFilter"
    (t @-> Geometry.t @-> returning void)

let set_spatial_filter_rect =
  Lib.c "OGR_L_SetSpatialFilterRect"
    (t @-> double @-> double @-> double @-> double @-> returning void)

let set_attribute_filter =
  Lib.c "OGR_L_SetAttributeFilter"
    (t @-> string @-> returning err)

let reset_reading =
  Lib.c "OGR_L_ResetReading"
    (t @-> returning void)

let get_next_feature =
  Lib.c "OGR_L_GetNextFeature"
    (t @-> returning Feature.t_opt)

let set_next_by_index =
  Lib.c "OGR_L_SetNextByIndex"
    (t @-> int @-> returning err)

let get_feature =
  Lib.c "OGR_L_GetFeature"
    (t @-> int @-> returning Feature.t_opt)

let set_feature =
  Lib.c "OGR_L_SetFeature"
    (t @-> Feature.t @-> returning err)

let create_feature =
  Lib.c "OGR_L_CreateFeature"
    (t @-> Feature.t @-> returning err)

let delete_feature =
  Lib.c "OGR_L_DeleteFeature"
    (t @-> int @-> returning err)

let get_layer_defn =
  Lib.c "OGR_L_GetLayerDefn"
    (t @-> returning Feature.Defn.t)

let get_spatial_ref =
  Lib.c "OGR_L_GetSpatialRef"
    (t @-> returning Spatial_reference.t_opt)

let get_feature_count =
  Lib.c "OGR_L_GetFeatureCount"
    (t @-> int @-> returning int)

let get_extent =
  Lib.c "OGR_L_GetExtent"
    (t @-> ptr T.envelope @-> int @-> returning err)

let get_extent t i =
  let envelope = make T.envelope in
  get_extent t (addr envelope) i;
  let min_x = getf envelope T.envelope_minx in
  let max_x = getf envelope T.envelope_maxx in
  let min_y = getf envelope T.envelope_miny in
  let max_y = getf envelope T.envelope_maxy in
  Geometry.({ min_x; max_x; min_y; max_y })

let test_capability =
  Lib.c "OGR_L_TestCapability"
    (t @-> string @-> returning int)

let test_capability t s =
  test_capability t s <> 0

let create_field =
  Lib.c "OGR_L_CreateField"
    (t @-> Field.Defn.t @-> int @-> returning err)

let delete_field =
  Lib.c "OGR_L_DeleteField"
    (t @-> int @-> returning err)

let reorder_fields =
  Lib.c "OGR_L_ReorderFields"
    (t @-> ptr int @-> returning err)

let reorder_fields t indices =
  let pointer =
    CArray.of_list int indices
    |> CArray.start
  in
  reorder_fields t pointer

let reorder_field =
  Lib.c "OGR_L_ReorderField"
    (t @-> int @-> int @-> returning err)

let alter_field_defn =
  Lib.c "OGR_L_AlterFieldDefn"
    (t @-> int @-> Field.Defn.t @-> int @-> returning err)

let start_transaction =
  Lib.c "OGR_L_StartTransaction"
    (t @-> returning err)

let commit_transaction =
  Lib.c "OGR_L_CommitTransaction"
    (t @-> returning err)

let rollback_transaction =
  Lib.c "OGR_L_RollbackTransaction"
    (t @-> returning err)

let reference =
  Lib.c "OGR_L_Reference"
    (t @-> returning int)

let dereference =
  Lib.c "OGR_L_Dereference"
    (t @-> returning int)

let get_ref_count =
  Lib.c "OGR_L_GetRefCount"
    (t @-> returning int)

let sync_to_disk =
  Lib.c "OGR_L_SyncToDisk"
    (t @-> returning err)

let get_fid_column =
  Lib.c "OGR_L_GetFIDColumn"
    (t @-> returning string)

let get_geometry_column =
  Lib.c "OGR_L_GetGeometryColumn"
    (t @-> returning string)

let set_ignored_fields =
  Lib.c "OGR_L_SetIgnoredFields"
    (t @-> ptr_opt string_opt @-> returning err)

let set_ignored_fields t fields =
  let fields =
    match fields with
    | [] -> None
    | fields ->
      (* Add None at the end to signal the end of the array to OGR *)
      let fields = List.rev (None :: List.rev fields) in
      Some (CArray.of_list string_opt fields |> CArray.start)
  in
  set_ignored_fields t fields

(* Higher level wrappers *)

let map_features layer f =
  let rec loop accu =
    match get_next_feature layer with
    | None -> List.rev accu
    | Some feature ->
      let res = f feature in
      Feature.destroy feature;
      loop (res :: accu)
  in
  loop []

let iter_features layer f =
  let rec loop () =
    match get_next_feature layer with
    | None -> ()
    | Some feature ->
      f feature;
      Feature.destroy feature;
      loop ()
  in
  loop ()