crgeo

Simple library for geospatial computations. Also can be used for general spherical geometry.

Configuration

Configure sphere radius. Earth radius (Crgeo::EARTH_RADIUS) is used by default

Crgeo.radius = 3389500
Crgeo.radius
 => 3389500 # meters

Usage

Basic operations

Angle by 3 points. Vertex coordinates are lan and lon:

Crgeo.angle(lat1: 90, lon1: 0, lat2: 0, lon2: 90, lat: 0, lon: 0)
 => 1.570796 # radians

Bearing from 1 to 2:

Crgeo.bearing_between(lat1: 0, lon1: -75, lat2: 0, lon2: -50)
 => 90 # degrees

Center of gravity of points array:

Crgeo.center_of(points: [{lat: 0, lon: 0}, {lat: 0, lon: 1}])
 => {lat: 0, lon: 0.5} # degrees

Distance between two points:

Crgeo.distance_between(lat1: 59.975031, lon1: 30.317386, lat2: 59.977222, lon2: 30.314992)
 => 277.661515 # meters

Length of 1 latitude degree

Crgeo.lat_distance
 => 111194.926644 # meters

Length of 1 longitude degree with defined latitude

Crgeo.lon_distance(lat: 0)
 => 111194.926644 # meters

Normalization. It is not strict operation. Returns coordinates of projection of point to the line with minimum distance between two other points:

Crgeo.normalize(lat1: 59.92878, lon1: 30.412105, lat2: 59.929113, lon2: 30.411852, lat: 59.9287805, lon: 30.4121053)
 => {lat: 59.928780, lon: 30.412104} # degrees

Transfers

Degrees to radians:

Crgeo::Transfers.deg_to_rad(90)
 => 1.570796 # radians

Radians to degrees:

Crgeo::Transfers.rad_to_deg(1.570796)
 => 90 # degrees

Cartesian coordinates to spherical:

Crgeo::Transfers.cartesian_to_spherical(x: 0, y: 0, z: 6371000)
 => {lat: 0, lon: 0} # degrees

# if coordinates can not be transfered to spherical coordinates of sphere with configurated radius and precision 0.01
Crgeo::Transfers.cartesian_to_spherical(x: 0, y: 0, z: 3389500)
 => InvalidCoordinates

Spherical coordinates to cartesian:

Crgeo::Transfers.spherical_to_cartesian(lat: 0, lon: 0)
 => {x: 0, y: 0, z: 6371000} # meters

Validations

If cartesian coordinates can be transfered to spherical of sphere with configurated radius:

Crgeo::Validations.cartesian_coordinates(x: 0, y: 0, z: 6371000, precision: 0.01)
 => true
 
Crgeo::Validations.cartesian_coordinates(x: 0, y: 0, z: 6371000.1, precision: 0.01)
 => false

If spherical coordinates are -180 <= longitude <= 180, -90 <= latitude <= 90

Crgeo::Validations.spherical_coordinates(lat: 90, lon: 0)
 => true

Crgeo::Validations.spherical_coordinates(lat: 90, lon: 181)
 => false

Contributing

Contributions are welcome via Github pull requests.

For all contributions, please respect the following guidelines: