ssb-sgis 1.0.7__py3-none-any.whl → 1.0.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
sgis/helpers.py CHANGED
@@ -72,19 +72,29 @@ def to_numpy_func(text: str) -> Callable:
72
72
  raise ValueError
73
73
 
74
74
 
75
- def is_property(obj: object, attribute: str) -> bool:
75
+ def is_property(obj: object, attr: str) -> bool:
76
76
  """Determine if a class attribute is a property.
77
77
 
78
78
  Args:
79
79
  obj: The object to check.
80
- attribute: The attribute name to check on the object.
80
+ attr: The attribute name to check on the object.
81
81
 
82
82
  Returns:
83
83
  True if the attribute is a property, False otherwise.
84
84
  """
85
- return hasattr(obj.__class__, attribute) and isinstance(
86
- getattr(obj.__class__, attribute), property
87
- )
85
+ if not hasattr(obj.__class__, attr):
86
+ return False
87
+ if isinstance(obj, type):
88
+ return isinstance(getattr(obj, attr), property)
89
+ else:
90
+ return isinstance(getattr(obj.__class__, attr), property)
91
+
92
+
93
+ def is_method(obj: Any, attr: str) -> bool:
94
+ if isinstance(obj, type):
95
+ return inspect.ismethod(getattr(obj, attr, None))
96
+ else:
97
+ return inspect.ismethod(getattr(obj.__class__, attr, None))
88
98
 
89
99
 
90
100
  def dict_zip_intersection(*dicts: dict) -> Generator[tuple[Any, ...], None, None]:
sgis/maps/explore.py CHANGED
@@ -144,8 +144,8 @@ def to_tile(tile: str | xyzservices.TileProvider, max_zoom: int) -> folium.TileL
144
144
  "openstreetmap": folium.TileLayer(
145
145
  "OpenStreetMap", min_zoom=0, max_zoom=max_zoom
146
146
  ),
147
- "grunnkart": kartverket.norges_grunnkart,
148
- "gråtone": kartverket.norges_grunnkart_gråtone,
147
+ "grunnkart": kartverket.topo,
148
+ "gråtone": kartverket.topogråtone,
149
149
  "norge_i_bilder": kartverket.norge_i_bilder,
150
150
  "dark": xyz.CartoDB.DarkMatter,
151
151
  "voyager": xyz.CartoDB.Voyager,
@@ -214,11 +214,11 @@ class Explore(Map):
214
214
  """Class for displaying and saving html maps of multiple GeoDataFrames."""
215
215
 
216
216
  # class attribute that can be overridden locally
