Source code for libb.geo

"""Geographic utilities for coordinate transformations"""

import logging
import math

logger = logging.getLogger(__name__)

__all__ = [
    'merc_x',
    'merc_y',
]


[docs] def merc_x(lon, r_major=6378137.0): """Project longitude into mercator / radians from major axis. :param float lon: Longitude in degrees. :param float r_major: Major axis radius in meters (default: Earth WGS84). :returns: Mercator x coordinate. :rtype: float Example:: >>> "{:0.3f}".format(merc_x(40.7484)) '4536091.139' """ return r_major * math.radians(lon)
[docs] def merc_y(lat, r_major=6378137.0, r_minor=6356752.3142): """Project latitude into mercator / radians from major/minor axes. :param float lat: Latitude in degrees. :param float r_major: Major axis radius in meters (default: Earth WGS84). :param float r_minor: Minor axis radius in meters (default: Earth WGS84). :returns: Mercator y coordinate. :rtype: float Example:: >>> "{:0.3f}".format(merc_y(73.9857)) '12468646.871' """ lat = min(lat, 89.5) lat = max(lat, -89.5) eccent = math.sqrt(1 - (r_minor / r_major) ** 2) phi = math.radians(lat) sinphi = math.sin(phi) con = eccent * sinphi com = eccent / 2 den = ((1.0 - con) / (1.0 + con)) ** com ts = math.tan((math.pi / 2 - phi) / 2) / den y = 0.0 - r_major * math.log(ts) return y
if __name__ == '__main__': __import__('doctest').testmod(optionflags=4 | 8 | 32)