Source file geo_transform.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
open Ctypes
exception Geo_transform_error
let err = T.err Geo_transform_error
type t = (float, Bigarray.float64_elt, Bigarray.c_layout) Bigarray.Array1.t
let allocate_gt () =
Bigarray.(Array1.create float64 c_layout 6)
let to_ptr gt = bigarray_start array1 gt
let get =
Lib.c "GDALGetGeoTransform"
(Data_set.t @-> ptr double @-> returning err)
let get t =
let ba = allocate_gt () in
get t (bigarray_start array1 ba);
ba
let get_origin gt =
gt.{0}, gt.{3}
let get_pixel_size gt =
gt.{1}, gt.{5}
let get_rotation gt =
gt.{2}, gt.{4}
let set =
Lib.c "GDALSetGeoTransform"
(Data_set.t @-> ptr double @-> returning err)
let make ~origin ~pixel_size ~rotation =
Bigarray.Array1.of_array Bigarray.float64 Bigarray.c_layout [|
fst origin;
fst pixel_size;
fst rotation;
snd origin;
snd rotation;
snd pixel_size;
|]
let set t gt =
set t (to_ptr gt)
let apply =
Lib.c "GDALApplyGeoTransform"
(ptr double @->
double @-> double @->
ptr double @-> ptr double @->
returning void)
let apply gt ~x ~y =
let cx = allocate double 0.0 in
let cy = allocate double 0.0 in
apply (to_ptr gt) x y cx cy;
!@cx, !@cy
let invert =
Lib.c "GDALInvGeoTransform"
(ptr double @-> ptr double @-> returning int)
let invert gt =
let gt_inv = allocate_gt () in
let result = invert (to_ptr gt) (to_ptr gt_inv) in
if result = 0 then
raise Geo_transform_error
else
gt_inv