From 2519841efe7b89431b146554cc6fce698b4eb15b Mon Sep 17 00:00:00 2001 From: Andy Allan Date: Wed, 23 Dec 2020 15:01:01 +0000 Subject: [PATCH] Return the centre of the image if the bbox has no extent Fixes #3007. If all the provided points in the gpx file have the same lat/lon, then an image where they are all at the centre seems plausible. --- lib/osm.rb | 5 +++++ test/lib/osm_test.rb | 15 +++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 test/lib/osm_test.rb diff --git a/lib/osm.rb b/lib/osm.rb index a6d740677..daa15fe8b 100644 --- a/lib/osm.rb +++ b/lib/osm.rb @@ -378,12 +378,17 @@ module OSM end # and these two will give you the right points on your image. all the constants can be reduced to speed things up. FIXME + # If the bbox has no extent, return the centre of the image to avoid dividing by zero. def y(lat) + return @height / 2 if (@by - @ty).zero? + @height - ((ysheet(lat) - @ty) / (@by - @ty) * @height) end def x(lon) + return @width / 2 if (@bx - @tx).zero? + ((xsheet(lon) - @tx) / (@bx - @tx) * @width) end end diff --git a/test/lib/osm_test.rb b/test/lib/osm_test.rb new file mode 100644 index 000000000..032ece55a --- /dev/null +++ b/test/lib/osm_test.rb @@ -0,0 +1,15 @@ +require "test_helper" + +class OsmTest < ActiveSupport::TestCase + def test_mercator + proj = OSM::Mercator.new(0, 0, 1, 1, 100, 200) + assert_in_delta(50, proj.x(0.5), 0.01) + assert_in_delta(100, proj.y(0.5), 0.01) + end + + def test_mercator_collapsed_bbox + proj = OSM::Mercator.new(0, 0, 0, 0, 100, 200) + assert_in_delta(50, proj.x(0), 0.01) + assert_in_delta(100, proj.y(0), 0.01) + end +end -- 2.39.5