def test_vreckon(): """ tests scalars, vectors""" # scalar assert vreckon(*ll0, sr[0], az[0]) == approx((lat2[0], lon2[0], az2[0])) # az vector a, b, c = vreckon(*ll0, sr[0], az) assert a == approx(lat2) assert b == approx(lon2) assert c == approx(az2) # rng, az vectors a, b, c = vreckon(*ll0, sr, az) assert a == approx(lat3) assert b == approx(lon3) assert c == approx(az3)
def test_identity(lat, lon, slantrange, az): lat1, lon1 = vincenty.vreckon(lat, lon, slantrange, az) dist, az1 = vincenty.vdist(lat, lon, lat1, lon1) assert dist == approx(slantrange) assert az1 == approx(az)
def test_vreckon(): """ tests scalars, vectors""" pytest.importorskip('pytest', minversion='3.5') # scalar assert vreckon(*ll0, sr[0], az[0]) == approx((lat2[0], lon2[0], az2[0])) # az vector a, b, c = vreckon(*ll0, sr[0], az) assert a == approx(lat2) assert b == approx(lon2) assert c == approx(az2) # rng, az vectors a, b, c = vreckon(*ll0, sr, az) assert a == approx(lat3) assert b == approx(lon3) assert c == approx(az3)
def test_unit(lat, lon, srange, az, lato, lono): lat1, lon1 = vincenty.vreckon(lat, lon, srange, az) assert lat1 == approx(lato) assert isinstance(lat1, float) assert lon1 == approx(lono, rel=0.001) assert isinstance(lon1, float)
def download(site: str): # %% SITE site = site.lower() DataAccessLayer.changeEDEXHost('edex-cloud.unidata.ucar.edu') request = DataAccessLayer.newDataRequest() request.setDatatype('radar') request.setLocationNames(site) # %% TIME times = DataAccessLayer.getAvailableTimes(request) times = [parse(str(t)) for t in times] timerange = TimeRange(times[0], times[-1]) # %% REQUEST client = ThriftClient.ThriftClient('edex-cloud.unidata.ucar.edu') request = GetRadarDataRecordRequest() request.setTimeRange(timerange) request.setRadarId(site) code = 'N0Q' request.setProductCode(nexrad[code]['id']) request.setPrimaryElevationAngle(nexrad[code]['elev']) response = client.sendRequest(request) records = response.getData() print(f'found {len(records)} records at {site}') if not response.getData(): raise OSError(f'data not available {timerange}') for rec in records: idra = rec.getHdf5Data() rdat, azdat, depVals, threshVals = RadarCommon.get_hdf5_data(idra) # dim = rdat.getDimension() lat, lon = float(rec.getLatitude()), float(rec.getLongitude()) radials, rangeGates = rdat.getSizes() # Convert raw byte to pixel value array = np.array(rdat.getByteData()) array[array < 0] = array[array < 0] + 256 if azdat: azVals = azdat.getFloatData() az = np.array(RadarCommon.encode_radial(azVals)) # dattyp = RadarCommon.get_data_type(azdat) az = np.append(az, az[-1]) # header = RadarCommon.get_header(rec, format, rangeGates, radials, azdat, 'description') rng = np.linspace(0, rangeGates, rangeGates + 1) * nexrad[code]['res'] lats = np.empty((rng.size, az.size)) lons = np.empty_like(lats) for i, a in enumerate(az): lats, lons, _ = vreckon(lat, lon, rng, a)
def bench_vreckon(N: int) -> float: sr = np.random.random(N) az = np.random.random(N) tic = time() a, b, c = vreckon(*ll0, sr, az) return time() - tic
def bench_vreckon(N: int) -> float: sr = np.random.random(N) az = np.random.random(N) tic = time.monotonic() a, b = vreckon(ll0[0], ll0[1], sr, az) return time.monotonic() - tic
def test_vdist(): lat1, lon1, a21 = vreckon(*ll0, sr[0], az[0]) assert vdist(*ll0, lat1, lon1) == approx((sr[0], az[0], a21)) # lat, lon vectors asr, aaz, aa21 = vdist(*ll0, lat2, lon2) assert np.all(sr[0] == approx(asr)) # for older pytest assert aaz == approx(az)
def bench_vreckon(N: int) -> float: sr = np.random.random(N) az = np.random.random(N) tic = time() a, b, c = vreckon(*ll0, sr, az) return time() - tic
def main(): p = ArgumentParser(description='Python port of vreckon.m') p.add_argument('lat', help='latitude WGS-84 [degrees]', type=float) p.add_argument('lon', help='longitude WGS-84 [degrees]', type=float) p.add_argument('range', help='range from start point [meters]', type=float) p.add_argument('azimuth', help='azimuth to start [deg.]', type=float) P = p.parse_args() lat2, lon2, a21 = vreckon(P.lat, P.lon, P.range, P.azimuth) print('new (lat, lon) ({}, {}) '.format(lat2, lon2)) print('az back to start:', a21)
def test_vdist(): pytest.importorskip('pytest', minversion='3.5') lat1, lon1, a21 = vreckon(*ll0, sr[0], az[0]) assert vdist(*ll0, lat1, lon1) == approx((sr[0], az[0], a21)) # lat, lon vectors asr, aaz, aa21 = vdist(*ll0, lat2, lon2) assert np.all(sr[0] == approx(asr)) # for older pytest assert aaz == approx(az)
def test_compare_vicenty(): taz, tsr = 38, 3000 pyproj = pytest.importorskip('pyproj') lat2, lon2, a21 = vreckon(10, 20, tsr, taz) p4lon, p4lat, p4a21 = pyproj.Geod(ellps='WGS84').fwd(lon2, lat2, taz, tsr) assert (p4lon, p4lat, p4a21 % 360.) == approx((lon2, lat2, a21), rel=0.0025) p4az, p4a21, p4sr = pyproj.Geod(ellps='WGS84').inv(20, 10, lon2, lat2) assert (p4az, p4a21 % 360., p4sr) == approx((taz, a21, tsr))
def main(): p = ArgumentParser(description="Given starting latitude, longitude: find final lat,lon for distance and azimuth") p.add_argument("lat", help="latitude WGS-84 [degrees]", type=float) p.add_argument("lon", help="longitude WGS-84 [degrees]", type=float) p.add_argument("range", help="range from start point [meters]", type=float) p.add_argument("azimuth", help="clockwise from north: azimuth to start [degrees]", type=float) P = p.parse_args() lat2, lon2, a21 = vreckon(P.lat, P.lon, P.range, P.azimuth) print("{:.4f} {:.4f}".format(lat2, lon2)) print("{:.1f}".format(a21))
def main(): p = ArgumentParser(description='Given starting latitude, longitude: find final lat,lon for distance and azimuth') p.add_argument('lat', help='latitude WGS-84 [degrees]', type=float) p.add_argument('lon', help='longitude WGS-84 [degrees]', type=float) p.add_argument('range', help='range from start point [meters]', type=float) p.add_argument('azimuth', help='clockwise from north: azimuth to start [degrees]', type=float) P = p.parse_args() lat2, lon2, a21 = vreckon(P.lat, P.lon, P.range, P.azimuth) print('{:.4f} {:.4f}'.format(lat2, lon2)) print('{:.1f}'.format(a21))
def test_compare_vicenty(): taz, tsr = 38, 3000 pyproj = pytest.importorskip("pyproj") lat2, lon2 = vreckon(10, 20, tsr, taz) p4lon, p4lat, p4a21 = pyproj.Geod(ellps="WGS84").fwd(lon2, lat2, taz, tsr) assert p4lon == approx(lon2, rel=0.0025) assert p4lat == approx(lat2, rel=0.0025) p4az, p4a21, p4sr = pyproj.Geod(ellps="WGS84").inv(20, 10, lon2, lat2) assert (p4az, p4sr) == approx((taz, tsr))
def sampledata(Np,mps,Ts, lon0, lat0,tstart, azim): # mps: speed meters/sec # Np: number of points # Ts: freq = f'{Ts}S' tr = pd.date_range(tstart,periods=Np,freq=freq).to_pydatetime() t = [t.isoformat(timespec='seconds') for t in tr] rng = mps * np.arange(0,Np*Ts,Ts) lonLatAlt = np.zeros((Np,3)) lonLatAlt[:,1], lonLatAlt[:,0] = vreckon(lat0, lon0, rng, azim=azim)[:2] return t, lonLatAlt
def main(): p = ArgumentParser( description= 'Given starting latitude, longitude: find final lat,lon for distance and azimuth' ) p.add_argument('lat', help='latitude WGS-84 [degrees]', type=float) p.add_argument('lon', help='longitude WGS-84 [degrees]', type=float) p.add_argument('range', help='range from start point [meters]', type=float) p.add_argument('azimuth', help='clockwise from north: azimuth to start [degrees]', type=float) P = p.parse_args() lat2, lon2, a21 = vreckon(P.lat, P.lon, P.range, P.azimuth) print('{:.4f} {:.4f}'.format(lat2, lon2)) print('{:.1f}'.format(a21))
def drawmap(dat, callsign, call2, b): callsign = callsign.upper() call2 = [c.upper() for c in call2] maid0 = dat.loc[dat['txcall'] == callsign, 'txgrid'].iat[0].strip() ll0 = mlocs.toLoc(maid0) #%% ax = figure().gca() m = Basemap(projection='merc', llcrnrlat=ll0[0] - 5, urcrnrlat=ll0[0] + 5, llcrnrlon=ll0[1] - 10, urcrnrlon=ll0[1] + 10, lat_ts=20, resolution='l') m.drawcoastlines() m.drawcountries() #m.drawmeridians(arange(0,360,30)) #m.drawparallels(arange(-90,90,30)) #%% plot self x, y = m(ll0[1], ll0[0]) m.plot(x, y, 'o', color='limegreen', markersize=8, markerfacecolor='none') #%% plot others #station = DataFrame(index=call2,columns =['muf_fact','latlon','midlatlon']) for c in call2: rxgrid = dat.loc[dat['rxcall'] == c, 'rxgrid'].iat[0].strip() latlon = mlocs.toLoc(rxgrid) # plot this station location (by Maidenhead) x, y = m(latlon[1], latlon[0]) m.plot(x, y, 'o', color='red', markersize=8, markerfacecolor='none') #%% estimate Ne distm, az = vdist(ll0[0], ll0[1], latlon[0], latlon[1])[:2] aoi = atan(distm / 2 / F2h) muf_fact = 1 / cos(aoi) # lat,lon where ray refracted (midpoint between stations) midlatlon = vreckon(ll0[0], ll0[1], distm / 2, az) # plot midpoint Ne x, y = m(midlatlon[1], midlatlon[0]) m.plot(x, y, 'o', color='blue', markersize=6) ax.set_title(f'WSPR {b} MHz')
def test_vincenty(self): if numpy is None: logging.warning('Vincenty not tested') return az = 38 sr = 3e3 lat2, lon2, a21 = vreckon(10, 20, sr, az) assert_allclose((lat2, lon2, a21), (10.02137267, 20.016847, 218.0029286)) if pyproj: p4lon, p4lat, p4a21 = pyproj.Geod(ellps='WGS84').fwd( lon2, lat2, az, sr) assert_allclose((p4lon, p4lat, p4a21 % 360.), (lon2, lat2, a21), rtol=0.0025) assert_allclose(vdist(10, 20, lat2, lon2), (sr, az, a21)) if pyproj: p4az, p4a21, p4sr = pyproj.Geod(ellps='WGS84').inv( 20, 10, lon2, lat2) assert_allclose((p4az, p4a21 % 360., p4sr), (az, a21, sr))
def test_both_vector(): pytest.importorskip("numpy") a, b = vincenty.vreckon(10, 20, sr1, az1) assert a == approx(lat3) assert b == approx(lon3)
def test_az_vector(): pytest.importorskip("numpy") a, b = vincenty.vreckon(*ll0, sr1[0], az1) assert a == approx(lat2) assert b == approx(lon2)
def test_vreckon(): lat2, lon2, a21 = vreckon(10, 20, 3000, 38) assert_almost_equal(lat2, 10.021372672660874) assert_almost_equal(lon2, 20.016847098929979) assert_almost_equal(a21, 218.0029285624942)
#!/usr/bin/env python from pymap3d.vincenty import vreckon if __name__ == '__main__': # pragma: no cover from argparse import ArgumentParser p = ArgumentParser(description='Python port of vreckon.m') p.add_argument('lat', help='latitude WGS-84 [degrees]', type=float) p.add_argument('lon', help='longitude WGS-84 [degrees]', type=float) p.add_argument('range', help='range from start point [meters]', type=float) p.add_argument('azimuth', help='azimuth to start [deg.]', type=float) p = p.parse_args() lat2, lon2, a21 = vreckon(p.lat, p.lon, p.range, p.azimuth) print('new lat / lon {} / {} '.format(lat2,lon2)) print('az back to start:', a21)