-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgeometry.go
133 lines (122 loc) · 2.84 KB
/
geometry.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package geojson
import (
"encoding/json"
"fmt"
)
// Normally [lon, lat]
type Position []float64
// Generic Geometry Object used to Unmarshal
type Geometry struct {
Type string `json:"type"`
Coordinates json.RawMessage `json:"coordinates,omitempty"`
Geometries []Geometry `json:"geometries,omitempty"`
}
type Point struct {
Type string `json:"type"`
Coordinates Position `json:"coordinates"`
}
type MultiPoint struct {
Type string `json:"type"`
Coordinates []Position `json:"coordinates"`
}
type LineString struct {
Type string `json:"type"`
Coordinates []Position `json:"coordinates"`
}
type MultiLineString struct {
Type string `json:"type"`
Coordinates [][]Position `json:"coordinates"`
}
type Polygon struct {
Type string `json:"type"`
Coordinates [][]Position `json:"coordinates"`
}
type MultiPolygon struct {
Type string `json:"type"`
Coordinates [][][]Position `json:"coordinates"`
}
type GeometryCollection struct {
Type string `json:"type"`
Geometries []interface{} `json:"geometries"`
}
// Cast into a specific geometry object.
func Cast(g *Geometry) (interface{}, error) {
switch g.Type {
case "Point":
var coord Position
err := json.Unmarshal(g.Coordinates, &coord)
if err != nil {
return nil, err
}
return &Point{
Type: g.Type,
Coordinates: coord,
}, nil
case "MultiPoint":
var coord []Position
err := json.Unmarshal(g.Coordinates, &coord)
if err != nil {
return nil, err
}
return &MultiPoint{
Type: g.Type,
Coordinates: coord,
}, nil
case "LineString":
var coord []Position
err := json.Unmarshal(g.Coordinates, &coord)
if err != nil {
return nil, err
}
return &LineString{
Type: g.Type,
Coordinates: coord,
}, nil
case "MultiLineString":
var coord [][]Position
err := json.Unmarshal(g.Coordinates, &coord)
if err != nil {
return nil, err
}
return &MultiLineString{
Type: g.Type,
Coordinates: coord,
}, nil
case "Polygon":
var coord [][]Position
err := json.Unmarshal(g.Coordinates, &coord)
if err != nil {
return nil, err
}
return &Polygon{
Type: g.Type,
Coordinates: coord,
}, nil
case "MultiPolygon":
var coord [][][]Position
err := json.Unmarshal(g.Coordinates, &coord)
if err != nil {
return nil, err
}
return &MultiPolygon{
Type: g.Type,
Coordinates: coord,
}, nil
case "GeometryCollection":
geometries := make([]interface{}, 0, len(g.Geometries))
for _, obj := range g.Geometries {
o, err := Cast(&obj)
if err != nil {
return nil, err
}
geometries = append(geometries, o)
}
return &GeometryCollection{
Type: g.Type,
Geometries: geometries,
}, nil
default:
return nil, fmt.Errorf("Unknown type of Geometry Object: %s",
g.Type)
}
}