diff --git a/geom/geom.go b/geom/geom.go new file mode 100644 index 0000000..bb0c67f --- /dev/null +++ b/geom/geom.go @@ -0,0 +1,19 @@ +package geom + +import ( + "gogeos" + "goposm/element" +) + +func LineString(nodes []element.Node) []byte { + geos := gogeos.NewGEOS() + defer geos.Finish() + + coordSeq := geos.CreateCoordSeq(uint32(len(nodes)), 2) + for i, nd := range nodes { + coordSeq.SetXY(geos, uint32(i), nd.Long, nd.Lat) + } + geom := coordSeq.AsLineString(geos) + defer geos.Destroy(geom) + return geos.AsWKB(geom) +} diff --git a/geom/geom_test.go b/geom/geom_test.go new file mode 100644 index 0000000..e3c8897 --- /dev/null +++ b/geom/geom_test.go @@ -0,0 +1,30 @@ +package geom + +import ( + "goposm/element" + "regexp" + "testing" +) + +func _TestLineString(t *testing.T) { + nodes := make([]element.Node, 2) + nodes[0] = element.Node{Lat: 0, Long: 0} + nodes[1] = element.Node{Lat: 0, Long: 10} + wkt := LineString(nodes) + re := regexp.MustCompile("LINESTRING \\(0\\.0* 0\\.0*, 10\\.0* 0\\.0*\\)") + if !re.Match(wkt) { + t.Errorf("%#v", wkt) + } +} + +func BenchmarkLineString(b *testing.B) { + size := 16 + nodes := make([]element.Node, size) + for i := 0; i < size; i++ { + nodes[i] = element.Node{Lat: 0, Long: float64(i)} + } + + for i := 0; i < b.N; i++ { + LineString(nodes) + } +}