aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xperllib/FixMyStreet/App/Controller/FakeMapit.pm11
-rw-r--r--web/js/map-OpenLayers.js59
2 files changed, 62 insertions, 8 deletions
diff --git a/perllib/FixMyStreet/App/Controller/FakeMapit.pm b/perllib/FixMyStreet/App/Controller/FakeMapit.pm
index a4adadd09..0ec13ebfa 100755
--- a/perllib/FixMyStreet/App/Controller/FakeMapit.pm
+++ b/perllib/FixMyStreet/App/Controller/FakeMapit.pm
@@ -2,6 +2,7 @@ package FixMyStreet::App::Controller::FakeMapit;
use Moose;
use namespace::autoclean;
use JSON::MaybeXS;
+use LWP::Simple;
BEGIN { extends 'Catalyst::Controller'; }
@@ -21,6 +22,16 @@ world is one area, with ID 161 and name "Everywhere".
my $area = { "name" => "Everywhere", "type" => "ZZZ", "id" => 161 };
+# The user should have the web server proxying this,
+# but for development we can also do it on the server.
+sub proxy : Path('/mapit') {
+ my ($self, $c) = @_;
+ (my $path = $c->req->uri->path_query) =~ s{^/mapit/}{};
+ my $url = FixMyStreet->config('MAPIT_URL') . $path;
+ my $kml = LWP::Simple::get($url);
+ $c->response->body($kml);
+}
+
sub output : Private {
my ( $self, $c, $data ) = @_;
my $body = encode_json($data);
diff --git a/web/js/map-OpenLayers.js b/web/js/map-OpenLayers.js
index afe47b4e7..02a0d7727 100644
--- a/web/js/map-OpenLayers.js
+++ b/web/js/map-OpenLayers.js
@@ -333,8 +333,26 @@ var fixmystreet = fixmystreet || {};
function onload() {
if ( fixmystreet.area.length ) {
+ var extent = new OpenLayers.Bounds();
+ var lr = new OpenLayers.Geometry.LinearRing([
+ new OpenLayers.Geometry.Point(20E6,20E6),
+ new OpenLayers.Geometry.Point(10E6,20E6),
+ new OpenLayers.Geometry.Point(0,20E6),
+ new OpenLayers.Geometry.Point(-10E6,20E6),
+ new OpenLayers.Geometry.Point(-20E6,20E6),
+ new OpenLayers.Geometry.Point(-20E6,0),
+ new OpenLayers.Geometry.Point(-20E6,-20E6),
+ new OpenLayers.Geometry.Point(-10E6,-20E6),
+ new OpenLayers.Geometry.Point(0,-20E6),
+ new OpenLayers.Geometry.Point(10E6,-20E6),
+ new OpenLayers.Geometry.Point(20E6,-20E6),
+ new OpenLayers.Geometry.Point(20E6,0)
+ ]);
+ var loaded = 0;
+ var new_geometry = new OpenLayers.Geometry.Polygon(lr);
for (var i=0; i<fixmystreet.area.length; i++) {
var area = new OpenLayers.Layer.Vector("KML", {
+ renderers: ['SVGBig', 'VML', 'Canvas'],
strategies: [ new OpenLayers.Strategy.Fixed() ],
protocol: new OpenLayers.Protocol.HTTP({
url: "/mapit/area/" + fixmystreet.area[i] + ".kml?simplify_tolerance=0.0001",
@@ -342,14 +360,34 @@ var fixmystreet = fixmystreet || {};
})
});
fixmystreet.map.addLayer(area);
- if ( fixmystreet.area.length == 1 ) {
- area.events.register('loadend', null, function(a,b,c) {
- if ( fixmystreet.area_format ) {
- area.styleMap.styles['default'].defaultStyle = fixmystreet.area_format;
- }
- zoomToBounds( area.getDataExtent() );
- });
- }
+ area.events.register('loadend', area, function(a,b,c) {
+ loaded++;
+ var style = this.styleMap.styles['default'];
+ if ( fixmystreet.area_format ) {
+ style.defaultStyle = fixmystreet.area_format;
+ } else {
+ $.extend(style.defaultStyle, { fillColor: 'black', strokeColor: 'black' });
+ }
+ var geometry = this.features[0].geometry;
+ if (geometry.CLASS_NAME == 'OpenLayers.Geometry.Collection') {
+ $.each(geometry.components, function(i, polygon) {
+ new_geometry.addComponents(polygon.components)
+ extent.extend(polygon.getBounds());
+ });
+ } else if (geometry.CLASS_NAME == 'OpenLayers.Geometry.Polygon') {
+ new_geometry.addComponents(geometry.components);
+ extent.extend(this.getDataExtent());
+ }
+ if (loaded == fixmystreet.area.length) {
+ var f = this.features[0].clone();
+ f.geometry = new_geometry;
+ this.removeAllFeatures();
+ this.addFeatures([f]);
+ zoomToBounds(extent);
+ } else {
+ fixmystreet.map.removeLayer(this);
+ }
+ });
}
}
@@ -845,3 +883,8 @@ OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {
}
});
+OpenLayers.Renderer.SVGBig = OpenLayers.Class(OpenLayers.Renderer.SVG, {
+ MAX_PIXEL: 15E7,
+ CLASS_NAME: "OpenLayers.Renderer.SVGBig"
+
+});