-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgeocode.go
134 lines (105 loc) · 3.18 KB
/
geocode.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
134
package main
import (
"encoding/json"
"fmt"
"time"
"github.com/ventu-io/slf"
"github.com/KristinaEtc/go-nominatim/lib"
)
//Request - json geocode request
type Request struct {
Nominatim.ReverseGeocodeRequest
ClientID string
ID interface{}
}
//Response - json geocode response
type Response struct {
Nominatim.ReverseGeocodeResponse
MachineID string
TimeReq string
ID interface{}
FullReq interface{}
}
// ErrorResponse - struct for error answer to geocoding request
type ErrorResponse struct {
Type string
Message string
ID interface{}
MachineID interface{}
}
func locationSearch(rawMsg []byte, geocode Nominatim.ReverseGeocode, workerID string) ([]byte, *string, bool, error) {
if len(rawMsg) == 0 {
return nil, nil, false, fmt.Errorf("%s", "Empty body request")
}
if globalOpt.IsDebug {
log.Debugf("Request: %s", rawMsg)
}
request, err := parseRequest(rawMsg)
if err != nil {
return nil, nil, false, err
}
response := Response{}
if globalOpt.QueueConf.ResentFullReq == true {
var msgMapTemplate interface{}
err := json.Unmarshal(rawMsg, &msgMapTemplate)
if err != nil {
log.Panic("err != nil")
}
response.FullReq = msgMapTemplate
}
place, err := getLocationFromNominatim(geocode, &request.ReverseGeocodeRequest)
if err != nil {
log.WithCaller(slf.CallerShort).Error(err.Error())
return createErrResponse(err, request.ID, workerID), &request.ClientID, true, nil
}
response.ReverseGeocodeResponse = *place
response.ID = request.ID
response.TimeReq = time.Now().Format(time.RFC3339)
response.MachineID = workerID
placeJSON, err := getLocationJSON(&response)
if err != nil {
log.WithCaller(slf.CallerShort).Error(err.Error())
return createErrResponse(err, request.ID, workerID), &request.ClientID, true, nil
}
if globalOpt.IsDebug {
log.Debugf("Client:%s ID:%d placeJSON:%s", request.ClientID, request.ID, string(placeJSON))
}
return placeJSON, &request.ClientID, false, nil
}
func parseRequest(data []byte) (*Request, error) {
request := Request{}
if err := json.Unmarshal(data, &request); err != nil {
return nil, err
}
return &request, nil
}
func getLocationFromNominatim(reverseGeocode Nominatim.ReverseGeocode, request *Nominatim.ReverseGeocodeRequest) (*Nominatim.ReverseGeocodeResponse, error) {
//oReverseGeocode.SetLanguagePreference()
//reverseGeocode.SetIncludeAddressDetails(p.addressDetails)
//reverseGeocode.SetZoom(p.clientReq.Zoom)
//reverseGeocode.SetLocation(p.clientReq.Lat, p.clientReq.Lon)
//reverseGeocode.SetMachineID(p.machineID)
place, err := reverseGeocode.Lookup(request)
if err != nil {
return nil, err
}
//place.ID = p.clientReq.ID
return place, nil
}
func getLocationJSON(response *Response) ([]byte, error) {
dataJSON, err := json.Marshal(response)
if err != nil {
log.WithCaller(slf.CallerShort).Error(err.Error())
return nil, err
}
return dataJSON, nil
}
func createErrResponse(err error, id interface{}, machineID interface{}) []byte {
respJSON := ErrorResponse{Type: "error", Message: err.Error(), ID: id, MachineID: machineID}
bytes, err := json.Marshal(respJSON)
if err != nil {
log.WithCaller(slf.CallerShort).Error(err.Error())
return nil
}
return bytes
}