예제 #1
0
    def fwd(self, lons, lats, az, dist, radians=False):
        """
        forward transformation - Returns longitudes, latitudes and back
        azimuths of terminus points given longitudes (lons) and
        latitudes (lats) of initial points, plus forward azimuths (az)
        and distances (dist).

        Works with numpy and regular python array objects, python
        sequences and scalars.

        if radians=True, lons/lats and azimuths are radians instead of
        degrees. Distances are in meters.
        """
        # process inputs, making copies that support buffer API.
        inx, xisfloat, xislist, xistuple = _copytobuffer(lons)
        iny, yisfloat, yislist, yistuple = _copytobuffer(lats)
        inz, zisfloat, zislist, zistuple = _copytobuffer(az)
        ind, disfloat, dislist, distuple = _copytobuffer(dist)
        # call geod_for function. inputs modified in place.
        _Geod._fwd(self, inx, iny, inz, ind, radians=radians)
        # if inputs were lists, tuples or floats, convert back.
        outx = _convertback(xisfloat,xislist,xistuple,inx)
        outy = _convertback(yisfloat,yislist,xistuple,iny)
        outz = _convertback(zisfloat,zislist,zistuple,inz)
        return outx, outy, outz
예제 #2
0
    def npts(self, lon1, lat1, lon2, lat2, npts, radians=False):
        """
        Given a single initial point and terminus point (specified by
        python floats lon1,lat1 and lon2,lat2), returns a list of
        longitude/latitude pairs describing npts equally spaced
        intermediate points along the geodesic between the initial and
        terminus points.

        if radians=True, lons/lats are radians instead of degrees.

        Example usage:

        >>> from pyproj import Geod
        >>> g = Geod(ellps='clrk66') # Use Clarke 1966 ellipsoid.
        >>> # specify the lat/lons of Boston and Portland.
        >>> boston_lat = 42.+(15./60.); boston_lon = -71.-(7./60.)
        >>> portland_lat = 45.+(31./60.); portland_lon = -123.-(41./60.)
        >>> # find ten equally spaced points between Boston and Portland.
        >>> lonlats = g.npts(boston_lon,boston_lat,portland_lon,portland_lat,10)
        >>> for lon,lat in lonlats: print '%6.3f  %7.3f' % (lat, lon)
        43.528  -75.414
        44.637  -79.883
        45.565  -84.512
        46.299  -89.279
        46.830  -94.156
        47.149  -99.112
        47.251  -104.106
        47.136  -109.100
        46.805  -114.051
        46.262  -118.924
        """
        lons, lats = _Geod._npts(self,lon1,lat1,lon2,lat2,npts,radians=radians)
        return zip(lons, lats)
예제 #3
0
    def inv(self, lons1, lats1, lons2, lats2, radians=False):
        """
        inverse transformation - Returns forward and back azimuths, plus
        distances between initial points (specified by lons1, lats1) and
        terminus points (specified by lons2, lats2).

        Works with numpy and regular python array objects, python
        sequences and scalars.

        if radians=True, lons/lats and azimuths are radians instead of
        degrees. Distances are in meters.
        """
        # process inputs, making copies that support buffer API.
        inx, xisfloat, xislist, xistuple = _copytobuffer(lons1)
        iny, yisfloat, yislist, yistuple = _copytobuffer(lats1)
        inz, zisfloat, zislist, zistuple = _copytobuffer(lons2)
        ind, disfloat, dislist, distuple = _copytobuffer(lats2)
        # call geod_inv function. inputs modified in place.
        _Geod._inv(self, inx, iny, inz, ind, radians=radians)
        # if inputs were lists, tuples or floats, convert back.
        outx = _convertback(xisfloat,xislist,xistuple,inx)
        outy = _convertback(yisfloat,yislist,xistuple,iny)
        outz = _convertback(zisfloat,zislist,zistuple,inz)
        return outx, outy, outz
