Method: Geos::GoogleMaps::PolylineEncoder.encode

Defined in:
lib/geos/google_maps/polyline_encoder.rb

.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.



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
# File 'lib/geos/google_maps/polyline_encoder.rb', line 16

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