-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgeom.go
91 lines (86 loc) · 2.2 KB
/
geom.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
82
83
84
85
86
87
88
89
90
91
package geo
import (
"github.com/flywave/go-geom"
"github.com/flywave/go-geom/general"
vec2d "github.com/flywave/go3d/float64/vec2"
)
func applyCoords(coords [][]float64, src Proj, dst Proj) [][]float64 {
pts := make([]vec2d.T, len(coords))
for i, p := range coords {
pts[i] = vec2d.T{p[0], p[1]}
}
pts = src.TransformTo(dst, pts)
for i, p := range pts {
coords[i][0], coords[i][1] = p[0], p[1]
}
return coords
}
func ApplyGeometry(g geom.Geometry, src Proj, dst Proj) geom.Geometry {
switch t := (g).(type) {
case geom.Point:
pt := t.Data()
dst := src.TransformTo(dst, []vec2d.T{{pt[0], pt[1]}})
return general.NewPoint(dst[0][:])
case geom.Point3:
pt := t.Data()
dst := src.TransformTo(dst, []vec2d.T{{pt[0], pt[1]}})
return general.NewPoint([]float64{dst[0][0], dst[0][1], pt[2]})
case geom.MultiPoint:
pts := t.Data()
pts = applyCoords(pts, src, dst)
return general.NewMultiPoint(pts)
case geom.MultiPoint3:
pts := t.Data()
pts = applyCoords(pts, src, dst)
return general.NewMultiPoint(pts)
case geom.LineString:
pts := t.Data()
pts = applyCoords(pts, src, dst)
return general.NewLineString(pts)
case geom.LineString3:
pts := t.Data()
pts = applyCoords(pts, src, dst)
return general.NewLineString(pts)
case geom.MultiLine:
ls := t.Data()
for i, pts := range ls {
ls[i] = applyCoords(pts, src, dst)
}
return general.NewMultiLineString(ls)
case geom.MultiLine3:
ls := t.Data()
for i, pts := range ls {
ls[i] = applyCoords(pts, src, dst)
}
return general.NewMultiLineString3(ls)
case geom.Polygon:
ls := t.Data()
for i, pts := range ls {
ls[i] = applyCoords(pts, src, dst)
}
return general.NewPolygon(ls)
case geom.Polygon3:
ls := t.Data()
for i, pts := range ls {
ls[i] = applyCoords(pts, src, dst)
}
return general.NewPolygon3(ls)
case geom.MultiPolygon:
polys := t.Data()
for j, ls := range polys {
for i, pts := range ls {
polys[j][i] = applyCoords(pts, src, dst)
}
}
return general.NewMultiPolygon(polys)
case geom.MultiPolygon3:
polys := t.Data()
for j, ls := range polys {
for i, pts := range ls {
polys[j][i] = applyCoords(pts, src, dst)
}
}
return general.NewMultiPolygon3(polys)
}
return nil
}