From e245e01b952b2323089a0ed639527f4b6ff53ea2 Mon Sep 17 00:00:00 2001 From: Oliver Tonnhofer Date: Tue, 21 Nov 2017 09:06:30 +0100 Subject: [PATCH] geom: cache geos wkb writer --- geom/geos/geos.go | 5 +++-- geom/geos/serialize.go | 16 ++++++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/geom/geos/geos.go b/geom/geos/geos.go index d033952..e311b6f 100644 --- a/geom/geos/geos.go +++ b/geom/geos/geos.go @@ -28,8 +28,9 @@ func goLogString(msg *C.char) { } type Geos struct { - v C.GEOSContextHandle_t - srid int + v C.GEOSContextHandle_t + srid int + wkbwriter *C.GEOSWKBWriter } type Geom struct { diff --git a/geom/geos/serialize.go b/geom/geos/serialize.go index f4aa60d..94bb298 100644 --- a/geom/geos/serialize.go +++ b/geom/geos/serialize.go @@ -54,24 +54,28 @@ func (this *Geos) AsWkb(geom *Geom) []byte { } func (this *Geos) AsEwkbHex(geom *Geom) []byte { - writer := C.GEOSWKBWriter_create_r(this.v) - if writer == nil { - return nil + if this.wkbwriter == nil { + this.wkbwriter = C.GEOSWKBWriter_create_r(this.v) + if this.wkbwriter == nil { + return nil + } + if this.srid != 0 { + C.GEOSWKBWriter_setIncludeSRID_r(this.v, this.wkbwriter, C.char(1)) + } } - defer C.GEOSWKBWriter_destroy_r(this.v, writer) if this.srid != 0 { - C.GEOSWKBWriter_setIncludeSRID_r(this.v, writer, C.char(1)) C.GEOSSetSRID_r(this.v, geom.v, C.int(this.srid)) } var size C.size_t - buf := C.GEOSWKBWriter_writeHEX_r(this.v, writer, geom.v, &size) + buf := C.GEOSWKBWriter_writeHEX_r(this.v, this.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 }