Commit d6a103d5 authored by SVN-Git Migration's avatar SVN-Git Migration

Imported Upstream version 1.0.7+dfsg

parent e446eff5
version 1.0.7 (git tag v1.0.7rel)
---------------------------------
* include mpl_toolkits/__init__.py, since the one installed by matplotlib
is now inaccessible inside an egg (in 1.4.x). Make basemap a 'namespace
package'. Issue 114.
* fix drawmeridians so meridians reach edge of plot when map projection region
is *very* small (issue 113).
* update pyproj (with fixes to geodesic calculations).
* support for rotated pole transformation (projection = 'rotpole').
* fix warpimage with projection = 'hammer' (issue 100).
* fix tolerances for detecting jumps in meridians and parallels for
cyl and rotpole projections (issue 108).
* fix clipping to map projection region done in contourf and contour methods
so it doesn't assume x and y are increasing (issue 110).
version 1.0.6 (git tag v1.0.6rel)
--------------------------------
* fix drawcounties for Python 3.3.
......
......@@ -88,6 +88,8 @@ include examples/ccsm_popgrid.nc
include examples/rita.nc
include examples/maskoceans.py
include examples/utmtest.py
include examples/test_rotpole.py
include examples/wm201_Arctic_JJA_1990-2008_moyenneDesMoyennes.nc
include examples/README
include lib/mpl_toolkits/__init__.py
include lib/mpl_toolkits/basemap/__init__.py
......
Metadata-Version: 1.1
Name: basemap
Version: 1.0.6
Version: 1.0.7
Summary: Plot data on map projections with matplotlib
Home-page: http://matplotlib.sourceforge.net/toolkits.html
Author: Jeff Whitaker
......
from netCDF4 import Dataset
from netCDF4 import Dataset, num2date
import time, calendar, datetime, numpy
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
def datetomsecs(d):
"""convert from datetime to msecs since the unix epoch began"""
return int(calendar.timegm(time.struct_time(d.timetuple()))*1000)
# set date range
date1 = datetime.datetime(2010,1,1,0)
date2 = datetime.datetime(2010,1,8,0)
t1 = datetomsecs(date1); t2 = datetomsecs(date2)
# build constraint expression to get locations of floats in specified time
# range.
urlbase='http://dapper.pmel.noaa.gov/dapper/argo/argo_all.cdp'
sel="?location.JULD,location.LATITUDE,location.LONGITUDE&location.JULD>%s&location.JULD<%s"%(t1,t2)
# retrieve data
dset = Dataset(urlbase+sel)
lats = dset.variables['location.LATITUDE'][:]
lons = dset.variables['location.LONGITUDE'][:]
import urllib, os
# data downloaded from the form at
# http://coastwatch.pfeg.noaa.gov/erddap/tabledap/apdrcArgoAll.html
filename, headers = urllib.urlretrieve('http://coastwatch.pfeg.noaa.gov/erddap/tabledap/apdrcArgoAll.nc?longitude,latitude,time&longitude>=0&longitude<=360&latitude>=-90&latitude<=90&time>=2010-01-01&time<=2010-01-08&distinct()')
dset = Dataset(filename)
lats = dset.variables['latitude'][:]
lons = dset.variables['longitude'][:]
time = dset.variables['time']
times = time[:]
t1 = times.min(); t2 = times.max()
date1 = num2date(t1, units=time.units)
date2 = num2date(t2, units=time.units)
dset.close()
os.remove(filename)
# draw map with markers for float locations
m = Basemap(projection='hammer',lon_0=180)
x, y = m(lons,lats)
......@@ -24,5 +23,5 @@ m.drawmapboundary(fill_color='#99ffff')
m.fillcontinents(color='#cc9966',lake_color='#99ffff')
m.scatter(x,y,3,marker='o',color='k')
plt.title('Locations of %s ARGO floats active between %s and %s' %\
(len(lats),date1.strftime('%Y%m%d'),date2.strftime('%Y%m%d')))
(len(lats),date1,date2),fontsize=12)
plt.show()
......@@ -6,7 +6,7 @@ from datetime import datetime
date = datetime(2007,12,15,0) # date to plot.
# open dataset.
dataset = \
Dataset('http://www.ncdc.noaa.gov/thredds/dodsC/OISST-V2-AVHRR-AMSR_agg')
Dataset('http://www.ncdc.noaa.gov/thredds/dodsC/OISST-V2-AVHRR_agg')
timevar = dataset.variables['time']
timeindex = date2index(date,timevar) # find time index for desired date.
# read sst. Will automatically create a masked array using
......
......@@ -15,7 +15,7 @@ installing basemap.
matplotlib 1.0.0 (or later, `download <http://sf.net/projects/matplotlib/>`__)
python 2.4 (or later but not python3)
Python 2.4 (or later, including Python 3)
matplotlib requires python 2.4 or later (`download <http://www.python.org/download/>`__)
numpy 1.2.1 (or later)
......
......@@ -164,3 +164,5 @@ ArcGIS server using the REST API.
testwmsimage.py shows how to retrieve an image from a WMS server and display
it on a map.
test_rotpole.py shows how to plot regional climate model data in the native 'rotated pole' projection.
......@@ -6,7 +6,7 @@ from datetime import datetime
date = datetime(2007,12,15,0) # date to plot.
# open dataset.
dataset = \
Dataset('http://www.ncdc.noaa.gov/thredds/dodsC/OISST-V2-AVHRR-AMSR_agg')
Dataset('http://www.ncdc.noaa.gov/thredds/dodsC/OISST-V2-AVHRR_agg')
timevar = dataset.variables['time']
timeindex = date2index(date,timevar) # find time index for desired date.
# read sst. Will automatically create a masked array using
......
......@@ -369,6 +369,22 @@ plt.title('Square Lambert Azimuthal Equal Area',y=1.075)
print('plotting Square Lambert Azimuthal example ...')
print(m.proj4string)
# create new figure
fig=plt.figure()
m = Basemap(projection = 'rotpole',lon_0 = -120.,\
o_lon_p = 180, o_lat_p = 0,\
llcrnry = -41.75, urcrnry = 37.75,\
llcrnrx = 137, urcrnrx = 222.5, resolution = 'l')
m.drawcoastlines()
ny,nx = lons.shape
m.contourf(lons[ny/2:,:],lats[ny/2:,:],topodat[ny/2:,:],50,cmap=cmap,extend='both',latlon=True)
m.drawmeridians(np.arange(-180,180,20),labels=[1,1,1,1])
m.drawparallels(np.arange(20,80,20))
m.colorbar()
plt.title('Rotated Pole',y=1.075)
print('plotting Rotated Pole example ...')
print(m.proj4string)
# create new figure
fig=plt.figure()
m = Basemap(lon_0=-105,boundinglat=20.,
......
from __future__ import print_function
from netCDF4 import Dataset
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
nc = Dataset('wm201_Arctic_JJA_1990-2008_moyenneDesMoyennes.nc')
lats = nc.variables['lat'][:]
lons = nc.variables['lon'][:]
rlats = nc.variables['rlat'][:]
rlons = nc.variables['rlon'][:]
rlons, rlats = np.meshgrid(rlons, rlats)
data = nc.variables['air'][0,0,:,:].squeeze()
data = np.ma.masked_values(data,-999.)
rotpole = nc.variables['rotated_pole']
m = Basemap(projection='npstere',lon_0=10,boundinglat=30,resolution='c')
x,y = m(lons,lats)
m.drawcoastlines()
m.contourf(x,y,data,20)
m.drawmeridians(np.arange(-180,180,20))
m.drawparallels(np.arange(20,80,20))
m.colorbar()
plt.title('rotated pole data in polar stere map')
plt.figure()
# o_lon_p, o_lat_p: true lat/lon of pole in rotated coordinate system
# mapping to CF metadata convention:
# grid_north_pole_longitude = normalize180(180 + lon_0), where normalize180
# is a function that maps to interval [-180,180).
# grid_north_pole_latitude = o_lat_p
# north_pole_grid_longitude = o_lon_p (optional, assumed zero if not present)
def normalize180(lon):
"""Normalize lon to range [180, 180)"""
lower = -180.; upper = 180.
if lon > upper or lon == lower:
lon = lower + abs(lon + upper) % (abs(lower) + abs(upper))
if lon < lower or lon == upper:
lon = upper - abs(lon - lower) % (abs(lower) + abs(upper))
return lower if lon == upper else lon
lon_0 = normalize180(rotpole.grid_north_pole_longitude-180.)
o_lon_p = rotpole.north_pole_grid_longitude
o_lat_p = rotpole.grid_north_pole_latitude
print( rotpole )
print( 'lon_0,o_lon_p,o_lat_p=',lon_0,o_lon_p,o_lat_p)
m= Basemap(projection='rotpole',lon_0=lon_0,o_lon_p=o_lon_p,o_lat_p=o_lat_p,\
llcrnrlat = lats[0,0], urcrnrlat = lats[-1,-1],\
llcrnrlon = lons[0,0], urcrnrlon = lons[-1,-1],resolution='c')
x,y = m(lons,lats)
m.drawcoastlines()
m.contourf(x,y,data,20)
m.drawmeridians(np.arange(-180,180,20))
m.drawparallels(np.arange(20,80,20))
m.colorbar()
plt.title('rotated pole data in native map using real sphere corner lat/lons' )
plt.figure()
m= Basemap(projection='rotpole',lon_0=lon_0,o_lon_p=o_lon_p,o_lat_p=o_lat_p,\
llcrnry = rlats[0,0], urcrnry = rlats[-1,-1],\
llcrnrx = rlons[0,0], urcrnrx = rlons[-1,-1],resolution='c')
x,y = m(lons,lats)
m.drawcoastlines()
m.contourf(x,y,data,20)
m.drawmeridians(np.arange(-180,180,20))
m.drawparallels(np.arange(20,80,20))
m.colorbar()
plt.title('rotated pole data in native map using rotated sphere corner lat/lons' )
plt.show()
......@@ -34,6 +34,19 @@ m.drawparallels(np.arange(-90,90,30),color='0.5')
plt.title("Blue Marble image warped from 'cyl' to 'mbtfpq' projection",fontsize=12)
print('warp to McBryde-Thomas Flat-Polar Quartic map ...')
# create new figure
fig=plt.figure()
# define projection centered on North America.
m = Basemap(projection='hammer',lon_0=-100,resolution='l')
m.bluemarble(scale=0.5)
# draw coastlines.
m.drawcoastlines(linewidth=0.5,color='0.5')
# draw lat/lon grid lines every 30 degrees.
m.drawmeridians(np.arange(0,360,60),color='0.5')
m.drawparallels(np.arange(-90,90,30),color='0.5')
plt.title("Blue Marble image warped from 'cyl' to 'hammer' projection",fontsize=12)
print('warp to Hammer map ...')
# create new figure
fig=plt.figure()
# define cylindrical equidistant projection.
......
......@@ -2,3 +2,4 @@ try:
__import__('pkg_resources').declare_namespace(__name__)
except ImportError:
pass # must not have setuptools
This diff is collapsed.
......@@ -74,6 +74,11 @@ class Proj(object):
if self.projection == 'cyl':
llcrnrx = llcrnrlon
llcrnry = llcrnrlat
elif self.projection == 'ob_tran':
self._proj4 = pyproj.Proj(projparams)
llcrnrx,llcrnry = self(llcrnrlon,llcrnrlat)
llcrnrx = _rad2dg*llcrnrx; llcrnry = _rad2dg*llcrnry
if llcrnrx < 0: llcrnrx = llcrnrx + 360
elif self.projection in 'ortho':
if (llcrnrlon == -180 and llcrnrlat == -90 and
urcrnrlon == 180 and urcrnrlat == 90):
......@@ -194,14 +199,15 @@ class Proj(object):
if self.projection == 'aeqd': self._fulldisk=False
# compute x_0, y_0 so ll corner of domain is x=0,y=0.
# note that for 'cyl' x,y == lon,lat
self.projparams['x_0']=-llcrnrx
self.projparams['y_0']=-llcrnry
if self.projection != 'ob_tran':
self.projparams['x_0']=-llcrnrx
self.projparams['y_0']=-llcrnry
# reset with x_0, y_0.
if self.projection != 'cyl':
if self.projection not in ['cyl','ob_tran']:
self._proj4 = pyproj.Proj(projparams)
llcrnry = 0.
llcrnrx = 0.
else:
elif self.projection != 'ob_tran':
llcrnrx = llcrnrlon
llcrnry = llcrnrlat
if urcrnrislatlon:
......@@ -209,6 +215,9 @@ class Proj(object):
self.urcrnrlat = urcrnrlat
if self.projection not in ['ortho','geos','nsper','aeqd'] + _pseudocyl:
urcrnrx,urcrnry = self(urcrnrlon,urcrnrlat)
if self.projection == 'ob_tran':
urcrnrx = _rad2dg*urcrnrx; urcrnry = _rad2dg*urcrnry
if urcrnrx < 0: urcrnrx = urcrnrx + 360
elif self.projection in ['ortho','geos','nsper','aeqd']:
if self._fulldisk:
urcrnrx = 2.*self._width
......@@ -226,6 +235,7 @@ class Proj(object):
urcrnrlon, urcrnrlat = self(urcrnrx, urcrnry, inverse=True)
self.urcrnrlon = urcrnrlon
self.urcrnrlat = urcrnrlat
# corners of domain.
self.llcrnrx = llcrnrx
self.llcrnry = llcrnry
......
This diff is collapsed.
......@@ -64,11 +64,12 @@ deps.remove(os.path.join('src','_proj.c'))
deps.remove(os.path.join('src','_geoslib.c'))
packages = ['mpl_toolkits','mpl_toolkits.basemap']
namespace_packages = ['mpl_toolkits']
package_dirs = {'':'lib'}
extensions = [Extension("mpl_toolkits.basemap._proj",deps+['src/_proj.c'],include_dirs = ['src'],)]
# can't install _geoslib in mpl_toolkits.basemap namespace,
# or Basemap objects won't be pickleable.
if sys.platform == 'win32':
if sys.platform == 'win32':
# don't use runtime_library_dirs on windows (workaround
# for a distutils bug - http://bugs.python.org/issue2437).
#extensions.append(Extension("mpl_toolkits.basemap._geoslib",['src/_geoslib.c'],
......@@ -90,7 +91,8 @@ pathout =\
os.path.join('lib',os.path.join('mpl_toolkits',os.path.join('basemap','data')))
if sys.argv[1] not in ['sdist','clean']:
cc = ccompiler.new_compiler()
#sysconfig.customize_compiler(cc) # doesn't work with python 3.3
sysconfig.get_config_vars()
sysconfig.customize_compiler(cc)
cc.set_include_dirs(['src'])
objects = cc.compile(['nad2bin.c', 'src/pj_malloc.c'])
execname = 'nad2bin'
......@@ -109,7 +111,7 @@ package_data = {'mpl_toolkits.basemap':datafiles}
setup(
name = "basemap",
version = "1.0.6",
version = "1.0.7",
description = "Plot data on map projections with matplotlib",
long_description = """
An add-on toolkit for matplotlib that lets you plot data
......@@ -124,14 +126,15 @@ setup(
license = "OSI Approved",
keywords = ["python","plotting","plots","graphs","charts","GIS","mapping","map projections","maps"],
classifiers = ["Development Status :: 5 - Production/Stable",
"Intended Audience :: Science/Research",
"License :: OSI Approved",
"Intended Audience :: Science/Research",
"License :: OSI Approved",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Topic :: Scientific/Engineering :: Visualization",
"Topic :: Software Development :: Libraries :: Python Modules",
"Operating System :: OS Independent"],
packages = packages,
namespace_packages = namespace_packages,
package_dir = package_dirs,
ext_modules = extensions,
cmdclass = {'build_py': build_py},
......
......@@ -68,7 +68,7 @@ double rot[7][2][2] = ROT;
/**
NOTES: Alex Raichev implemented the math in python and this is a port of his work.
The healpix projection is a Lambert cylindrical equal-area projection for
equaltorial latitudes and an interrupted Colignon projection for polar
equaltorial latitudes and an interrupted Colignon projection for polar
latitudes.
**/
......@@ -77,7 +77,7 @@ double rot[7][2][2] = ROT;
* @param v the parameter whose sign is returned.
* @return 1 for positive number, -1 for negative, and 0 for zero.
**/
double sign (double v) {
static double pj_sign (double v) {
return v > 0 ? 1 : (v < 0 ? -1 : 0);
}
/**
......@@ -286,7 +286,7 @@ double auth_lat(double phi, double e, int inverse){
double ratio = q/qp;
// Rounding errors
if( fabsl(ratio) > 1){
ratio = sign(ratio);
ratio = pj_sign(ratio);
}
return asin(ratio);
}
......@@ -316,7 +316,7 @@ XY healpix_sphere(LP lp, PJ *P){
}
lamc = -3*PI/4 + (PI/2)*cn;
xy.x = lamc + (lam - lamc) * sigma;
xy.y = sign(phi)*PI/4 * (2 - sigma);
xy.y = pj_sign(phi)*PI/4 * (2 - sigma);
}
xy.x = scale_number(xy.x,P->a,0);
xy.y = scale_number(xy.y,P->a,0);
......@@ -348,10 +348,10 @@ LP healpix_sphere_inv(XY xy, PJ *P){
xc = -3.0 * PI/4.0 + (PI/2.0)*cn;
tau = 2.0 - 4.0*fabsl(y)/PI;
lp.lam = xc + (x - xc)/tau;
lp.phi = sign(y)*asin(1.0 - pow(tau , 2.0)/3.0);
lp.phi = pj_sign(y)*asin(1.0 - pow(tau , 2.0)/3.0);
} else {
lp.lam = -1.0*PI - P->lam0;
lp.phi = sign(y)*PI/2.0;
lp.phi = pj_sign(y)*PI/2.0;
}
return (lp);
}
......
This diff is collapsed.
......@@ -8,7 +8,7 @@ cdef double _dg2rad, _rad2dg
_dg2rad = math.radians(1.)
_rad2dg = math.degrees(1.)
_doublesize = sizeof(double)
__version__ = "1.9.3"
__version__ = "1.9.4"
cdef extern from "math.h":
cdef enum:
......@@ -16,13 +16,13 @@ cdef extern from "math.h":
FP_NAN
cdef extern from "geodesic.h":
struct Geodesic:
struct geod_geodesic:
pass
void GeodesicInit(Geodesic* g, double a, double f)
void Direct(Geodesic* g,\
void geod_init(geod_geodesic* g, double a, double f)
void geod_direct(geod_geodesic* g,\
double lat1, double lon1, double azi1, double s12,\
double* plat2, double* plon2, double* pazi2)
void Inverse(Geodesic* g,\
void geod_inverse(geod_geodesic* g,\
double lat1, double lon1, double lat2, double lon2,\
double* ps12, double* pazi1, double* pazi2)
......@@ -36,9 +36,11 @@ cdef extern from "proj_api.h":
projPJ pj_init_plus_ctx(projCtx, char *)
projUV pj_fwd(projUV, projPJ)
projUV pj_inv(projUV, projPJ)
projPJ pj_latlong_from_proj(projPJ)
int pj_transform(projPJ src, projPJ dst, long point_count, int point_offset,
double *x, double *y, double *z)
int pj_is_latlong(projPJ)
char *pj_get_def( projPJ pj, int options)
int pj_is_geocent(projPJ)
char *pj_strerrno(int)
void pj_ctx_free( projCtx )
......@@ -59,6 +61,9 @@ def set_datapath(datapath):
searchpath = bytestr
pj_set_searchpath(1, &searchpath)
def _createproj(projstring):
return Proj(projstring)
cdef class Proj:
cdef projPJ projpj
cdef projCtx projctx
......@@ -85,6 +90,15 @@ cdef class Proj:
pj_free(self.projpj)
pj_ctx_free(self.projctx)
def to_latlong(self):
"""return a new Proj instance which is the geographic (lat/lon)
coordinate version of the current projection"""
cdef projPJ llpj
llpj = pj_latlong_from_proj(self.projpj)
initstring = pj_get_def(llpj, 0)
pj_free(llpj)
return _createproj(initstring)
def __reduce__(self):
"""special method that allows pyproj.Proj instance to be pickled"""
return (self.__class__,(self.srs,))
......@@ -351,12 +365,12 @@ cdef _strencode(pystr,encoding='ascii'):
return pystr # already bytes?
cdef class Geod:
cdef Geodesic _Geodesic
cdef geod_geodesic _geod_geodesic
cdef public object initstring
def __cinit__(self, a, f):
self.initstring = '+a=%s +f=%s' % (a, f)
GeodesicInit(&self._Geodesic, <double> a, <double> f)
geod_init(&self._geod_geodesic, <double> a, <double> f)
def __reduce__(self):
"""special method that allows pyproj.Geod instance to be pickled"""
......@@ -401,13 +415,13 @@ cdef class Geod:
lat1 = _dg2rad*latsdata[i]
az1 = _dg2rad*azdata[i]
s12 = distdata[i]
Direct(&self._Geodesic, lat1, lon1, az1, s12,\
geod_direct(&self._geod_geodesic, lat1, lon1, az1, s12,\
&plat2, &plon2, &pazi2)
# back azimuth needs to be flipped 180 degrees
# to match what proj4 geod utility produces.
if pazi2 > 0:
pazi2 = pazi2-180.
elif pazi2 < 0:
elif pazi2 <= 0:
pazi2 = pazi2+180.
# check for NaN.
if pazi2 != pazi2:
......@@ -460,13 +474,13 @@ cdef class Geod:
lat1 = latsdata[i]
lon2 = azdata[i]
lat2 = distdata[i]
Inverse(&self._Geodesic, lat1, lon1, lat2, lon2,
geod_inverse(&self._geod_geodesic, lat1, lon1, lat2, lon2,
&ps12, &pazi1, &pazi2)
# back azimuth needs to be flipped 180 degrees
# to match what proj4 geod utility produces.
if pazi2 > 0:
pazi2 = pazi2-180.
elif pazi2 < 0:
elif pazi2 <= 0:
pazi2 = pazi2+180.
if ps12 != ps12: # check for NaN
raise ValueError('undefined inverse geodesic (may be an antipodal point)')
......@@ -489,7 +503,7 @@ cdef class Geod:
lon2 = _rad2dg*lon2
lat2 = _rad2dg*lat2
# do inverse computation to set azimuths, distance.
Inverse(&self._Geodesic, lat1, lon1, lat2, lon2,
geod_inverse(&self._geod_geodesic, lat1, lon1, lat2, lon2,
&ps12, &pazi1, &pazi2)
# distance increment.
del_s = ps12/(npts+1)
......@@ -499,7 +513,7 @@ cdef class Geod:
# loop over intermediate points, compute lat/lons.
for i from 1 <= i < npts+1:
s12 = i*del_s
Direct(&self._Geodesic, lat1, lon1, pazi1, s12,\
geod_direct(&self._geod_geodesic, lat1, lon1, pazi1, s12,\
&plat2, &plon2, &pazi2)
if radians:
lats = lats + (_dg2rad*plat2,)
......
......@@ -2,20 +2,20 @@
#include "geod_interface.h"
void geod_ini(void) {
GeodesicInit(&GlobalGeodesic, geod_a, geod_f);
geod_init(&GlobalGeodesic, geod_a, geod_f);
}
void geod_pre(void) {
double
degree = PI/180,
lat1 = phi1 / degree, lon1 = lam1 /degree, azi1 = al12 / degree;
GeodesicLineInit(&GlobalGeodesicLine, &GlobalGeodesic,
geod_lineinit(&GlobalGeodesicLine, &GlobalGeodesic,
lat1, lon1, azi1, 0U);
}
void geod_for(void) {
double degree = PI/180, s12 = geod_S, lat2, lon2, azi2;
Position(&GlobalGeodesicLine, s12, &lat2, &lon2, &azi2);
geod_position(&GlobalGeodesicLine, s12, &lat2, &lon2, &azi2);
azi2 += azi2 >= 0 ? -180 : 180; /* Compute back azimuth */
phi2 = lat2 * degree;
lam2 = lon2 * degree;
......@@ -28,7 +28,7 @@ void geod_inv(void) {
lat1 = phi1 / degree, lon1 = lam1 / degree,
lat2 = phi2 / degree, lon2 = lam2 / degree,
azi1, azi2, s12;
Inverse(&GlobalGeodesic, lat1, lon1, lat2, lon2, &s12, &azi1, &azi2);
geod_inverse(&GlobalGeodesic, lat1, lon1, lat2, lon2, &s12, &azi1, &azi2);
azi2 += azi2 >= 0 ? -180 : 180; /* Compute back azimuth */
al12 = azi1 * degree; al21 = azi2 * degree; geod_S = s12;
}
......@@ -27,8 +27,8 @@ GEOD_EXTERN struct geodesic {
# define al21 GEODESIC.ALPHA21
# define geod_S GEODESIC.DIST
GEOD_EXTERN struct Geodesic GlobalGeodesic;
GEOD_EXTERN struct GeodesicLine GlobalGeodesicLine;
GEOD_EXTERN struct geod_geodesic GlobalGeodesic;
GEOD_EXTERN struct geod_geodesicline GlobalGeodesicLine;
GEOD_EXTERN int n_alpha, n_S;
GEOD_EXTERN double to_meter, fr_meter, del_alpha;
......
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment