<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def tile_from_xy(self, x, y, zoom, on_edge_use="rb"):
 """ Return tile covering a point defined by x and y values. - x: x coordinate - y: y coordinate - zoom: zoom level - on_edge_use: determine which Tile to pick if Point hits a grid edge - rb: right bottom (default) - rt: right top - lt: left top - lb: left bottom """

        validate_zoom(zoom)
        if x < self.left or x > self.right or y < self.bottom or y > self.top:
            raise ValueError("x or y are outside of grid bounds")
        if on_edge_use not in ["lb", "rb", "rt", "lt"]:
            raise ValueError("on_edge_use must be one of lb, rb, rt or lt")
        return _tile_from_xy(self, x, y, zoom, on_edge_use=on_edge_use)