module Geos::GoogleMaps::PolylineEncoder

Public Class Methods

decode(encoded) click to toggle source
# File lib/geos/google_maps/polyline_encoder.rb, line 44
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) click to toggle source

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.

# 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