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
135
136
137
138
139
|
#!/usr/bin/perl
#
# Utils.pm:
# Various generic utilities for FixMyStreet.
#
# Copyright (c) 2008 UK Citizens Online Democracy. All rights reserved.
# Email: matthew@mysociety.org; WWW: http://www.mysociety.org/
#
# $Id: Utils.pm,v 1.1 2008-10-09 14:20:54 matthew Exp $
#
package Utils;
use strict;
use mySociety::DBHandle qw(dbh);
use mySociety::GeoUtil;
use mySociety::Locale;
sub workaround_pg_bytea {
my ( $st, $img_idx, @elements ) = @_;
my $s = dbh()->prepare($st);
for ( my $i = 1 ; $i <= @elements ; $i++ ) {
if ( $i == $img_idx ) {
$s->bind_param(
$i,
$elements[ $i - 1 ],
{ pg_type => DBD::Pg::PG_BYTEA }
);
}
else {
$s->bind_param( $i, $elements[ $i - 1 ] );
}
}
$s->execute();
}
=head2 convert_latlon_to_en
( $easting, $northing ) = Utils::convert_en_to_latlon( $latitude, $longitude );
Takes the WGS84 latitude and longitude and returns OSGB36 easting and northing.
=cut
sub convert_latlon_to_en {
my ( $latitude, $longitude ) = @_;
my ( $easting, $northing ) =
mySociety::Locale::in_gb_locale {
mySociety::GeoUtil::wgs84_to_national_grid( $latitude, $longitude, 'G' );
};
return ( $easting, $northing );
}
=head2 convert_en_to_latlon
( $latitude, $longitude ) = Utils::convert_en_to_latlon( $easting, $northing );
Takes the OSGB36 easting and northing and returns WGS84 latitude and longitude.
=cut
sub convert_en_to_latlon {
my ( $easting, $northing ) = @_;
my ( $latitude, $longitude ) =
# map { truncate_coordinate($_) }
mySociety::GeoUtil::national_grid_to_wgs84( $easting, $northing, 'G' );
return ( $latitude, $longitude );
}
=head2 convert_en_to_latlon_truncated
( $lat, $lon ) = Utils::convert_en_to_latlon( $easting, $northing );
Takes the OSGB36 easting and northing and returns WGS84 latitude and longitude
(truncated using C<Utils::truncate_coordinate>).
=cut
sub convert_en_to_latlon_truncated {
my ( $easting, $northing ) = @_;
return
map { truncate_coordinate($_) }
convert_en_to_latlon( $easting, $northing );
}
=head2 truncate_coordinate
$short = Utils::truncate_coordinate( $long );
Given a long coordinate returns a shorter one - rounded to 6 decimal places -
which is < 1m at the equator, if you're using WGS84 lat/lon.
=cut
sub truncate_coordinate {
my $in = shift;
my $out = mySociety::Locale::in_gb_locale {
sprintf( '%0.6f', $in );
};
$out =~ s{\.?0+\z}{} if $out =~ m{\.};
return $out;
}
sub london_categories {
return {
'Abandoned vehicle' => 'AbandonedVehicle',
'Car parking' => 'Parking',
'Dangerous structure' => 'DangerousStructure',
'Dead animal' => 'DeadAnimal',
'Dumped cylinder' => 'DumpedCylinder',
'Dumped rubbish' => 'DumpedRubbish',
'Flyposting' => 'FlyPosting',
'Graffiti' => 'Graffiti',
'Litter bin' => 'LitterBin',
'Public toilet' => 'PublicToilet',
'Refuse collection' => 'RefuseCollection',
'Road or pavement defect' => 'Road',
'Road or pavement obstruction' => 'Obstruction',
'Skip problem' => 'Skip',
'Street cleaning' => 'StreetCleaning',
'Street drainage' => 'StreetDrainage',
'Street furniture' => 'StreetFurniture',
'Street needs gritting' => 'StreetGritting',
'Street lighting' => 'StreetLighting',
'Street sign' => 'StreetSign',
'Traffic light' => 'TrafficLight',
'Tree (dangerous)' => 'DangerousTree',
'Tree (fallen branches)' => 'FallenTree',
'Untaxed vehicle' => 'UntaxedVehicle',
};
}
1;
|