Module: Geos::GoogleMaps::PolylineEncoder
- Defined in:
- lib/geos/google_maps/polyline_encoder.rb
Class Method Summary collapse
- .decode(encoded) ⇒ Object
-
.encode(points, level = 3) ⇒ Object
Encodes a series of points into Google’s encoded polyline format.
Class Method Details
.decode(encoded) ⇒ Object
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/geos/google_maps/polyline_encoder.rb', line 42 def decode(encoded) retval = [] index = 0 lat = 0 lng = 0 while (index < encoded.length) index, lat = decode_number(encoded, lat, index) index, lng = decode_number(encoded, lng, index) retval.push([ lng * 1e-5, lat * 1e-5]) end retval end |
.encode(points, level = 3) ⇒ Object
Encodes a series of points into Google’s encoded polyline format. See code.google.com/apis/maps/documentation/reference.html for details, specifically GPolyline#fromEncoded and GPolygon#fromEncoded.
The level parameter is the zoom level you’re encoding at. See the Google Maps API reference for details on that.
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 |
# File 'lib/geos/google_maps/polyline_encoder.rb', line 14 def encode(points, level = 3) if points.is_a?(Geos::LineString) points = points.coord_seq end encoded_points = String.new encoded_levels = String.new prev_lat = 0 prev_lng = 0 points.each do |p| lat_e5 = (p[1] * 1e5).floor lng_e5 = (p[0] * 1e5).floor cur_lat = lat_e5 - prev_lat cur_lng = lng_e5 - prev_lng prev_lat = lat_e5 prev_lng = lng_e5 encoded_points += encode_signed_number(cur_lat) + encode_signed_number(cur_lng) encoded_levels += encode_number(level) end { :points => encoded_points, :levels => encoded_levels } end |