-
Notifications
You must be signed in to change notification settings - Fork 32
Open
Description
We’re trying to replace our current tile generation method (client-side composition using a /cog
endpoint) with a server-side approach using the /searches
endpoint. However, this new method is up to five times slower in some tests. Is this because the same level of performance can’t be achieved with titiler-pgstac
for server-side tile composition on the same resources?
Here’s a snippet demonstrating the current approach. The issue is that it results in a high number of requests to the web server. We considered switching to /searches
as a potential improvement, but so far, we haven’t achieved comparable performance.
import requests
from io import BytesIO
from PIL import Image
from concurrent.futures import ThreadPoolExecutor
def stack_images(images):
width, height = images[0].size
new_image = Image.new("RGBA", (width, height))
for img in images:
new_image.paste(img, (0, 0), img)
return new_image
def get_urls(search_id, tile, aname="analytic"):
z, x, y = tile
assets_url = f"https://{titiler_url}/searches/{search_id}/tiles/WebMercatorQuad/{z}/{x}/{y}/assets"
urls = []
response = requests.get(assets_url)
for item in response.json():
urls.append(item["assets"][aname]["href"])
print(f"Number of assets: {len(urls)}")
return urls
def get_tile(url, tile):
z, x, y = tile
tile_url = f"https://{titiler_url}/cog/tiles/{z}/{x}/{y}?bidx=1&bidx=2&bidx=3&format=png&scale=2&tileMatrixSetId=WebMercatorQuad&url={url}"
response = requests.get(tile_url)
image = Image.open(BytesIO(response.content))
return image
if __name__ == "__main__":
tile = (10, 173, 407)
search_id = "b9440824baca3a312082e3814a0f5c1b"
urls = get_urls(search_id, tile)
with ThreadPoolExecutor() as executor:
images = list(executor.map(get_tile, urls, [tile] * len(urls)))
img = stack_images(images)
img.save("tile01.png")
$ time python local.py
Number of assets: 75
python local.py 5,18s user 0,12s system 77% cpu 6,815 total
Metadata
Metadata
Assignees
Labels
No labels