module Geomodel::Util
Public Class Methods
distance_sorted_edges(cells, point)
click to toggle source
Returns the edges of the rectangular region containing all of the given geocells, sorted by distance from the given point, along with the actual distances from the point to these edges.
Args:
cells: The cells (should be adjacent) defining the rectangular region whose edge distances are requested. point: The point that should determine the edge sort order.
Returns:
A list of (direction, distance) tuples, where direction is the edge and distance is the distance from the point to that edge. A direction value of (0,-1), for example, corresponds to the South edge of the rectangular region containing all of the given geocells.
# File lib/geomodel/util.rb, line 29 def self.distance_sorted_edges(cells, point) # TODO(romannurik): Assert that lat,lon are actually inside the geocell. boxes = cells.map { |cell| Geomodel::GeoCell.compute_box(cell) } max_box = Geomodel::Types::Box.new( boxes.map(&:north).max, boxes.map(&:east).max, boxes.map(&:south).max, boxes.map(&:west).max ) dist_south = Geomodel::Math.distance(Geomodel::Types::Point.new(max_box.south, point.longitude), point) dist_north = Geomodel::Math.distance(Geomodel::Types::Point.new(max_box.north, point.longitude), point) dist_west = Geomodel::Math.distance(Geomodel::Types::Point.new(point.latitude, max_box.west), point) dist_east = Geomodel::Math.distance(Geomodel::Types::Point.new(point.latitude, max_box.east), point) [ [Geomodel::GeoCell::SOUTH, dist_south], [Geomodel::GeoCell::NORTH, dist_north], [Geomodel::GeoCell::WEST, dist_west], [Geomodel::GeoCell::EAST, dist_east] ].sort { |x, y| x[1] <=> y[1] }.transpose end
merge_in_place(target, arrays, dup_func = nil, comp_func = nil)
click to toggle source
# File lib/geomodel/util.rb, line 3 def self.merge_in_place(target, arrays, dup_func = nil, comp_func = nil) arrays.each do |array| array.each do |element| target.push(element) end end comp_func.nil? ? target.sort! : target.sort!(&comp_func) dup_func.nil? ? target.uniq! : target.uniq!(&dup_func) end