def _create_resample_kdtree(source_lons, source_lats, valid_input_index, nprocs=1): """Set up kd tree on input.""" source_lons_valid = source_lons[valid_input_index] source_lats_valid = source_lats[valid_input_index] if nprocs > 1: cartesian = _spatial_mp.Cartesian_MP(nprocs) else: cartesian = _spatial_mp.Cartesian() input_coords = cartesian.transform_lonlats(source_lons_valid, source_lats_valid) if input_coords.size == 0: raise EmptyResult('No valid data points in input data') # Build kd-tree on input if nprocs > 1: resample_kdtree = _spatial_mp.cKDTree_MP(input_coords, nprocs=nprocs) else: resample_kdtree = KDTree(input_coords) return resample_kdtree
def _query_resample_kdtree(resample_kdtree, source_geo_def, target_geo_def, radius_of_influence, data_slice, neighbours=8, epsilon=0, reduce_data=True, nprocs=1): """Query kd-tree on slice of target coordinates.""" # Check validity of input if not isinstance(target_geo_def, geometry.BaseDefinition): raise TypeError('target_geo_def must be of geometry type') elif not isinstance(radius_of_influence, (long, int, float)): raise TypeError('radius_of_influence must be number') elif not isinstance(neighbours, int): raise TypeError('neighbours must be integer') elif not isinstance(epsilon, (long, int, float)): raise TypeError('epsilon must be number') # Get sliced target coordinates target_lons, target_lats = target_geo_def.get_lonlats(nprocs=nprocs, data_slice=data_slice, dtype=source_geo_def.dtype) # Find indiced of reduced target coordinates valid_output_index = _get_valid_output_index(source_geo_def, target_geo_def, target_lons.ravel(), target_lats.ravel(), reduce_data, radius_of_influence) # Get cartesian target coordinates and select reduced set if nprocs > 1: cartesian = _spatial_mp.Cartesian_MP(nprocs) else: cartesian = _spatial_mp.Cartesian() target_lons_valid = target_lons.ravel()[valid_output_index] target_lats_valid = target_lats.ravel()[valid_output_index] output_coords = cartesian.transform_lonlats(target_lons_valid, target_lats_valid) # pykdtree requires query points have same data type as kdtree. try: dt = resample_kdtree.data.dtype except AttributeError: # use a sensible default dt = np.dtype('d') output_coords = np.asarray(output_coords, dtype=dt) # Query kd-tree distance_array, index_array = resample_kdtree.query(output_coords, k=neighbours, eps=epsilon, distance_upper_bound=radius_of_influence) return valid_output_index, index_array, distance_array
def test_cartesian(self): """Test the transform_lonlats of class Cartesian.""" my_cartesian = sp.Cartesian() coords_int = my_cartesian.transform_lonlats(self.lon, self.lat) coords_float = my_cartesian.transform_lonlats(self.lon64, self.lat64) coords_float32 = my_cartesian.transform_lonlats(self.lon32, self.lat32) np.testing.assert_almost_equal(coords_float, self.exp_coords, decimal=3) np.testing.assert_almost_equal(coords_int, coords_float, decimal=0) self.assertIs(type(coords_float32[0, 0]), np.float32) self.assertIs(type(coords_float[0, 0]), np.float64) self.assertTrue(np.issubdtype(coords_int.dtype, np.floating))
def get_cartesian_coords(self, nprocs=None, data_slice=None, cache=False): """Retrieve cartesian coordinates of geometry definition Parameters ---------- nprocs : int, optional Number of processor cores to be used. Defaults to the nprocs set when instantiating object data_slice : slice object, optional Calculate only cartesian coordnates for the defined slice cache : bool, optional Store result the result. Requires data_slice to be None Returns ------- cartesian_coords : numpy array """ if self.cartesian_coords is None: # Coordinates are not cached if nprocs is None: nprocs = self.nprocs if data_slice is None: # Use full slice data_slice = slice(None) lons, lats = self.get_lonlats(nprocs=nprocs, data_slice=data_slice) if nprocs > 1: cartesian = _spatial_mp.Cartesian_MP(nprocs) else: cartesian = _spatial_mp.Cartesian() cartesian_coords = cartesian.transform_lonlats(np.ravel(lons), np.ravel(lats)) if isinstance(lons, np.ndarray) and lons.ndim > 1: # Reshape to correct shape cartesian_coords = cartesian_coords.reshape(lons.shape[0], lons.shape[1], 3) if cache and data_slice is None: self.cartesian_coords = cartesian_coords else: # Coordinates are cached if data_slice is None: cartesian_coords = self.cartesian_coords else: cartesian_coords = self.cartesian_coords[data_slice] return cartesian_coords
def _create_resample_kdtree(source_lons, source_lats, valid_input_index, nprocs=1): """Set up kd tree on input""" """ if not isinstance(source_geo_def, geometry.BaseDefinition): raise TypeError('source_geo_def must be of geometry type') #Get reduced cartesian coordinates and flatten them source_cartesian_coords = source_geo_def.get_cartesian_coords(nprocs=nprocs) input_coords = geometry._flatten_cartesian_coords(source_cartesian_coords) input_coords = input_coords[valid_input_index] """ source_lons_valid = source_lons[valid_input_index] source_lats_valid = source_lats[valid_input_index] if nprocs > 1: cartesian = _spatial_mp.Cartesian_MP(nprocs) else: cartesian = _spatial_mp.Cartesian() input_coords = cartesian.transform_lonlats(source_lons_valid, source_lats_valid) if input_coords.size == 0: raise EmptyResult('No valid data points in input data') # Build kd-tree on input if kd_tree_name == 'pykdtree': resample_kdtree = KDTree(input_coords) elif nprocs > 1: resample_kdtree = _spatial_mp.cKDTree_MP(input_coords, nprocs=nprocs) else: resample_kdtree = sp.cKDTree(input_coords) return resample_kdtree