This is just a tiny library (actually a gem but not published on rubygems.org) which abstracts away working with GPS points and bounds on the Mercator map.
It was created because I wanted to give Mapbox a set of GPS (lat/lon) points and it would return a properly centered and zoomed in static map. Except that it doesn't do that.
So I crawled around the web and composed all I needed from those three libraries:
- geo-viewport Node.js package,
- node-sphericalmercator Node.js package,
- and Simple Mercator Location Ruby gem.
None of them do all I needed and some of them are really cryptic. It seems to work properly but if you find a bug, please let me know.
What does it do?
Geo::Viewport class initializer expects map bounds array (WSEN: westmost,
southmost, eastmost and northmost coordinates) and an array of mercator map
dimensions in pixels. It than calculates the center, the zoom level and a new
set of bounds for given dimensions. Why new bounds? Because zoom level
is a whole number so the map bounds are expanded a bit to reflect that.
The instance methods are used to get those properties.
Geo::Utils module is a place for all kinds of conversion methods but
there is one externally useful: the
bounds method. It expects an array of
GPS points and returns a
[w, s, e, n] map bounds array which then can
be fed into the initializer.
See examples, too.
# Photos longitude and latitude. gps_data = [ [6.9558, 50.941691666666664], [6.956291666666667, 50.94157777777777], [6.9201500000000005, 50.948233333333334], [9.188316666666667, 45.46555], [9.189741666666666, 45.46562222222222], [9.185799999999999, 45.46757222222222] ] # Calculate the westmost, southmost, eastmost and northmost coordinates. map_bounds = Geo::Utils.bounds(gps_data) dimensions = [1280, 960] viewport = Geo::Viewport.new(map_bounds, dimensions) map_bounds # => [6.9201500000000005, 45.46555, 9.189741666666666, 50.948233333333334] viewport.bounds # => [1.021728515625, 44.574817404670306, 15.084228515625, 51.60437164681676] viewport.dimensions # => [1280, 960] viewport.width # => 1280 viewport.height # => 960 viewport.center # => [8.054945833333333, 48.206891666666664] viewport.center_lon # => 8.054945833333333 viewport.center_lat # => 48.206891666666664 viewport.zoom # => 7
One of the examples uses Gnuplot. If you are on OS X and you use Homebrew,
you may need to install it via
brew install gnuplot --with-x.
Also check the dependecy gems like
$ cd examples $ ruby simple.rb $ ruby mapbox.rb $ ruby mapbox_with_clusters.rb
Add this line to your application's Gemfile:
gem 'geo', git: 'https://github.com/ollie/geo-mercator.git'
And then execute:
After checking out the repo, run
bin/setup to install dependencies. Then, run
bin/console for an interactive prompt that will allow you to experiment.
- Fork it (https://github.com/ollie/geo-mercator/fork)
- Create your feature branch (
git checkout -b my-new-feature)
- Commit your changes (
git commit -am 'Add some feature')
- Push to the branch (
git push origin my-new-feature)
- Create a new Pull Request