def query(self, x, k=1, eps=0, p=2, distance_upper_bound=inf): """ See scipy.spatial.KDTree.query Parameters ---------- x : array-like, last dimension self.m query points are lng/lat. p: ignored, kept to maintain compatibility with scipy.spatial.KDTree Examples -------- >>> pts = [(0,90), (0,0), (180,0), (0,-90)] >>> kd = Arc_KDTree(pts, radius = sphere.RADIUS_EARTH_KM) >>> d,i = kd.query((90,0), k=4) >>> d array([ 10007.54339801, 10007.54339801, 10007.54339801, 10007.54339801]) >>> circumference = 2*math.pi*sphere.RADIUS_EARTH_KM >>> round(d[0],5) == round(circumference/4.0,5) True >>> d,i = kd.query(kd.data, k=3) >>> d2,i2 = kd.query(pts, k=3) >>> (d == d2).all() True >>> (i == i2).all() True """ eps = sphere.arcdist2linear(eps, self.radius) if distance_upper_bound != inf: distance_upper_bound = sphere.arcdist2linear( distance_upper_bound, self.radius) d, i = temp_KDTree.query(self, self._toXYZ(x), k, eps=eps, distance_upper_bound=distance_upper_bound) if isinstance(d, float): dims = 0 else: dims = len(d.shape) r = self.radius if dims == 0: return sphere.linear2arcdist(d, r), i if dims == 1: #TODO: implement linear2arcdist on numpy arrays d1 = [sphere.linear2arcdist(dx, r) for dx in d] elif dims == 2: d1 = [[sphere.linear2arcdist(dx, r) for dx in row] for row in d] d = numpy.array(d1) dinf = d == numpy.inf if dinf.sum() > 0: i = i.astype(float) i[dinf] = numpy.nan return d, i
def sparse_distance_matrix(self, other, max_distance, p=2): """ See scipy.spatial.KDTree.sparse_distance_matrix Parameters ---------- p: ignored, kept to maintain compatibility with scipy.spatial.KDTree Examples -------- >>> pts = [(0,90), (0,0), (180,0), (0,-90)] >>> kd = Arc_KDTree(pts, radius = sphere.RADIUS_EARTH_KM) >>> kd.sparse_distance_matrix(kd, kd.circumference/4.).todense() matrix([[ 0. , 10007.54339801, 10007.54339801, 0. ], [ 10007.54339801, 0. , 0. , 10007.54339801], [ 10007.54339801, 0. , 0. , 10007.54339801], [ 0. , 10007.54339801, 10007.54339801, 0. ]]) >>> kd.sparse_distance_matrix(kd, kd.circumference/2.).todense() matrix([[ 0. , 10007.54339801, 10007.54339801, 20015.08679602], [ 10007.54339801, 0. , 20015.08679602, 10007.54339801], [ 10007.54339801, 20015.08679602, 0. , 10007.54339801], [ 20015.08679602, 10007.54339801, 10007.54339801, 0. ]]) """ if self.radius != other.radius: raise ValueError("Both trees must have the same radius.") if max_distance > 0.5 * self.circumference: raise ValueError( "max_distance, must not exceed 1/2 circumference of the sphere (%f)." % self.circumference * 0.5) max_distance = sphere.arcdist2linear(max_distance, self.radius) + FLOAT_EPS * 3 D = scipy.spatial.KDTree.sparse_distance_matrix( self, other, max_distance) D = D.tocoo() #print D.data a2l = lambda x: sphere.linear2arcdist(x, self.radius) #print map(a2l,D.data) return scipy.sparse.coo_matrix((map(a2l, D.data), (D.row, D.col))).todok()
def sparse_distance_matrix(self, other, max_distance, p=2): """ See scipy.spatial.KDTree.sparse_distance_matrix Parameters ---------- p: ignored, kept to maintain compatibility with scipy.spatial.KDTree Examples -------- >>> pts = [(0,90), (0,0), (180,0), (0,-90)] >>> kd = Arc_KDTree(pts, radius = sphere.RADIUS_EARTH_KM) >>> kd.sparse_distance_matrix(kd, kd.circumference/4.).todense() matrix([[ 0. , 10007.54339801, 10007.54339801, 0. ], [ 10007.54339801, 0. , 0. , 10007.54339801], [ 10007.54339801, 0. , 0. , 10007.54339801], [ 0. , 10007.54339801, 10007.54339801, 0. ]]) >>> kd.sparse_distance_matrix(kd, kd.circumference/2.).todense() matrix([[ 0. , 10007.54339801, 10007.54339801, 20015.08679602], [ 10007.54339801, 0. , 20015.08679602, 10007.54339801], [ 10007.54339801, 20015.08679602, 0. , 10007.54339801], [ 20015.08679602, 10007.54339801, 10007.54339801, 0. ]]) """ if self.radius != other.radius: raise ValueError("Both trees must have the same radius.") if max_distance > 0.5 * self.circumference: raise ValueError("max_distance, must not exceed 1/2 circumference of the sphere (%f)." % self.circumference * 0.5) max_distance = sphere.arcdist2linear( max_distance, self.radius) + FLOAT_EPS * 3 D = scipy.spatial.KDTree.sparse_distance_matrix( self, other, max_distance) D = D.tocoo() #print D.data a2l = lambda x: sphere.linear2arcdist(x, self.radius) #print map(a2l,D.data) return scipy.sparse.coo_matrix((map(a2l, D.data), (D.row, D.col))).todok()