-
Notifications
You must be signed in to change notification settings - Fork 156
/
serialize.go
81 lines (70 loc) · 1.47 KB
/
serialize.go
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
package geos
/*
#cgo LDFLAGS: -lgeos_c
#include "geos_c.h"
#include <stdlib.h>
*/
import "C"
import (
"unsafe"
)
func (g *Geos) FromWkt(wkt string) *Geom {
wktC := C.CString(wkt)
defer C.free(unsafe.Pointer(wktC))
geom := C.GEOSGeomFromWKT_r(g.v, wktC)
if geom == nil {
return nil
}
return &Geom{geom}
}
func (g *Geos) FromWkb(wkb []byte) *Geom {
if len(wkb) == 0 {
return nil
}
geom := C.GEOSGeomFromWKB_buf_r(g.v, (*C.uchar)(&wkb[0]), C.size_t(len(wkb)))
if geom == nil {
return nil
}
return &Geom{geom}
}
func (g *Geos) AsWkt(geom *Geom) string {
str := C.GEOSGeomToWKT_r(g.v, geom.v)
if str == nil {
return ""
}
result := C.GoString(str)
C.free(unsafe.Pointer(str))
return result
}
func (g *Geos) AsWkb(geom *Geom) []byte {
var size C.size_t
buf := C.GEOSGeomToWKB_buf_r(g.v, geom.v, &size)
if buf == nil {
return nil
}
result := C.GoBytes(unsafe.Pointer(buf), C.int(size))
C.free(unsafe.Pointer(buf))
return result
}
func (g *Geos) AsEwkbHex(geom *Geom) []byte {
if g.wkbwriter == nil {
g.wkbwriter = C.GEOSWKBWriter_create_r(g.v)
if g.wkbwriter == nil {
return nil
}
if g.srid != 0 {
C.GEOSWKBWriter_setIncludeSRID_r(g.v, g.wkbwriter, C.char(1))
}
}
if g.srid != 0 {
C.GEOSSetSRID_r(g.v, geom.v, C.int(g.srid))
}
var size C.size_t
buf := C.GEOSWKBWriter_writeHEX_r(g.v, g.wkbwriter, geom.v, &size)
if buf == nil {
return nil
}
result := C.GoBytes(unsafe.Pointer(buf), C.int(size))
C.free(unsafe.Pointer(buf))
return result
}