aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/Geocode.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perllib/FixMyStreet/Geocode.pm')
-rw-r--r--perllib/FixMyStreet/Geocode.pm32
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;