Skip to content

Commit ebc096a

Browse files
author
doug
committed
implement support for our own python reverse geocoding endpoint
1 parent 0347fd7 commit ebc096a

File tree

4 files changed

+148
-1
lines changed

4 files changed

+148
-1
lines changed

lib/geocoder/lookup.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ def street_services
6868
:geoapify,
6969
:photon,
7070
:twogis,
71-
:pc_miler
71+
:pc_miler,
72+
:reverse_geocoder
7273
]
7374
end
7475

lib/geocoder/lookups/base.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ def parse_json(data)
222222
# Parses a raw search result (returns hash or array).
223223
#
224224
def parse_raw_data(raw_data)
225+
ap "parsing..."
226+
ap raw_data
225227
parse_json(raw_data)
226228
end
227229

@@ -306,6 +308,10 @@ def make_api_request(query)
306308
configuration.basic_auth[:password]
307309
)
308310
end
311+
puts "attemptinmgm client requewst...."
312+
ap configuration.http_headers
313+
ap client
314+
ap req
309315
client.request(req)
310316
end
311317
rescue Timeout::Error
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
require 'geocoder/lookups/base'
2+
require 'geocoder/results/reverse_geocoder'
3+
4+
##
5+
# Host endpoint: .../reverse?lat=?&lon=?
6+
# Host result: returns the python reverse_geocoder result in JSON
7+
# See python reverse_geocoder module for more details
8+
module Geocoder::Lookup
9+
class ReverseGeocoder < Base
10+
11+
def name
12+
"Reverse Geocoder"
13+
end
14+
15+
def supported_protocols
16+
[:https, :http]
17+
end
18+
19+
private # ---------------------------------------------------------------
20+
21+
def base_query_url(query)
22+
if query.reverse_geocode?
23+
"#{protocol}://#{host}/reverse_geocode?"
24+
else
25+
raise "Forward geocode not supported"
26+
end
27+
end
28+
29+
def query_url_params(query)
30+
params = {
31+
}.merge(super)
32+
33+
if query.reverse_geocode?
34+
lat,lon = query.coordinates
35+
params[:lat] = lat
36+
params[:lon] = lon
37+
else
38+
params[:q] = query.sanitized_text
39+
end
40+
params
41+
end
42+
43+
##
44+
# called by fetch_data
45+
def parse_raw_data(raw_data)
46+
raw_data.match(/^<html><title>404/) ? nil : super(raw_data)
47+
end
48+
49+
def results(query)
50+
return [] unless doc = fetch_data(query)
51+
ap doc
52+
doc.is_a?(Array) ? doc : [doc]
53+
return doc.map{|r| remap_result(r)}
54+
end
55+
56+
def remap_result(r)
57+
{
58+
lat: r["lat"],
59+
lon: r["lon"],
60+
city: r["name"],
61+
state: r["admin1"],
62+
county: r["admin2"],
63+
country_code: r["cc"]
64+
}
65+
end
66+
67+
def reserved_result(ip)
68+
{
69+
'ip' => ip,
70+
'city' => '',
71+
'state' => '',
72+
'county' => '',
73+
'latitude' => '0',
74+
'longitude' => '0',
75+
'country_code' => 'RD'
76+
}
77+
end
78+
79+
def host
80+
configuration[:host] || raise( "Reverse Geocoder requires the host configuration.")
81+
end
82+
end
83+
end
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
require 'geocoder/results/base'
2+
3+
module Geocoder::Result
4+
class ReverseGeocoder < Base
5+
6+
def address(format = :full)
7+
[
8+
city,
9+
state,
10+
county,
11+
[country.presence, country_code.presence].compact.join(" / ")
12+
].compact.join(", ")
13+
end
14+
15+
def county
16+
@data[:county]
17+
end
18+
19+
def coordinates
20+
[@data[:lat].to_f, @data[:lon].to_f]
21+
end
22+
23+
def city
24+
@data[:city]
25+
end
26+
27+
def state
28+
@data[:state]
29+
end
30+
31+
def state_code
32+
""
33+
end
34+
35+
def country
36+
@data[:country_name]
37+
end
38+
39+
def country_code
40+
@data[:country_code]
41+
end
42+
43+
def postal_code
44+
@data[:zip]
45+
end
46+
47+
def self.response_attributes
48+
%w[country_code ip]
49+
end
50+
51+
response_attributes.each do |a|
52+
define_method a do
53+
@data[a]
54+
end
55+
end
56+
end
57+
end

0 commit comments

Comments
 (0)