Skip to content
Commits on Source (6)
[bumpversion]
current_version = 1.8.2
current_version = 1.8.3
commit = True
tag = True
......
linters:
flake8:
fixer: true
fixers:
enable: true
......@@ -64,7 +64,7 @@ install:
# target Python version and architecture
- "conda update --yes conda"
- "conda config --add channels conda-forge"
- "conda create -q --yes -n test python=%PYTHON_VERSION% basemap-data-hires sphinx pyproj scipy pykdtree"
- "conda create -q --yes -n test python=%PYTHON_VERSION% basemap-data-hires sphinx pyproj scipy pykdtree dask xarray"
- "activate test"
- "pip install coveralls"
- "pip install mock"
......
......@@ -2,6 +2,37 @@ Changelog
=========
v1.8.3 (2018-03-19)
-------------------
- update changelog. [Martin Raspaud]
- Bump version: 1.8.2 → 1.8.3. [Martin Raspaud]
- Merge branch 'develop' into new_release. [Martin Raspaud]
- Merge pull request #107 from pytroll/bugfix-memory-leak. [Martin
Raspaud]
[WIP] Remove closures to allow memory to be freed
- Prevend dynamic areas to choke on NaNs. [Martin Raspaud]
- Make CHUNK_SIZE int if taken from environment. [Martin Raspaud]
- Reorganize indices assignments. [Martin Raspaud]
- Remove closures to allow memory to be freed. [Martin Raspaud]
- Merge pull request #106 from pytroll/bugfix-area-equality. [David
Hoese]
Fix area equality to support np.nan, xarray and dask
- Add dask and xarray to appveyor. [Martin Raspaud]
- Use numpy's allclose for swathdef equality. [Martin Raspaud]
- Require a newer numpy for nan equality. [Martin Raspaud]
- Style cleanup. [Martin Raspaud]
- Add tests for swath equality. [Martin Raspaud]
- Style cleanup. [Martin Raspaud]
- Fix area equality to support xarray and dask. [Martin Raspaud]
- Merge pull request #108 from pytroll/add-stickler-config. [Martin
Raspaud]
Adding .stickler.yml configuration file
- Adding .stickler.yml. [stickler-ci]
v1.8.2 (2018-03-01)
-------------------
- update changelog. [davidh-ssec]
......@@ -738,7 +769,6 @@ v1.2.2 (2016-06-21)
Without this, the compilation of the ewa extension crashes.
v1.2.1 (2016-06-21)
-------------------
- update changelog. [Martin Raspaud]
......@@ -894,11 +924,9 @@ v1.2.0 (2016-06-17)
- Make kd_tree test work on older numpy version. [Martin Raspaud]
VisibleDeprecationWarning is not available in numpy <1.9.
- Adapt to newest pykdtree version. [Martin Raspaud]
The kdtree object's attribute `data_pts` has been renamed to `data`.
- Run tests on python 3.5 in travis also. [Martin Raspaud]
......@@ -910,7 +938,6 @@ v1.1.6 (2016-02-25)
A previous commit was looking for a 'data_pts' attribute in the kdtree
object, which is available in pykdtree, but not scipy.
- Merge pull request #32 from mitkin/master. [Martin Raspaud]
[tests] Skip deprecation warnings in test_gauss_multi_uncert
......@@ -922,7 +949,6 @@ v1.1.6 (2016-02-25)
The latest matplotlib (1.5) doesn't support python 2.6 and 3.3. This patch
chooses the right matplotlib version to install depending on the python
version at hand.
- Skip deprecation warnings. [Mikhail Itkin]
Catch the rest of the warnings. Check if there is only one, and
......@@ -964,7 +990,6 @@ Other
- Bugfix to address a numpy DeprecationWarning. [Martin Raspaud]
Numpy won't take non-integer indices soon, so make index an int.
- Merge branch 'release-1.1.3' [Martin Raspaud]
- Merge branch 'licence-lgpl' into pre-master. [Martin Raspaud]
- Switch to lgplv3, and bump up version number. [Martin Raspaud]
......@@ -1186,7 +1211,7 @@ Other
- Set svn:mime-type. [StorPipfugl]
- Corrected doc errors. [StorPipfugl]
- Removed dist dir. [StorPipfugl]
- [StorPipfugl]
- No commit message. [StorPipfugl]
- Updated documentation. New release. [StorPipfugl]
- Started updating docstrings. [StorPipfugl]
- Restructured API. [StorPipfugl]
......@@ -1199,8 +1224,9 @@ Other
- Removed unneeded function. [StorPipfugl]
- Mime types set. [StorPipfugl]
- Mime types set. [StorPipfugl]
- [StorPipfugl]
- No commit message. [StorPipfugl]
- Moved to Google Code under GPLv3 license. [StorPipfugl]
- moved to Google Code. [StorPipfugl]
pyresample (1.8.3-1) unstable; urgency=medium
* New upstream release
* debian/patches
- refresh all patches
* debian/control
- update Vcs-* fields to point to salsa
-- Antonio Valentino <antonio.valentino@tiscali.it> Fri, 23 Mar 2018 07:28:30 +0000
pyresample (1.8.2-1) unstable; urgency=medium
* New upstream release
......
......@@ -32,8 +32,8 @@ Build-Depends: debhelper (>= 11.0.0),
cython,
cython3
Standards-Version: 4.1.3
Vcs-Browser: https://anonscm.debian.org/cgit/pkg-grass/pyresample.git
Vcs-Git: https://anonscm.debian.org/git/pkg-grass/pyresample.git
Vcs-Browser: https://salsa.debian.org/debian-gis-team/pyresample
Vcs-Git: https://salsa.debian.org/debian-gis-team/pyresample.git
Homepage: https://github.com/pytroll/pyresample
Package: python-pyresample
......
......@@ -21,10 +21,10 @@ index 3c6ef3c..5346cb4 100644
YSIZE: 480
AREA_EXTENT: (-20037508.342789244, -10018754.171394622, 20037508.342789244, 10018754.171394622)
diff --git a/pyresample/test/test_geometry.py b/pyresample/test/test_geometry.py
index ae8990b..3befc7d 100644
index ef060d4..c35f304 100644
--- a/pyresample/test/test_geometry.py
+++ b/pyresample/test/test_geometry.py
@@ -406,7 +406,7 @@ class Test(unittest.TestCase):
@@ -389,7 +389,7 @@ class Test(unittest.TestCase):
swath_def = geometry.SwathDefinition(lons, lats)
filter_area = geometry.AreaDefinition('test', 'test', 'test',
{'proj': 'eqc', 'lon_0': 0.0,
......@@ -33,7 +33,7 @@ index ae8990b..3befc7d 100644
8, 8,
(-20037508.34, -10018754.17, 20037508.34, 10018754.17))
filter = np.array([[1, 1, 1, 1, 0, 0, 0, 0],
@@ -431,7 +431,7 @@ class Test(unittest.TestCase):
@@ -414,7 +414,7 @@ class Test(unittest.TestCase):
data = np.array([1, 2, 3, 4])
filter_area = geometry.AreaDefinition('test', 'test', 'test',
{'proj': 'eqc', 'lon_0': 0.0,
......@@ -42,7 +42,7 @@ index ae8990b..3befc7d 100644
8, 8,
(-20037508.34, -10018754.17, 20037508.34, 10018754.17))
filter = np.array([[1, 1, 1, 1, 0, 0, 0, 0],
@@ -466,7 +466,7 @@ class Test(unittest.TestCase):
@@ -449,7 +449,7 @@ class Test(unittest.TestCase):
data = np.dstack((data1, data2, data3))
filter_area = geometry.AreaDefinition('test', 'test', 'test',
{'proj': 'eqc', 'lon_0': 0.0,
......@@ -51,7 +51,7 @@ index ae8990b..3befc7d 100644
8, 8,
(-20037508.34, -10018754.17, 20037508.34, 10018754.17))
filter = np.array([[1, 1, 1, 1, 0, 0, 0, 0],
@@ -535,7 +535,7 @@ class Test(unittest.TestCase):
@@ -518,7 +518,7 @@ class Test(unittest.TestCase):
def test_latlong_area(self):
area_def = geometry.AreaDefinition('', '', '',
......
......@@ -17,23 +17,22 @@
import os
CHUNK_SIZE = os.getenv('PYTROLL_CHUNK_SIZE', 4096)
CHUNK_SIZE = int(os.getenv('PYTROLL_CHUNK_SIZE', 4096))
from pyresample.version import __version__
# Backwards compatibility
from pyresample import geometry
from pyresample import grid
from pyresample import image
from pyresample import kd_tree
from pyresample import utils
from pyresample import plot
from pyresample import geometry # noqa
from pyresample import grid # noqa
from pyresample import image # noqa
from pyresample import kd_tree # noqa
from pyresample import utils # noqa
from pyresample import plot # noqa
# Easy access
from pyresample.geometry import (SwathDefinition,
AreaDefinition,
DynamicAreaDefinition)
from pyresample.utils import load_area
from pyresample.kd_tree import XArrayResamplerNN
from pyresample.plot import save_quicklook, area_def2basemap
from pyresample.geometry import (SwathDefinition, # noqa
AreaDefinition, # noqa
DynamicAreaDefinition) # noqa
from pyresample.utils import load_area # noqa
from pyresample.kd_tree import XArrayResamplerNN # noqa
from pyresample.plot import save_quicklook, area_def2basemap # noqa
__all__ = ['grid', 'image', 'kd_tree',
'utils', 'plot', 'geo_filter', 'geometry', 'CHUNK_SIZE']
......@@ -43,13 +42,13 @@ def get_capabilities():
cap = {}
try:
from pykdtree.kdtree import KDTree
from pykdtree.kdtree import KDTree # noqa
cap['pykdtree'] = True
except ImportError:
cap['pykdtree'] = False
try:
import numexpr
import numexpr # noqa
cap['numexpr'] = True
except ImportError:
cap['numexpr'] = False
......
......@@ -93,7 +93,8 @@ class BaseDefinition(object):
def __eq__(self, other):
"""Test for approximate equality"""
if self is other:
return True
if other.lons is None or other.lats is None:
other_lons, other_lats = other.get_lonlats()
else:
......@@ -106,11 +107,21 @@ class BaseDefinition(object):
self_lons = self.lons
self_lats = self.lats
if self_lons is other_lons and self_lats is other_lats:
return True
if isinstance(self_lons, DataArray) and np.ndarray is not DataArray:
self_lons = self_lons.data
self_lats = self_lats.data
if isinstance(other_lons, DataArray) and np.ndarray is not DataArray:
other_lons = other_lons.data
other_lats = other_lats.data
try:
return (np.allclose(self_lons, other_lons, atol=1e-6,
rtol=5e-9) and
np.allclose(self_lats, other_lats, atol=1e-6,
rtol=5e-9))
from dask.array import allclose
except ImportError:
from numpy import allclose
try:
return (allclose(self_lons, other_lons, atol=1e-6, rtol=5e-9, equal_nan=True) and
allclose(self_lats, other_lats, atol=1e-6, rtol=5e-9, equal_nan=True))
except (AttributeError, ValueError):
return False
......@@ -679,7 +690,10 @@ class DynamicAreaDefinition(object):
except (TypeError, ValueError):
lons, lats = lonslats.get_lonlats()
xarr, yarr = proj4(np.asarray(lons), np.asarray(lats))
corners = [np.min(xarr), np.min(yarr), np.max(xarr), np.max(yarr)]
xarr[xarr > 9e29] = np.nan
yarr[yarr > 9e29] = np.nan
corners = [np.nanmin(xarr), np.nanmin(yarr),
np.nanmax(xarr), np.nanmax(yarr)]
domain = self.compute_domain(corners, resolution, size)
self.area_extent, self.x_size, self.y_size = domain
......@@ -689,6 +703,13 @@ class DynamicAreaDefinition(object):
self.area_extent, self.rotation)
def invproj(data_x, data_y, proj_dict):
"""Perform inverse projection."""
# XXX: does pyproj copy arrays? What can we do so it doesn't?
target_proj = Proj(**proj_dict)
return np.dstack(target_proj(data_x, data_y, inverse=True))
class AreaDefinition(BaseDefinition):
"""Holds definition of an area.
......@@ -1229,15 +1250,9 @@ class AreaDefinition(BaseDefinition):
dtype = dtype or self.dtype
target_x, target_y = self.get_proj_coords_dask(chunks, dtype)
target_proj = Proj(**self.proj_dict)
def invproj(data1, data2):
# XXX: does pyproj copy arrays? What can we do so it doesn't?
return np.dstack(target_proj(data1, data2, inverse=True))
res = map_blocks(invproj, target_x, target_y,
chunks=(target_x.chunks[0], target_x.chunks[1], 2),
new_axis=[2])
new_axis=[2], proj_dict=self.proj_dict)
return res[:, :, 0], res[:, :, 1]
......
......@@ -38,9 +38,7 @@ except ImportError:
DataArray = None
da = None
if sys.version < '3':
range = xrange
else:
if sys.version >= '3':
long = int
kd_tree_name = None
......@@ -177,7 +175,7 @@ def resample_gauss(source_geo_def, data, target_geo_def,
sigmas.__iter__()
sigma_list = sigmas
is_multi_channel = True
except:
except: # noqa: E722
sigma_list = [sigmas]
for sigma in sigma_list:
......@@ -250,7 +248,7 @@ def resample_custom(source_geo_def, data, target_geo_def,
for weight_func in weight_funcs:
if not isinstance(weight_func, types.FunctionType):
raise TypeError('weight_func must be function object')
except:
except: # noqa: E722
if not isinstance(weight_funcs, types.FunctionType):
raise TypeError('weight_func must be function object')
......@@ -685,7 +683,7 @@ def get_sample_from_neighbour_info(resample_type, output_shape, data,
'valid_input_index and data')
valid_types = ('nn', 'custom')
if not resample_type in valid_types:
if resample_type not in valid_types:
raise TypeError('Invalid resampling type: %s' % resample_type)
if resample_type == 'custom' and weight_funcs is None:
......@@ -905,7 +903,45 @@ def get_sample_from_neighbour_info(resample_type, output_shape, data,
return result
class XArrayResamplerNN(object):
def lonlat2xyz(lons, lats):
R = 6370997.0
x_coords = R * da.cos(da.deg2rad(lats)) * da.cos(da.deg2rad(lons))
y_coords = R * da.cos(da.deg2rad(lats)) * da.sin(da.deg2rad(lons))
z_coords = R * da.sin(da.deg2rad(lats))
return da.stack(
(x_coords.ravel(), y_coords.ravel(), z_coords.ravel()), axis=-1)
def query_no_distance(target_lons, target_lats,
valid_output_index, kdtree, neighbours, epsilon, radius):
"""Query the kdtree. No distances are returned."""
voi = valid_output_index
shape = voi.shape
voir = voi.ravel()
target_lons_valid = target_lons.ravel()[voir]
target_lats_valid = target_lats.ravel()[voir]
coords = lonlat2xyz(target_lons_valid, target_lats_valid)
distance_array, index_array = kdtree.query(
coords.compute(),
k=neighbours,
eps=epsilon,
distance_upper_bound=radius)
# KDTree query returns out-of-bounds neighbors as `len(arr)`
# which is an invalid index, we mask those out so -1 represents
# invalid values
# voi is 2D, index_array is 1D
good_pixels = index_array < kdtree.n
voi[voi] = good_pixels
res_ia = np.full(shape, fill_value=-1, dtype=np.int)
res_ia[voi] = index_array[good_pixels]
return res_ia
class XArrayResamplerNN():
def __init__(self,
source_geo_def,
target_geo_def,
......@@ -954,15 +990,6 @@ class XArrayResamplerNN(object):
self.target_geo_def = target_geo_def
self.radius_of_influence = radius_of_influence
def transform_lonlats(self, lons, lats):
R = 6370997.0
x_coords = R * da.cos(da.deg2rad(lats)) * da.cos(da.deg2rad(lons))
y_coords = R * da.cos(da.deg2rad(lats)) * da.sin(da.deg2rad(lons))
z_coords = R * da.sin(da.deg2rad(lats))
return da.stack(
(x_coords.ravel(), y_coords.ravel(), z_coords.ravel()), axis=-1)
def _create_resample_kdtree(self):
"""Set up kd tree on input"""
source_lons, source_lats = self.source_geo_def.get_lonlats_dask()
......@@ -971,8 +998,7 @@ class XArrayResamplerNN(object):
# FIXME: Is dask smart enough to only compute the pixels we end up
# using even with this complicated indexing
input_coords = self.transform_lonlats(source_lons,
source_lats)
input_coords = lonlat2xyz(source_lons, source_lats)
input_coords = input_coords[valid_input_idx.ravel(), :]
# Build kd-tree on input
......@@ -988,38 +1014,16 @@ class XArrayResamplerNN(object):
def _query_resample_kdtree(self,
resample_kdtree,
target_lons,
target_lats,
valid_output_index,
tlons,
tlats,
valid_oi,
reduce_data=True):
"""Query kd-tree on slice of target coordinates."""
def query_no_distance(target_lons, target_lats, valid_output_index):
voi = valid_output_index
shape = voi.shape
voir = voi.ravel()
target_lons_valid = target_lons.ravel()[voir]
target_lats_valid = target_lats.ravel()[voir]
coords = self.transform_lonlats(target_lons_valid,
target_lats_valid)
distance_array, index_array = resample_kdtree.query(
coords.compute(),
k=self.neighbours,
eps=self.epsilon,
distance_upper_bound=self.radius_of_influence)
# KDTree query returns out-of-bounds neighbors as `len(arr)`
# which is an invalid index, we mask those out so -1 represents
# invalid values
# voi is 2D, index_array is 1D
good_pixels = index_array < resample_kdtree.n
voi[voi] = good_pixels
res_ia = np.full(shape, fill_value=-1, dtype=np.int)
res_ia[voi] = index_array[good_pixels]
return res_ia
res = da.map_blocks(query_no_distance, target_lons, target_lats,
valid_output_index, dtype=np.int)
res = da.map_blocks(query_no_distance, tlons, tlats,
valid_oi, dtype=np.int, kdtree=resample_kdtree,
neighbours=self.neighbours, epsilon=self.epsilon,
radius=self.radius_of_influence)
return res, None
def get_neighbour_info(self):
......@@ -1038,12 +1042,15 @@ class XArrayResamplerNN(object):
# Create kd-tree
valid_input_idx, resample_kdtree = self._create_resample_kdtree()
# This is a numpy array
self.valid_input_index = valid_input_idx
if resample_kdtree.n == 0:
# Handle if all input data is reduced away
valid_output_idx, index_arr, distance_arr = \
_create_empty_info(self.source_geo_def,
self.target_geo_def, self.neighbours)
self.valid_input_index = valid_input_idx
self.valid_output_index = valid_output_idx
self.index_array = index_arr
self.distance_array = distance_arr
......@@ -1056,9 +1063,7 @@ class XArrayResamplerNN(object):
index_arr, distance_arr = self._query_resample_kdtree(
resample_kdtree, target_lons, target_lats, valid_output_idx)
self.valid_output_index, self.index_array = \
da.compute(valid_output_idx, index_arr)
self.valid_input_index = valid_input_idx
self.valid_output_index, self.index_array = valid_output_idx, index_arr
self.distance_array = distance_arr
return (self.valid_input_index,
......
......@@ -52,20 +52,6 @@ class Test(unittest.TestCase):
1029087.28,
1490031.3600000001])
lons, lats = area_def.get_lonlats()
area_def2 = geometry.AreaDefinition('areaD', 'Europe (3km, HRV, VTC)', 'areaD',
{'a': '6378144.0',
'b': '6356759.0',
'lat_0': '50.00',
'lat_ts': '50.00',
'lon_0': '8.00',
'proj': 'stere'},
800,
800,
[-1370912.72,
-909968.64000000001,
1029087.28,
1490031.3600000001],
lons=lons, lats=lats)
lon, lat = area_def.get_lonlat(400, 400)
self.assertAlmostEqual(lon, 5.5028467120975835,
msg='lon retrieval from precomputated grid failed')
......@@ -111,7 +97,7 @@ class Test(unittest.TestCase):
# Test dtype is preserved with automatic longitude wrapping
lons2 = np.where(lons1 < 0, lons1 + 360, lons1)
with catch_warnings() as w:
with catch_warnings():
basedef = geometry.BaseDefinition(lons2, lats)
lons, _ = basedef.get_lonlats()
......@@ -120,7 +106,7 @@ class Test(unittest.TestCase):
(lons2.dtype, lons.dtype,))
lons2_ints = lons2.astype('int')
with catch_warnings() as w:
with catch_warnings():
basedef = geometry.BaseDefinition(lons2_ints, lats)
lons, _ = basedef.get_lonlats()
......@@ -212,7 +198,6 @@ class Test(unittest.TestCase):
self.assertEqual(geometry.get_array_hashable(xrarr),
xrarr.attrs['hash'])
def test_swath_hash(self):
lons = np.array([1.2, 1.3, 1.4, 1.5])
lats = np.array([65.9, 65.86, 65.82, 65.78])
......@@ -254,14 +239,12 @@ class Test(unittest.TestCase):
self.assertIsInstance(hash(swath_def), int)
lons = np.ma.array([1.2, 1.3, 1.4, 1.5])
lats = np.ma.array([65.9, 65.86, 65.82, 65.78])
swath_def = geometry.SwathDefinition(lons, lats)
self.assertIsInstance(hash(swath_def), int)
def test_area_equal(self):
area_def = geometry.AreaDefinition('areaD', 'Europe (3km, HRV, VTC)', 'areaD',
{'a': '6378144.0',
......@@ -784,9 +767,62 @@ class TestSwathDefinition(unittest.TestCase):
lats = np.array([65.9, 65.86, 65.82, 65.78])
swath_def = geometry.SwathDefinition(lons, lats)
swath_def2 = geometry.SwathDefinition(lons, lats)
# Identical lons and lats
self.assertFalse(
swath_def != swath_def2, 'swath_defs are not equal as expected')
# Identical objects
self.assertFalse(
swath_def != swath_def, 'swath_defs are not equal as expected')
lons = np.array([1.2, 1.3, 1.4, 1.5])
lats = np.array([65.9, 65.86, 65.82, 65.78])
lons2 = np.array([1.2, 1.3, 1.4, 1.5])
lats2 = np.array([65.9, 65.86, 65.82, 65.78])
swath_def = geometry.SwathDefinition(lons, lats)
swath_def2 = geometry.SwathDefinition(lons2, lats2)
# different arrays, same values
self.assertFalse(
swath_def != swath_def2, 'swath_defs are not equal as expected')
lons = np.array([1.2, 1.3, 1.4, np.nan])
lats = np.array([65.9, 65.86, 65.82, np.nan])
lons2 = np.array([1.2, 1.3, 1.4, np.nan])
lats2 = np.array([65.9, 65.86, 65.82, np.nan])
swath_def = geometry.SwathDefinition(lons, lats)
swath_def2 = geometry.SwathDefinition(lons2, lats2)
# different arrays, same values, with nans
self.assertFalse(
swath_def != swath_def2, 'swath_defs are not equal as expected')
try:
import dask.array as da
lons = da.from_array(np.array([1.2, 1.3, 1.4, np.nan]), chunks=2)
lats = da.from_array(np.array([65.9, 65.86, 65.82, np.nan]), chunks=2)
lons2 = da.from_array(np.array([1.2, 1.3, 1.4, np.nan]), chunks=2)
lats2 = da.from_array(np.array([65.9, 65.86, 65.82, np.nan]), chunks=2)
swath_def = geometry.SwathDefinition(lons, lats)
swath_def2 = geometry.SwathDefinition(lons2, lats2)
# different arrays, same values, with nans
self.assertFalse(
swath_def != swath_def2, 'swath_defs are not equal as expected')
except ImportError:
pass
try:
import xarray as xr
lons = xr.DataArray(np.array([1.2, 1.3, 1.4, np.nan]))
lats = xr.DataArray(np.array([65.9, 65.86, 65.82, np.nan]))
lons2 = xr.DataArray(np.array([1.2, 1.3, 1.4, np.nan]))
lats2 = xr.DataArray(np.array([65.9, 65.86, 65.82, np.nan]))
swath_def = geometry.SwathDefinition(lons, lats)
swath_def2 = geometry.SwathDefinition(lons2, lats2)
# different arrays, same values, with nans
self.assertFalse(
swath_def != swath_def2, 'swath_defs are not equal as expected')
except ImportError:
pass
def test_swath_not_equal(self):
"""Test swath inequality."""
lats1 = np.array([65.9, 65.86, 65.82, 65.78])
......@@ -1027,7 +1063,7 @@ class TestStackedAreaDefinition(unittest.TestCase):
area2.y_size = random.randrange(6425)
area2.x_size = x_size
res = concatenate_area_defs(area1, area2)
concatenate_area_defs(area1, area2)
area_extent = [1, 2, 3, 6]
y_size = area1.y_size + area2.y_size
adef.assert_called_once_with(area1.area_id, area1.name, area1.proj_id,
......
......@@ -15,4 +15,4 @@
# You should have received a copy of the GNU Lesser General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
__version__ = '1.8.2'
__version__ = '1.8.3'
......@@ -17,7 +17,7 @@
import imp
# workaround python bug: http://bugs.python.org/issue15881#msg170215
import multiprocessing
import multiprocessing # noqa: F401
import os
import sys
......@@ -26,7 +26,7 @@ from setuptools.command.build_ext import build_ext as _build_ext
version = imp.load_source('pyresample.version', 'pyresample/version.py')
requirements = ['setuptools>=3.2', 'pyproj>=1.9.5.1', 'numpy', 'configobj',
requirements = ['setuptools>=3.2', 'pyproj>=1.9.5.1', 'numpy>=1.10.0', 'configobj',
'pykdtree>=1.1.1', 'pyyaml', 'six']
extras_require = {'pykdtree': ['pykdtree>=1.1.1'],
'numexpr': ['numexpr'],
......@@ -48,7 +48,9 @@ else:
extensions = [
Extension("pyresample.ewa._ll2cr", sources=["pyresample/ewa/_ll2cr.pyx"],
extra_compile_args=extra_compile_args),
Extension("pyresample.ewa._fornav", sources=["pyresample/ewa/_fornav.pyx", "pyresample/ewa/_fornav_templates.cpp"], language="c++", extra_compile_args=extra_compile_args,
Extension("pyresample.ewa._fornav", sources=["pyresample/ewa/_fornav.pyx",
"pyresample/ewa/_fornav_templates.cpp"],
language="c++", extra_compile_args=extra_compile_args,
depends=["pyresample/ewa/_fornav_templates.h"])
]
......