def get_coords(self, zoom, x, y): bounds = calculate_bounds(zoom, x, y) az1, dec1, az2, dec2 = bounds mid_az = (az2 - az1) / 2.0 + az1 mid_dec = (dec1 - dec2) / 2.0 + dec2 assert get_tile_coords((mid_az, mid_dec), zoom) == (x, y), get_tile_coords((mid_az, mid_dec), zoom) radec = self.projector.unproject(AzAlt(mid_az, mid_dec)) #assert self.projector.project(radec) == AzAlt(mid_az, mid_dec), (self.projector.project(radec), AzAlt(mid_az, mid_dec)) cx, cy = get_tile_coords(radec, zoom) return cx, cy, az1, az2, bounds, radec
def compose_tiles(projected_sky_objects): start = time() tiles = {} for (p, r, mag, id) in projected_sky_objects: for zoom in range(3, 10): if mag < 4 + zoom: x, y = get_tile_coords((p, r), zoom) key = "%d-%d-%d" % (zoom, x, y) if key not in tiles: tiles[key] = [] tiles[key].append((p, r, mag, id)) print "completed tiling %d after %.1f seconds" % (len(tiles), time() - start) averages = {} for k in tiles: z = k.split("-")[0] if z not in averages: averages[z] = (0, 0) sum, count = averages[z] sum = sum + len(tiles[k]) count = count + 1 averages[z] = (sum, count) stats = {} stats["total tiles"] = len(tiles) for z in sorted(averages.keys()): stats["zoom %d" % zoom] = "%d tiles %.1f avg objects/tile" % (count, sum/float(count)) return stats, tiles
def build_tile(params): hparts, vparts, zoom, x, y = params hparts_size = 24.0 / hparts vparts_size = 180.0 / vparts v1 = azalt_to_vector(0, 0) v2 = azalt_to_vector(hparts_size, vparts_size) min_distance = vector3_distance(v1, v2) hour = ((x * hparts_size + hparts_size / 2.0) + 12) % 24 deg = 90 - y * vparts_size - vparts_size / 2.0 mid_v = azalt_to_vector(hour, deg) tile_coords = get_tile_coords((hour, deg), zoom) assert tile_coords == (x, y + vparts / 2), (tile_coords, (x, y + vparts / 2)) tile_id = "%s-%s-%s" % (zoom, x, y + vparts / 2) tile_objects = [] for star in get_stars(): object_v = azalt_to_vector(star.ra, star.dec) if vector3_distance(mid_v, object_v) <= min_distance: obj = (star.id, star.ra, star.dec, star.mag) # Some stars that are part of our constellations do not have # B/F designation. Need to make sure they're shown at all zoom levels if star.id in EXEMPTIONS and zoom >= EXEMPTIONS[star.id]: tile_objects.append(obj) continue # Always show stars if they have a proper name or part of a constellation # excluding Gliese designation if star.bayer_flamsteed or star.proper_name: tile_objects.append(obj) continue # All stars visible by zoom 7 if zoom >= 7: tile_objects.append(obj) continue if star.mag <= 6 + (zoom - 5): tile_objects.append(obj) tile_objects.sort(key=lambda o: o[3], reverse=True) print "Tile: %s Objects: %d" % (tile_id, len(tile_objects)) zpath = os.path.join("../indexes", str(zoom)) try: os.mkdir(zpath) except: pass f = open(os.path.join(zpath, "%s.dat"%tile_id), "wb") try: pickle.dump(tile_objects, f) finally: f.close()
def get_star(self, az, alt): radec = self.projector.unproject(AzAlt(az, alt)) zoom = 6 cx, cy = get_tile_coords(radec, zoom) objects = load_tile(zoom, cx, cy, cache=self.cache) nearest = None nearest_d = None for id, ra, dec, mag in objects: object_azalt = self.projector.project(RaDec(ra, dec)) distance = threed_distance(AzAlt(az, alt), object_azalt) if (not nearest) or (nearest_d > distance): nearest = (id, object_azalt) nearest_d = distance return nearest
def build_tile(params): hparts, vparts, zoom, x, y = params hparts_size = 24.0 / hparts vparts_size = 180.0 / vparts v1 = azalt_to_vector(0, 0) v2 = azalt_to_vector(hparts_size, vparts_size) min_distance = vector3_distance(v1, v2) hour = ((x * hparts_size + hparts_size / 2.0) + 12) % 24 deg = 90 - y * vparts_size - vparts_size / 2.0 mid_v = azalt_to_vector(hour, deg) tile_coords = get_tile_coords((hour, deg), zoom) assert tile_coords == (x, y + vparts / 2), (tile_coords, (x, y + vparts / 2)) tile_id = "%s-%s-%s" % (zoom, x, y + vparts / 2) tile_objects = [] print "Building", tile_id for radec1, radec2 in get_all_lines(): p0 = azalt_to_vector(*radec1) p1 = azalt_to_vector(*radec2) segment = (p0, p1) if point_to_segment_distance(mid_v, segment) <= min_distance: tile_objects.append((radec1, radec2)) print "Tile: %s Objects: %d" % (tile_id, len(tile_objects)) zpath = os.path.join("../line-indexes", str(zoom)) try: os.mkdir(zpath) except: pass f = open(os.path.join(zpath, "%s.dat"%tile_id), "wb") try: pickle.dump(tile_objects, f) finally: f.close()