예제 #4
0
    def __new__(self, initparams=None, **kwargs):
        """
        initialize a Geod class instance.

        Geodetic parameters for specifying the ellipsoid or sphere to
        use must either be given in a dictionary 'initparams' or as
        keyword arguments. Following is a list of the ellipsoids that
        may be defined using the 'ellps' keyword:

           MERIT a=6378137.0      rf=298.257       MERIT 1983
           SGS85 a=6378136.0      rf=298.257       Soviet Geodetic System 85
           GRS80 a=6378137.0      rf=298.257222101 GRS 1980(IUGG, 1980)
           IAU76 a=6378140.0      rf=298.257       IAU 1976
            airy a=6377563.396    b=6356256.910    Airy 1830
          APL4.9 a=6378137.0.     rf=298.25        Appl. Physics. 1965
           NWL9D a=6378145.0.     rf=298.25        Naval Weapons Lab., 1965
        mod_airy a=6377340.189    b=6356034.446    Modified Airy
          andrae a=6377104.43     rf=300.0         Andrae 1876 (Den., Iclnd.)
         aust_SA a=6378160.0      rf=298.25        Australian Natl & S. Amer. 1969
           GRS67 a=6378160.0      rf=298.2471674270 GRS 67(IUGG 1967)
          bessel a=6377397.155    rf=299.1528128   Bessel 1841
        bess_nam a=6377483.865    rf=299.1528128   Bessel 1841 (Namibia)
          clrk66 a=6378206.4      b=6356583.8      Clarke 1866
          clrk80 a=6378249.145    rf=293.4663      Clarke 1880 mod.
             CPM a=6375738.7      rf=334.29        Comm. des Poids et Mesures 1799
          delmbr a=6376428.       rf=311.5         Delambre 1810 (Belgium)
         engelis a=6378136.05     rf=298.2566      Engelis 1985
         evrst30 a=6377276.345    rf=300.8017      Everest 1830
         evrst48 a=6377304.063    rf=300.8017      Everest 1948
         evrst56 a=6377301.243    rf=300.8017      Everest 1956
         evrst69 a=6377295.664    rf=300.8017      Everest 1969
         evrstSS a=6377298.556    rf=300.8017      Everest (Sabah & Sarawak)
         fschr60 a=6378166.       rf=298.3         Fischer (Mercury Datum) 1960
        fschr60m a=6378155.       rf=298.3         Modified Fischer 1960
         fschr68 a=6378150.       rf=298.3         Fischer 1968
         helmert a=6378200.       rf=298.3         Helmert 1906
           hough a=6378270.0      rf=297.          Hough
            intl a=6378388.0      rf=297.          International 1909 (Hayford)
           krass a=6378245.0      rf=298.3         Krassovsky, 1942
           kaula a=6378163.       rf=298.24        Kaula 1961
           lerch a=6378139.       rf=298.257       Lerch 1979
           mprts a=6397300.       rf=191.          Maupertius 1738
        new_intl a=6378157.5      b=6356772.2      New International 1967
         plessis a=6376523.       b=6355863.       Plessis 1817 (France)
          SEasia a=6378155.0      b=6356773.3205   Southeast Asia
         walbeck a=6376896.0      b=6355834.8467   Walbeck
           WGS60 a=6378165.0      rf=298.3         WGS 60
           WGS66 a=6378145.0      rf=298.25        WGS 66
           WGS72 a=6378135.0      rf=298.26        WGS 72
           WGS84 a=6378137.0      rf=298.257223563 WGS 84
          sphere a=6370997.0      b=6370997.0      Normal Sphere (r=6370997)

        The parameters of the ellipsoid may also be set directly using
        the 'a' (semi-major or equatorial axis radius) keyword, and
        any one of the following keywords: 'b' (semi-minor,
        or polar axis radius), 'e' (eccentricity), 'es' (eccentricity
        squared), 'f' (flattening), or 'rf' (reciprocal flattening).

        See the proj documentation (http://proj.maptools.org) for more
        information about specifying ellipsoid parameters (specifically,
        the chapter 'Specifying the Earth's figure' in the main Proj
        users manual).

        Example usage:

        >>> from pyproj import Geod
        >>> g = Geod(ellps='clrk66') # Use Clarke 1966 ellipsoid.
        >>> # specify the lat/lons of some cities.
        >>> boston_lat = 42.+(15./60.); boston_lon = -71.-(7./60.)
        >>> portland_lat = 45.+(31./60.); portland_lon = -123.-(41./60.)
        >>> newyork_lat = 40.+(47./60.); newyork_lon = -73.-(58./60.)
        >>> london_lat = 51.+(32./60.); london_lon = -(5./60.)
        >>> # compute forward and back azimuths, plus distance
        >>> # between Boston and Portland.
        >>> az12,az21,dist = g.inv(boston_lon,boston_lat,portland_lon,portland_lat)
        >>> print "%7.3f %6.3f %12.3f" % (az12,az21,dist)
        -66.531 75.654  4164192.708
        >>> # compute latitude, longitude and back azimuth of Portland,
        >>> # given Boston lat/lon, forward azimuth and distance to Portland.
        >>> endlon, endlat, backaz = g.fwd(boston_lon, boston_lat, az12, dist)
        >>> print "%6.3f  %6.3f %13.3f" % (endlat,endlon,backaz)
        45.517  -123.683        75.654
        >>> # compute the azimuths, distances from New York to several
        >>> # cities (pass a list)
        >>> lons1 = 3*[newyork_lon]; lats1 = 3*[newyork_lat]
        >>> lons2 = [boston_lon, portland_lon, london_lon]
        >>> lats2 = [boston_lat, portland_lat, london_lat]
        >>> az12,az21,dist = g.inv(lons1,lats1,lons2,lats2)
        >>> for faz,baz,d in zip(az12,az21,dist): print "%7.3f %7.3f %9.3f" % (faz,baz,d)
         54.663 -123.448 288303.720
        -65.463  79.342 4013037.318
         51.254 -71.576 5579916.649
        """
        # if projparams is None, use kwargs.
        if initparams is None:
            if len(kwargs) == 0:
                raise RuntimeError('no ellipsoid control parameters specified')
            else:
                initparams = kwargs
        # set units to meters.
        if not initparams.has_key('units'):
            initparams['units']='m'
        elif initparams['units'] != 'm':
            print 'resetting units to meters ...'
            initparams['units']='m'
        return _Geod.__new__(self, initparams)