217
- tiles: ClassVar[tuple[str]] = (
218
- "OpenStreetMap",
219
- "dark",
217
+ tiles: ClassVar[tuple[str, ...]] = (
218
+ "grunnkart",
220
219
  "norge_i_bilder",
221
- # "grunnkart",
220
+ "dark",
221
+ "OpenStreetMap",
222
222
  )
223
223
 
224
224
  def __init__(
sgis/maps/tilesources.py CHANGED
@@ -3,45 +3,27 @@ from xyzservices import TileProvider
3
3
  from xyzservices import providers
4
4
 
5
5
  kartverket = Bunch(
6
- norgeskart=TileProvider(
7
- name="Norgeskart",
8
- url="https://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=norgeskart_bakgrunn&zoom={z}&x={x}&y={y}",
9
- attribution="© Kartverket",
10
- html_attribution='&copy; <a href="https://kartverket.no">Kartverket</a>',
11
- ),
12
- bakgrunnskart_forenklet=TileProvider(
13
- name="Norgeskart forenklet",
14
- url="https://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=bakgrunnskart_forenklet&zoom={z}&x={x}&y={y}",
15
- attribution="© Kartverket",
16
- html_attribution='&copy; <a href="https://kartverket.no">Kartverket</a>',
17
- ),
18
- norges_grunnkart=TileProvider(
19
- name="Norges grunnkart",
20
- url="https://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=norges_grunnkart&zoom={z}&x={x}&y={y}",
21
- attribution="© Kartverket",
22
- html_attribution='&copy; <a href="https://kartverket.no">Kartverket</a>',
23
- ),
24
- norges_grunnkart_gråtone=TileProvider(
25
- name="Norges grunnkart gråtone",
26
- url="https://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=norges_grunnkart_graatone&zoom={z}&x={x}&y={y}",
27
- attribution="© Kartverket",
28
- html_attribution='&copy; <a href="https://kartverket.no">Kartverket</a>',
29
- ),
30
- n50=TileProvider(
31
- name="N5 til N50 kartdata",
32
- url="https://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=kartdata3&zoom={z}&x={x}&y={y}",
6
+ topo=TileProvider(
7
+ name="Topografisk norgeskart",
8
+ url="https://cache.kartverket.no/v1/wmts/1.0.0/topo/default/webmercator/{z}/{y}/{x}.png",
33
9
  attribution="© Kartverket",
34
10
  html_attribution='&copy; <a href="https://kartverket.no">Kartverket</a>',
35
11
  ),
36
12
  topogråtone=TileProvider(
37
13
  name="Topografisk norgeskart gråtone",
38
- url="https://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo4graatone&zoom={z}&x={x}&y={y}",
14
+ url="https://cache.kartverket.no/v1/wmts/1.0.0/topograatone/default/webmercator/{z}/{y}/{x}.png",
39
15
  attribution="© Kartverket",
40
16
  html_attribution='&copy; <a href="https://kartverket.no">Kartverket</a>',
41
17
  ),
42
18
  toporaster=TileProvider(
43
19
  name="Topografisk raster",
44
- url="https://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=toporaster4&zoom={z}&x={x}&y={y}",
20
+ url="https://cache.kartverket.no/v1/wmts/1.0.0/toporaster/default/webmercator/{z}/{y}/{x}.png",
21
+ attribution="© Kartverket",
22
+ html_attribution='&copy; <a href="https://kartverket.no">Kartverket</a>',
23
+ ),
24
+ sjøkart=TileProvider(
25
+ name="Sjøkart",
26
+ url="https://cache.kartverket.no/v1/wmts/1.0.0/sjokartraster/default/webmercator/{z}/{y}/{x}.png",
45
27
  attribution="© Kartverket",
46
28
  html_attribution='&copy; <a href="https://kartverket.no">Kartverket</a>',
47
29
  ),
@@ -95,6 +95,8 @@ from ..geopandas_tools.general import get_common_crs
95
95
  from ..helpers import _fix_path
96
96
  from ..helpers import get_all_files
97
97
  from ..helpers import get_numpy_func
98
+ from ..helpers import is_method
99
+ from ..helpers import is_property
98
100
  from ..io._is_dapla import is_dapla
99
101
  from ..io.opener import opener
100
102
  from . import sentinel_config as config
@@ -164,6 +166,7 @@ ALLOWED_INIT_KWARGS = [
164
166
  "backend",
165
167
  "masking",
166
168
  "_merged",
169
+ "date",
167
170
  ]
168
171
 
169
172
  _load_counter: int = 0
@@ -319,7 +322,7 @@ class _ImageBase:
319
322
  self._bounds = None
320
323
  self._merged = False
321
324
  self._from_array = False
322
- self._from_gdf = False
325
+ self._from_geopandas = False
323
326
  self.metadata_attributes = self.metadata_attributes or {}
324
327
  self._path = None
325
328
  self._metadata_from_xml = False
@@ -328,32 +331,30 @@ class _ImageBase:
328
331
 
329
332
  self.metadata = self._metadata_to_nested_dict(metadata)
330
333
 
331
- if self.filename_regexes:
332
- if isinstance(self.filename_regexes, str):
333
- self.filename_regexes = (self.filename_regexes,)
334
- self.filename_patterns = [
335
- re.compile(regexes, flags=re.VERBOSE)
336
- for regexes in self.filename_regexes
337
- ]
338
- else:
339
- self.filename_patterns = ()
340
-
341
- if self.image_regexes:
342
- if isinstance(self.image_regexes, str):
343
- self.image_regexes = (self.image_regexes,)
344
- self.image_patterns = [
345
- re.compile(regexes, flags=re.VERBOSE) for regexes in self.image_regexes
346
- ]
347
- else:
348
- self.image_patterns = ()
334
+ self.image_patterns = self._compile_regexes("image_regexes")
335
+ self.filename_patterns = self._compile_regexes("filename_regexes")
349
336
 
350
337
  for key, value in kwargs.items():
338
+ error_obj = ValueError(
339
+ f"{self.__class__.__name__} got an unexpected keyword argument '{key}'"
340
+ )
351
341
  if key in ALLOWED_INIT_KWARGS and key in dir(self):
352
- setattr(self, key, value)
342
+ if is_property(self, key):
343
+ setattr(self, f"_{key}", value)
344
+ elif is_method(self, key):
345
+ raise error_obj
346
+ else:
347
+ setattr(self, key, value)
353
348
  else:
354
- raise ValueError(
355
- f"{self.__class__.__name__} got an unexpected keyword argument '{key}'"
356
- )
349
+ raise error_obj
350
+
351
+ def _compile_regexes(self, regex_attr: str) -> tuple[re.Pattern]:
352
+ regexes = getattr(self, regex_attr)
353
+ if regexes:
354
+ if isinstance(regexes, str):
355
+ regexes = (regexes,)
356
+ return tuple(re.compile(regexes, flags=re.VERBOSE) for regexes in regexes)
357
+ return ()
357
358
 
358
359
  @staticmethod
359
360
  def _metadata_to_nested_dict(
@@ -367,6 +368,7 @@ class _ImageBase:
367
368
  if isinstance(metadata, pd.DataFrame):
368
369
 
369
370
  def is_scalar(x) -> bool:
371
+ """Check if scalar because 'truth value of Series is ambigous'."""
370
372
  return not hasattr(x, "__len__") or len(x) <= 1
371
373
 
372
374
  def na_to_none(x) -> None:
@@ -631,12 +633,24 @@ class _ImageBandBase(_ImageBase):
631
633
 
632
634
  def _to_xarray(self, array: np.ndarray, transform: Affine) -> DataArray:
633
635
  """Convert the raster to an xarray.DataArray."""
636
+ attrs = {"crs": self.crs}
637
+ for attr in set(self.metadata_attributes).union({"date"}):
638
+ try:
639
+ attrs[attr] = getattr(self, attr)
640
+ except Exception:
641
+ pass
642
+
634
643
  if len(array.shape) == 2:
635
644
  height, width = array.shape
636
645
  dims = ["y", "x"]
637
646
  elif len(array.shape) == 3:
638
647
  height, width = array.shape[1:]
639
648
  dims = ["band", "y", "x"]
649
+ elif not any(dim for dim in array.shape):
650
+ DataArray(
651
+ name=self.name or self.__class__.__name__,
652
+ attrs=attrs,
653
+ )
640
654
  else:
641
655
  raise ValueError(
642
656
  f"Array should be 2 or 3 dimensional. Got shape {array.shape}"
@@ -644,13 +658,6 @@ class _ImageBandBase(_ImageBase):
644
658
 
645
659
  coords = _generate_spatial_coords(transform, width, height)
646
660
 
647
- attrs = {"crs": self.crs}
648
- for attr in set(self.metadata_attributes).union({"date"}):
649
- try:
650
- attrs[attr] = getattr(self, attr)
651
- except Exception:
652
- pass
653
-
654
661
  return DataArray(
655
662
  array,
656
663
  coords=coords,
@@ -667,7 +674,7 @@ class Band(_ImageBandBase):
667
674
  backend: str = "numpy"
668
675
 
669
676
  @classmethod
670
- def from_gdf(
677
+ def from_geopandas(
671
678
  cls,
672
679
  gdf: GeoDataFrame | GeoSeries,
673
680
  res: int,
@@ -691,7 +698,7 @@ class Band(_ImageBandBase):
691
698
  )
692
699
 
693
700
  obj = cls(arr, res=res, crs=gdf.crs, bounds=gdf.total_bounds, **kwargs)
694
- obj._from_gdf = True
701
+ obj._from_geopandas = True
695
702
  return obj
696
703
 
697
704
  def __init__(
@@ -839,12 +846,18 @@ class Band(_ImageBandBase):
839
846
  @property
840
847
  def height(self) -> int:
841
848
  """Pixel heigth of the image band."""
842
- return self.values.shape[-2]
849
+ try:
850
+ return self.values.shape[-2]
851
+ except IndexError:
852
+ return 0
843
853
 
844
854
  @property
845
855
  def width(self) -> int:
846
856
  """Pixel width of the image band."""
847
- return self.values.shape[-1]
857
+ try:
858
+ return self.values.shape[-1]
859
+ except IndexError:
860
+ return 0
848
861
 
849
862
  @property
850
863
  def tile(self) -> str:
@@ -892,7 +905,7 @@ class Band(_ImageBandBase):
892
905
  copied = self.copy()
893
906
  value_must_be_at_least = np.sort(np.ravel(copied.values))[-n] - (precision or 0)
894
907
  copied._values = np.where(copied.values >= value_must_be_at_least, 1, 0)
895
- df = copied.to_gdf(column).loc[lambda x: x[column] == 1]
908
+ df = copied.to_geopandas(column).loc[lambda x: x[column] == 1]
896
909
  df[column] = f"largest_{n}"
897
910
  return df
898
911
 
@@ -903,7 +916,7 @@ class Band(_ImageBandBase):
903
916
  copied = self.copy()
904
917
  value_must_be_at_least = np.sort(np.ravel(copied.values))[n] - (precision or 0)
905
918
  copied._values = np.where(copied.values <= value_must_be_at_least, 1, 0)
906
- df = copied.to_gdf(column).loc[lambda x: x[column] == 1]
919
+ df = copied.to_geopandas(column).loc[lambda x: x[column] == 1]
907
920
  df[column] = f"smallest_{n}"
908
921
  return df
909
922
 
@@ -911,6 +924,9 @@ class Band(_ImageBandBase):
911
924
  self, mask: GeoDataFrame | GeoSeries | Polygon | MultiPolygon, **kwargs
912
925
  ) -> "Band":
913
926
  """Clip band values to geometry mask."""
927
+ if not self.height or not self.width:
928
+ return self
929
+
914
930
  values = _clip_xarray(
915
931
  self.to_xarray(),
916
932
  mask,
@@ -978,7 +994,6 @@ class Band(_ImageBandBase):
978
994
  if self.has_array and [int(x) for x in bounds] != [int(x) for x in self.bounds]:
979
995
  print(self)
980
996
  print(self.mask)
981
- print(self.mask.values.shape)
982
997
  print(self.values.shape)
983
998
  print([int(x) for x in bounds], [int(x) for x in self.bounds])
984
999
  raise ValueError(
@@ -1284,7 +1299,7 @@ class Band(_ImageBandBase):
1284
1299
  dropna=dropna,
1285
1300
  )
1286
1301
 
1287
- def to_gdf(self, column: str = "value") -> GeoDataFrame:
1302
+ def to_geopandas(self, column: str = "value") -> GeoDataFrame:
1288
1303
  """Create a GeoDataFrame from the image Band.
1289
1304
 
1290
1305
  Args:
@@ -1328,17 +1343,35 @@ class Band(_ImageBandBase):
1328
1343
  self, arr: np.ndarray | DataArray, masked: bool = True
1329
1344
  ) -> np.ndarray | np.ma.core.MaskedArray:
1330
1345
  if not isinstance(arr, np.ndarray):
1346
+ mask_arr = None
1331
1347
  if masked:
1348
+ # if self.mask is not None:
1349
+ # print(self.mask.values.shape, arr.shape)
1350
+ # if self.mask is not None and self.mask.values.shape == arr.shape:
1351
+ # print("hei", self.mask.values.sum())
1352
+ # mask_arr = self.mask.values
1353
+ # else:
1354
+ # mask_arr = np.full(arr.shape, False)
1355
+ # try:
1356
+ # print("hei222", arr.isnull().values.sum())
1357
+ # mask_arr |= arr.isnull().values
1358
+ # except AttributeError:
1359
+ # pass
1360
+ # mask_arr = np.full(arr.shape, False)
1332
1361
  try:
1333
1362
  mask_arr = arr.isnull().values
1334
1363
  except AttributeError:
1335
- mask_arr = np.full(arr.shape, False)
1364
+ pass
1336
1365
  try:
1337
1366
  arr = arr.to_numpy()
1338
1367
  except AttributeError:
1339
1368
  arr = arr.values
1369
+ if mask_arr is not None:
1370
+ arr = np.ma.array(arr, mask=mask_arr, fill_value=self.nodata)
1371
+
1340
1372
  if not isinstance(arr, np.ndarray):
1341
1373
  arr = np.array(arr)
1374
+
1342
1375
  if (
1343
1376
  masked
1344
1377
  and self.mask is not None
@@ -1750,10 +1783,10 @@ class Image(_ImageBandBase):
1750
1783
  bounds.append(band.bounds)
1751
1784
  return get_total_bounds(bounds)
1752
1785
 
1753
- def to_gdf(self, column: str = "value") -> GeoDataFrame:
1786
+ def to_geopandas(self, column: str = "value") -> GeoDataFrame:
1754
1787
  """Convert the array to a GeoDataFrame of grid polygons and values."""
1755
1788
  return pd.concat(
1756
- [band.to_gdf(column=column) for band in self], ignore_index=True
1789
+ [band.to_geopandas(column=column) for band in self], ignore_index=True
1757
1790
  )
1758
1791
 
1759
1792
  def sample(
@@ -2491,7 +2524,7 @@ class ImageCollection(_ImageBase):
2491
2524
  return xr.combine_by_coords(list(xarrs.values()))
2492
2525
  # return Dataset(xarrs)
2493
2526
 
2494
- def to_gdfs(self, column: str = "value") -> dict[str, GeoDataFrame]:
2527
+ def to_geopandas(self, column: str = "value") -> dict[str, GeoDataFrame]:
2495
2528
  """Convert each band in each Image to a GeoDataFrame."""
2496
2529
  out = {}
2497
2530
  i = 0
@@ -2504,7 +2537,7 @@ class ImageCollection(_ImageBase):
2504
2537
  name = f"{self.__class__.__name__}({i})"
2505
2538
 
2506
2539
  if name not in out:
2507
- out[name] = band.to_gdf(column=column)
2540
+ out[name] = band.to_geopandas(column=column)
2508
2541
  return out
2509
2542
 
2510
2543
  def sample(self, n: int = 1, size: int = 500) -> "ImageCollection":
@@ -3257,7 +3290,7 @@ class PathlessImageError(ValueError):
3257
3290
  what = "that have been merged"
3258
3291
  elif self.instance._from_array:
3259
3292
  what = "from arrays"
3260
- elif self.instance._from_gdf:
3293
+ elif self.instance._from_geopandas:
3261
3294
  what = "from GeoDataFrames"
3262
3295
  else:
3263
3296
  raise ValueError(self.instance)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ssb-sgis
3
- Version: 1.0.7
3
+ Version: 1.0.8
4
4
  Summary: GIS functions used at Statistics Norway.
5
5
  Home-page: https://github.com/statisticsnorway/ssb-sgis
6
6
  License: MIT
@@ -17,20 +17,20 @@ sgis/geopandas_tools/point_operations.py,sha256=JM4hvfIVxZaZdGNlGzcCurrKzkgC_b9h
17
17
  sgis/geopandas_tools/polygon_operations.py,sha256=FJ-dXCxLHRsmp0oXsmBOFRprFFwmhrxqOPZkW2WWWQM,50088
18
18
  sgis/geopandas_tools/polygons_as_rings.py,sha256=BX_GZS6F9I4NbEpiOlNBd7zywJjdfdJVi_MkeONBuiM,14941
19
19
  sgis/geopandas_tools/sfilter.py,sha256=SLcMYprQwnY5DNo0R7TGXk4m6u26H8o4PRn-RPhmeZY,9345
20
- sgis/helpers.py,sha256=dn990VGhXXBzOt5Ul8zLgK-s21VFK82A2jhc8rw8xNs,8490
20
+ sgis/helpers.py,sha256=3NqPfVBKlZcZTiMJrsTAlDv5tNKDHrJr_8NimutVzQg,8797
21
21
  sgis/io/_is_dapla.py,sha256=o_qFD5GOi3dsSGOKmW6R8wZU0htVwFgRbGX7ppJCqT4,431
22
22
  sgis/io/dapla_functions.py,sha256=8dfxBtkGUy7vltlKydXkathBsSd9DPHVIDIOe-Ctjsg,18180
23
23
  sgis/io/opener.py,sha256=BHyH7L8Ubh9C4Lsb8eBzGI6FLWg8UQFu-1bg3NEy_2k,862
24
24
  sgis/io/read_parquet.py,sha256=FvZYv1rLkUlrSaUY6QW6E1yntmntTeQuZ9ZRgCDO4IM,3776
25
25
  sgis/maps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
26
  sgis/maps/examine.py,sha256=Pb0dH8JazU5E2svfQrzHO1Bi-sjy5SeyY6zoeMO34jE,9369
27
- sgis/maps/explore.py,sha256=gpYOKSHz-Yx8FkJJ6adkfBN2j351dPumKw6JVoXmMlQ,45555
27
+ sgis/maps/explore.py,sha256=mbSKFynLklJ3g4YfZJMDUo4K7Lg3sDoXDtnJ0l4L51w,45533
28
28
  sgis/maps/httpserver.py,sha256=7Od9JMCtntcIQKk_TchetojMHzFHT9sPw7GANahI97c,1982
29
29
  sgis/maps/legend.py,sha256=1ZOhzftq1HRKlHphhfqUm82U-Kjx_xkACieLRevxke8,26232
30
30
  sgis/maps/map.py,sha256=4znVxefW2wVe_LSmGAVcJQxf3oF_6aAyppNo4EyYJH4,29431
31
31
  sgis/maps/maps.py,sha256=HbKG1OHkSFYZ2dpgpag6H-LY1tOtZKaZncNNrBQpkU4,23127
32
32
  sgis/maps/thematicmap.py,sha256=bFlZy2xSKmEOHhvM0d1pv8O9JuNjR3P_9colTJnduvE,20729
33
- sgis/maps/tilesources.py,sha256=aSci-0JURxnqqirIXQS5bHfNEIg3xfCM_B4gXs7GslM,2772
33
+ sgis/maps/tilesources.py,sha256=F4mFHxPwkiPJdVKzNkScTX6xbJAMIUtlTq4mQ83oguw,1746
34
34
  sgis/networkanalysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  sgis/networkanalysis/_get_route.py,sha256=9I3t9pnccUPr4mozy3TJCOpGCCf3UOIojmsbifubZbA,6368
36
36
  sgis/networkanalysis/_od_cost_matrix.py,sha256=zkyPX7ObT996ahaFJ2oI0D0SqQWbWyfy_qLtXwValPg,3434
@@ -49,12 +49,12 @@ sgis/parallel/parallel.py,sha256=SlC_mOwvSSyWTKUcxLMGkuWHUkEC6dXTlN0Jn5cAtxA,396
49
49
  sgis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
50
  sgis/raster/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
51
  sgis/raster/base.py,sha256=Bdd30DS0iIv7fo93vrFoEBGC7a5PFaBXT46fcHwgORY,6558
52
- sgis/raster/image_collection.py,sha256=BSibIsuKAznMHfh23E9CMfLoyvF1gfjg418GF-aPRGA,116998
52
+ sgis/raster/image_collection.py,sha256=XrQddJgpP-R0KeLEWeqsOBOaMExA9lCt0_5rR7tXku8,118307
53
53
  sgis/raster/indices.py,sha256=-J1HYmnT240iozvgagvyis6K0_GHZHRuUrPOgyoeIrY,223
54
54
  sgis/raster/regex.py,sha256=I7pTAYNoOFgcPRLllR4jGMhmRk8AkOgm1D38fDSFnlg,3745
55
55
  sgis/raster/sentinel_config.py,sha256=nySDqn2R8M6W8jguoBeSAK_zzbAsqmaI59i32446FwY,1268
56
56
  sgis/raster/zonal.py,sha256=st2mWiUcdxeEiHBOZSgFOnVcP6pc4EMPJBPw537Z4V8,3837
57
- ssb_sgis-1.0.7.dist-info/LICENSE,sha256=np3IfD5m0ZUofn_kVzDZqliozuiO6wrktw3LRPjyEiI,1073
58
- ssb_sgis-1.0.7.dist-info/METADATA,sha256=YnVqRt72kwWk0l5L2kvRn1SMigUasE1MP3oDI68UZsY,11772
59
- ssb_sgis-1.0.7.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
60
- ssb_sgis-1.0.7.dist-info/RECORD,,
57
+ ssb_sgis-1.0.8.dist-info/LICENSE,sha256=np3IfD5m0ZUofn_kVzDZqliozuiO6wrktw3LRPjyEiI,1073
58
+ ssb_sgis-1.0.8.dist-info/METADATA,sha256=9Q_QyG0VOQAy9uhAi1kX64dVgb6AJ2xWwG91B_r_Nxo,11772
59
+ ssb_sgis-1.0.8.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
60
+ ssb_sgis-1.0.8.dist-info/RECORD,,