· 5 years ago · Jun 02, 2020, 12:58 PM
1from collections import defaultdict
2
3import imageio
4import mercantile
5import requests
6
7def get_tiles_from_field_metadata(key, channel, zooms):
8 response = requests.get(f"http://localhost:5000/metadata/{key}/{channel}")
9 west, south, east, north = response.json()['bounds']
10 tiles = list(mercantile.tiles(west, south, east, north, zooms))
11 final_tiles = [[tile.x, tile.y, tile.z] for tile in tiles]
12 return final_tiles
13
14
15def construct_url(x: int, y: int, z: int):
16 # In this experimental script makes api calls to rgb tile endpoint.
17 return f"http://localhost:5000/rgb/reflectance/{x}/{y}/{z}.png?&r=red&g=green&b=blue&r_range=%5B0.0%2C2286.8%5D&%22%22=%5B0.0%2C2286.8%5D&b_range=%5B0.0%2C2286.8%5D"
18
19
20def get_image_data_array(x: int, y: int, z: int):
21 # Construct tile data each time calling api with respective x, y, z coordinates.
22 image_data = imageio.imread(construct_url(x, y, z))
23 return image_data
24
25
26def combine_image_data_by_x(tiles):
27 # Get dict of image array combined by x value.
28 initial_x = tiles[0][0]
29 combined_images = defaultdict(list)
30 for tile in tiles:
31 local_x = tile[0]
32 if local_x == initial_x:
33 image_array = get_image_data_array(tile[2], tile[0], tile[1])
34 combined_images[local_x].append(image_array)
35 else:
36 initial_x = local_x
37 image_array = get_image_data_array(tile[2], tile[0], tile[1])
38 combined_images[initial_x].append(image_array)
39 return combined_images
40
41
42def get_resulting_image_shape(tiles, tile_size=(256, 256)):
43 dict_of_tiles = combine_image_data_by_x(tiles)
44 image_height, image_width = len(dict_of_tiles.keys()) * tile_size[0], None
45 for key in dict_of_tiles:
46 image_width = len(dict_of_tiles[key]) * tile_size[1]
47 break
48 return image_height, image_width
49
50
51resulting_tiles = get_tiles_from_field_metadata('reflectance', 'red', 18)
52print(get_resulting_image_shape(resulting_tiles))