예제 #1
0
    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
예제 #2
0
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()
예제 #4
0
    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()