This is what I'm doing to scale. Getting the scroll_* parameters right afterward just requires some geometry work.
func scale(amt:float):
tile_map.scale *= amt
# Set the panel size to the used area of the map.
panel.rect_min_size = (tile_map.get_used_rect().end + Vector2.ONE) * TILE_SIZE * tile_map.scale
scroll_horizontal *= amt
scroll_vertical *= amt