diff options
Diffstat (limited to 'perllib/FixMyStreet/Geocode.pm')
-rw-r--r-- | perllib/FixMyStreet/Geocode.pm | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/perllib/FixMyStreet/Geocode.pm b/perllib/FixMyStreet/Geocode.pm index b5be152a8..aac52fbaa 100644 --- a/perllib/FixMyStreet/Geocode.pm +++ b/perllib/FixMyStreet/Geocode.pm @@ -7,11 +7,17 @@ package FixMyStreet::Geocode; use strict; +use Digest::MD5 qw(md5_hex); +use Encode; +use File::Slurp; +use File::Path (); +use LWP::Simple qw($ua); use URI::Escape; use FixMyStreet::Geocode::Bing; use FixMyStreet::Geocode::Google; use FixMyStreet::Geocode::OSM; use FixMyStreet::Geocode::Zurich; +use Utils; # lookup STRING CONTEXT # Given a user-inputted string, try and convert it into co-ordinates using either @@ -21,6 +27,11 @@ use FixMyStreet::Geocode::Zurich; sub lookup { my ($s, $c) = @_; my $data = $c->cobrand->geocode_postcode($s); + if (defined $data->{latitude}) { + ( $data->{latitude}, $data->{longitude} ) = + map { Utils::truncate_coordinate($_) } + ( $data->{latitude}, $data->{longitude} ); + } $data = string($s, $c) unless $data->{error} || defined $data->{latitude}; $data->{error} = _('Sorry, we could not find that location.') @@ -55,4 +66,25 @@ sub escape { return $s; } +sub cache { + my ($type, $url, $args, $re) = @_; + my $cache_dir = FixMyStreet->config('GEO_CACHE') . $type . '/'; + my $cache_file = $cache_dir . md5_hex($url); + my $js; + if (-s $cache_file && -M $cache_file <= 7) { + $js = File::Slurp::read_file($cache_file); + } else { + $url .= '&' . $args if $args; + $ua->timeout(15); + $js = LWP::Simple::get($url); + $js = encode_utf8($js) if utf8::is_utf8($js); + File::Path::mkpath($cache_dir); + if ($js && (!$re || $js !~ $re)) { + File::Slurp::write_file($cache_file, $js); + } + } + $js = JSON->new->utf8->allow_nonref->decode($js) if $js; + return $js; +} + 1; |