7
7
8
8
9
9
class ConstSizeTiles (BaseTiles ):
10
+ """Class provides constant size tile parameters (offset, extent) to extract data from image.
11
+ Generated tile extents can overlap and do not includes nodata paddings.
12
+
13
+ Args:
14
+ image_size (list/tuple of int): input image size in pixels (width, height)
15
+ tile_size (int or list/tuple of int): output tile size in pixels (width, height)
16
+ min_overlapping (int): minimal overlapping in pixels between tiles.
17
+ scale (float): Scaling applied to the input image parameters before extracting tile's extent
10
18
"""
11
- Class provides constant size tile parameters (offset, extent) to extract data from image.
12
- Generated tile extents can overlap, do not includes nodata paddings.
13
-
14
- For example, tiling can look like this:
15
- ```
16
- tile 0 tile 2 tile 4
17
- |<------>| |<------>| |<------>|
18
- tile 1 tile 3 tile 5
19
- |<------>| |<------>| |<------>|
20
- |<------------------------------------>|
21
- | IMAGE |
22
- | |
23
- ```
24
-
25
- Usage:
26
- ```
27
- from tiling import ConstSizeTiles
28
-
29
- tiles = ConstSizeTiles(image_size=(500, 500), tile_size=(256, 256), min_overlapping=100)
30
-
31
- print("Number of tiles: %i" % len(tiles))
32
- for x, y, width, height in tiles:
33
- data = read_data(x, y, width, height, tiles.tile_size[0], tiles.tile_size[0])
34
- print("data.shape: {}".format(data.shape))
35
-
36
- ```
37
- """
38
-
39
19
def __init__ (self , image_size , tile_size , min_overlapping = 0 , scale = 1.0 ):
40
- """
41
- Initialize tiles
42
- :param image_size: (list/tuple of int) input image size in pixels (width, height)
43
- :param tile_size: (int or list/tuple of int) output tile size in pixels (width, height)
44
- :param min_overlapping: (int) minimal overlapping in pixels. Actual overlapping between tiles will not be
45
- constant, minimal overlapping value is the minimum boundary value.
46
- :param scale: (float) Scaling applied to the input image parameters before extracting tile's extent.
47
- """
48
20
super (ConstSizeTiles , self ).__init__ (image_size = image_size , tile_size = tile_size , scale = scale )
49
21
50
22
if not (0 <= min_overlapping < min (self .tile_extent [0 ], self .tile_extent [1 ])):
@@ -71,27 +43,28 @@ def __init__(self, image_size, tile_size, min_overlapping=0, scale=1.0):
71
43
self ._max_index = self .nx * self .ny
72
44
73
45
def __len__ (self ):
74
- """
75
- Method to get total number of tiles
76
- :return:
46
+ """Method to get total number of tiles
77
47
"""
78
48
return self ._max_index
79
49
80
50
@staticmethod
81
51
def _compute_tile_extent (idx , tile_extent , overlapping ):
82
- """
83
- Method to compute tile extent: offset, extent for a given index
52
+ """Method to compute tile extent: offset, extent for a given index
84
53
"""
85
54
86
55
offset = int (round (idx * (tile_extent - overlapping )))
87
56
return offset , int (round (tile_extent ))
88
57
89
58
def __getitem__ (self , idx ):
90
- """
91
- Method to get the tile at index `idx`
92
- :param idx: (int) tile index between `0` and `len(tiles)`
93
- :return: (tuple) tile extent in pixels: x offset, y offset, x tile extent, y tile extent
94
- If scale is 1.0, then x tile extent, y tile extent are equal to tile size
59
+ """Method to get the tile at index `idx`
60
+
61
+ Args:
62
+ idx: (int) tile index between `0` and `len(tiles)`
63
+
64
+ Returns:
65
+ (tuple) tile extent in pixels: x offset, y offset, x tile extent, y tile extent
66
+
67
+ If scale is 1.0, then x tile extent, y tile extent are equal to tile size
95
68
"""
96
69
if idx < - self ._max_index or idx >= self ._max_index :
97
70
raise IndexError ("Index %i is out of ranges %i and %i" % (idx , 0 , self ._max_index ))
@@ -108,18 +81,12 @@ def __getitem__(self, idx):
108
81
109
82
@staticmethod
110
83
def _compute_number_of_tiles (tile_extent , image_size , min_overlapping ):
111
- """
112
- Method to compute number of overlapping tiles for a given image size
113
- n = ceil(image_size / (tile_size - min_overlapping))
84
+ """Method to compute number of overlapping tiles for a given image size
114
85
"""
115
86
return ceil_int (image_size * 1.0 / (tile_extent - min_overlapping + 1e-10 ))
116
87
117
88
@staticmethod
118
89
def _compute_float_overlapping (tile_size , image_size , n ):
119
- """
120
- Method to float overlapping
121
-
122
- delta = tile_size * n - image_size
123
- overlapping = delta / (n - 1)
90
+ """Method to float overlapping
124
91
"""
125
92
return (tile_size * n - image_size ) * 1.0 / (n - 1.0 ) if n > 1 else 0
0 commit comments