basemap icon indicating copy to clipboard operation
basemap copied to clipboard

ortho projection w/ limits crashes

Open mankoff opened this issue 9 years ago • 7 comments

Basemap documentation states that ortho projection can take ll/ur crnr limits. The following code seems like it should work (mpl 1.4.0), but does not:

from mpl_toolkits.basemap import Basemap
m = Basemap(projection='ortho',lon_0=0,lat_0=0,llcrnrlat=-10,llcrnrlon=-10,urcrnrlat=10,urcrnrlon=10)

Error:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-5-98fbf042abb9> in <module>()
----> 1 m = Basemap(projection='ortho',lon_0=0,lat_0=0,llcrnrlat=-10,llcrnrlon=-10,urcrnrlat=10,urcrnrlon=10)

/Users/mankoff/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/mpl_toolkits/basemap/__init__.pyc in __init__(self, llcrnrlon, llcrnrlat, urcrnrlon, urcrnrlat, llcrnrx, llcrnry, urcrnrx, urcrnry, width, height, projection, resolution, area_thresh, rsphere, ellps, lat_ts, lat_1, lat_2, lat_0, lon_0, lon_1, lon_2, o_lon_p, o_lat_p, k_0, no_rot, suppress_ticks, satellite_height, boundinglat, fix_aspect, anchor, celestial, round, epsg, ax)
   1032         self.area_thresh = area_thresh
   1033         # define map boundary polygon (in lat/lon coordinates)
-> 1034         blons, blats, self._boundarypolyll, self._boundarypolyxy = self._getmapboundary()
   1035         self.boundarylats = blats
   1036         self.boundarylons = blons

/Users/mankoff/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/mpl_toolkits/basemap/__init__.pyc in _getmapboundary(self)
   1464             # circular region.
   1465             thetas = np.linspace(0.,2.*np.pi,2*nx*ny)[:-1]
-> 1466             rminor = self._height
   1467             rmajor = self._width
   1468             x = rmajor*np.cos(thetas) + rmajor

AttributeError: 'Basemap' object has no attribute '_height'
> /Users/mankoff/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/mpl_toolkits/basemap/__init__.py(1466)_getmapboundary()
   1465             thetas = np.linspace(0.,2.*np.pi,2*nx*ny)[:-1]
-> 1466             rminor = self._height
   1467             rmajor = self._width

ipdb>

mankoff avatar Sep 10 '14 13:09 mankoff

you can use lcrnrx,llcrnry,urcrnrx,urcrnry (corners in map projection coords) but not lat/lon.

jswhit avatar Sep 10 '14 18:09 jswhit

Ok. Then perhaps consider this a documentation bug. The current docs here: http://matplotlib.org/basemap/api/basemap_api.html state,

For ortho... the lat/lon values of the corners may be specified, or the x/y values of the corners...

mankoff avatar Sep 10 '14 18:09 mankoff

Not sure to understand because indeed without lat_0 and lon_0

from mpl_toolkits.basemap import Basemap
m = Basemap(projection='ortho',llcrnrlat=-10,llcrnrlon=-10,urcrnrlat=10,urcrnrlon=10)

it gives

 ValueError: must specify lat_0 and lon_0 for Orthographic basemap

PBrockmann avatar Jan 07 '15 23:01 PBrockmann

@PBrockmann I'm not sure what your comment has to do with this bug. With lat_0 and lon_0 specified, it says that corners may be specified in lon/lat coordinates, but that is not correct, they must be in x,y coords. We aren't discussing the presence/absence of the lat_0,lon_0 arguments.

mankoff avatar Jan 08 '15 02:01 mankoff

The "but not lat/lon" from jswhit push me to try without lat_0 and lon_0. Sorry for the missunderstanding and thank you for the clarification.

PBrockmann avatar Jan 08 '15 11:01 PBrockmann

I would like to clean up any documentation bugs soon. Could someone please suggest a revised line? Even better, could someone put together a PR with the documentation correction?

Also, ideally, I would want to produce a better error message in this case, so a suggested error message would be useful, too.

full discloser, I don't work in ortho projections, so I have no clue what is/isn't allowed.

WeatherGod avatar May 05 '16 19:05 WeatherGod

Can someone please comment on how to obtain lcrnrx,llcrnry,urcrnrx,urcrnry given that I have llcrnrlat=-10,llcrnrlon=-10,urcrnrlat=10,urcrnrlon=10? Usually you may get x,y as x,y = m(lon,lat); however, if you need to know these already when instantiating the Basemap, you cannot use the Basemap to calculate the values to input in its initialisation method.

ImportanceOfBeingErnest avatar Nov 13 '17 19:11 ImportanceOfBeingErnest