Files

GeoRuby::SimpleFeatures::Point

Represents a point. It is in 3D if the Z coordinate is not nil.

Attributes

lat[RW]
lng[RW]
lon[RW]
m[RW]
x[RW]
y[RW]
z[RW]

Public Class Methods

from_coordinates(coords,srid=DEFAULT_SRID,with_z=false,with_m=false) click to toggle source

creates a point from an array of coordinates

# File lib/geo_ruby/simple_features/point.rb, line 188
def self.from_coordinates(coords,srid=DEFAULT_SRID,with_z=false,with_m=false)
  if ! (with_z or with_m)
    from_x_y(coords[0],coords[1],srid)
  elsif with_z and with_m
    from_x_y_z_m(coords[0],coords[1],coords[2],coords[3],srid)
  elsif with_z
    from_x_y_z(coords[0],coords[1],coords[2],srid)
  else
    from_x_y_m(coords[0],coords[1],coords[2],srid) 
  end
end
from_lon_lat(x,y,srid=DEFAULT_SRID) click to toggle source
Alias for: from_x_y
from_lon_lat_m(x,y,m,srid=DEFAULT_SRID) click to toggle source
Alias for: from_x_y_m
from_lon_lat_z(x,y,z,srid=DEFAULT_SRID) click to toggle source
Alias for: from_x_y_z
from_lon_lat_z_m(x,y,z,m,srid=DEFAULT_SRID) click to toggle source
Alias for: from_x_y_z_m
from_x_y(x,y,srid=DEFAULT_SRID) click to toggle source

creates a point from the X and Y coordinates

# File lib/geo_ruby/simple_features/point.rb, line 201
def self.from_x_y(x,y,srid=DEFAULT_SRID)
  point= new(srid)
  point.set_x_y(x,y)
end
Also aliased as: from_lon_lat
from_x_y_m(x,y,m,srid=DEFAULT_SRID) click to toggle source

creates a point from the X, Y and M coordinates

# File lib/geo_ruby/simple_features/point.rb, line 214
def self.from_x_y_m(x,y,m,srid=DEFAULT_SRID)
  point= new(srid,false,true)
  point.m=m
  point.set_x_y(x,y)
end
Also aliased as: from_lon_lat_m
from_x_y_z(x,y,z,srid=DEFAULT_SRID) click to toggle source

creates a point from the X, Y and Z coordinates

# File lib/geo_ruby/simple_features/point.rb, line 207
def self.from_x_y_z(x,y,z,srid=DEFAULT_SRID)
  point= new(srid,true)
  point.set_x_y_z(x,y,z)
end
Also aliased as: from_lon_lat_z
from_x_y_z_m(x,y,z,m,srid=DEFAULT_SRID) click to toggle source

creates a point from the X, Y, Z and M coordinates

# File lib/geo_ruby/simple_features/point.rb, line 221
def self.from_x_y_z_m(x,y,z,m,srid=DEFAULT_SRID)
  point= new(srid,true,true)
  point.m=m
  point.set_x_y_z(x,y,z)
end
Also aliased as: from_lon_lat_z_m
new(srid=DEFAULT_SRID,with_z=false,with_m=false) click to toggle source
# File lib/geo_ruby/simple_features/point.rb, line 14
def initialize(srid=DEFAULT_SRID,with_z=false,with_m=false)
  super(srid,with_z,with_m)
  @x=0.0
  @y=0.0
  @z=0.0 #default value : meaningful if with_z

  @m=0.0 #default value : meaningful if with_m

end

Public Instance Methods

==(other_point) click to toggle source

tests the equality of the position of points + m

# File lib/geo_ruby/simple_features/point.rb, line 123
def ==(other_point)
  if other_point.class != self.class
    false
  else
    @x == other_point.x and @y == other_point.y and @z == other_point.z and @m == other_point.m
  end
end
bounding_box() click to toggle source

Bounding box in 2D/3D. Returns an array of 2 points

# File lib/geo_ruby/simple_features/point.rb, line 110
def bounding_box
  unless with_z
    [Point.from_x_y(@x,@y),Point.from_x_y(@x,@y)]
  else
    [Point.from_x_y_z(@x,@y,@z),Point.from_x_y_z(@x,@y,@z)]
  end
end
ellipsoidal_distance(point, a = 6378137.0, b = 6356752.3142) click to toggle source

Ellipsoidal distance in m using Vincenty’s formula. Lifted entirely from Chris Veness’s code at www.movable-type.co.uk/scripts/LatLongVincenty.html and adapted for Ruby. Assumes the x and y are the lon and lat in degrees. a is the semi-major axis (equatorial radius) of the ellipsoid b is the semi-minor axis (polar radius) of the ellipsoid Their values by default are set to the ones of the WGS84 ellipsoid

# File lib/geo_ruby/simple_features/point.rb, line 62
def ellipsoidal_distance(point, a = 6378137.0, b = 6356752.3142)
  deg_to_rad = 0.0174532925199433
  
  f = (a-b) / a
  l = (point.lon - lon) * deg_to_rad
  
  u1 = Math.atan((1-f) * Math.tan(lat * deg_to_rad ))
  u2 = Math.atan((1-f) * Math.tan(point.lat * deg_to_rad))
  sinU1 = Math.sin(u1)
  cosU1 = Math.cos(u1)
  sinU2 = Math.sin(u2)
  cosU2 = Math.cos(u2)
  
  lambda = l
  lambdaP = 2 * Math::PI
  iterLimit = 20
  
  while (lambda-lambdaP).abs > 1e-12 && --iterLimit>0
    sinLambda = Math.sin(lambda)
    cosLambda = Math.cos(lambda)
    sinSigma = Math.sqrt((cosU2*sinLambda) * (cosU2*sinLambda) + (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda))
    
    return 0 if sinSigma == 0 #coincident points

    
    cosSigma = sinU1*sinU2 + cosU1*cosU2*cosLambda
    sigma = Math.atan2(sinSigma, cosSigma)
    sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma
    cosSqAlpha = 1 - sinAlpha*sinAlpha
    cos2SigmaM = cosSigma - 2*sinU1*sinU2/cosSqAlpha
    
    cos2SigmaM = 0 if (cos2SigmaM.nan?) #equatorial line: cosSqAlpha=0


    c = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha))
    lambdaP = lambda
    lambda = l + (1-c) * f * sinAlpha * (sigma + c * sinSigma * (cos2SigmaM + c * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)))
  end
  return NaN if iterLimit==0 #formula failed to converge


  uSq = cosSqAlpha * (a*a - b*b) / (b*b)
  a_bis = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)))
  b_bis = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)))
  deltaSigma = b_bis * sinSigma*(cos2SigmaM + b_bis/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)- b_bis/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)))

  b*a_bis*(sigma-deltaSigma)
end
euclidian_distance(point) click to toggle source

Return the distance between the 2D points (ie taking care only of the x and y coordinates), assuming the points are in projected coordinates. Euclidian distance in whatever unit the x and y ordinates are.

# File lib/geo_ruby/simple_features/point.rb, line 39
def euclidian_distance(point)
  Math.sqrt((point.x - x)**2 + (point.y - y)**2)
end
m_range() click to toggle source
# File lib/geo_ruby/simple_features/point.rb, line 118
def m_range
  [@m,@m]
end
set_lon_lat(x,y) click to toggle source
Alias for: set_x_y
set_lon_lat_z(x,y,z) click to toggle source
Alias for: set_x_y_z
set_x_y(x,y) click to toggle source

sets all coordinates of a 2D point in one call

# File lib/geo_ruby/simple_features/point.rb, line 31
def set_x_y(x,y)
  @x=x
  @y=y
  self
end
Also aliased as: set_lon_lat
set_x_y_z(x,y,z) click to toggle source

sets all coordinates in one call. Use the m accessor to set the m.

# File lib/geo_ruby/simple_features/point.rb, line 22
def set_x_y_z(x,y,z)
  @x=x
  @y=y
  @z=z
  self
end
Also aliased as: set_lon_lat_z
spherical_distance(point,radius=6370997.0) click to toggle source

Returns the sperical distance in m, with a radius of 6471000m, with the haversine law. Assumes x is the lon and y the lat, in degrees (Changed in version 1.1). The user has to make sure using this distance makes sense (ie she should be in latlon coordinates)

# File lib/geo_ruby/simple_features/point.rb, line 44
def spherical_distance(point,radius=6370997.0)
  deg_to_rad = 0.0174532925199433
  
  radlat_from = lat * deg_to_rad
  radlat_to = point.lat * deg_to_rad
  
  dlat = (point.lat - lat) * deg_to_rad
  dlon = (point.lon - lon) * deg_to_rad
 
  a = Math.sin(dlat/2)**2 + Math.cos(radlat_from) * Math.cos(radlat_to) * Math.sin(dlon/2)**2
  c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a))
  radius * c
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.