Module: Geos::GoogleMaps::PolylineEncoder

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

Class Method Summary collapse

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