ssb-sgis 1.2.1__py3-none-any.whl → 1.2.3__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/maps/thematicmap.py CHANGED
@@ -11,12 +11,14 @@ import pandas as pd
11
11
  from geopandas import GeoDataFrame
12
12
 
13
13
  from ..geopandas_tools.conversion import to_bbox
14
+ from ..geopandas_tools.conversion import to_gdf
14
15
  from ..helpers import is_property
15
16
  from .legend import LEGEND_KWARGS
16
17
  from .legend import ContinousLegend
17
18
  from .legend import Legend
18
19
  from .legend import prettify_bins
19
20
  from .map import Map
21
+ from .map import _determine_best_name
20
22
 
21
23
  # the geopandas._explore raises a deprication warning. Ignoring for now.
22
24
  warnings.filterwarnings(
@@ -70,6 +72,7 @@ class ThematicMap(Map):
70
72
  bins: For numeric columns. List of numbers that define the
71
73
  maximum value for the color groups.
72
74
  nan_label: Label for missing data.
75
+ nan_hatch: Hatch for missing data. See https://matplotlib.org/stable/gallery/shapes_and_collections/hatch_style_reference.html.
73
76
  legend_kwargs: dictionary with attributes for the legend. E.g.:
74
77
  title: Legend title. Defaults to the column name.
75
78
  rounding: If positive number, it will round floats to n decimals.
@@ -170,23 +173,50 @@ class ThematicMap(Map):
170
173
  k: int = 5,
171
174
  bins: tuple[float] | None = None,
172
175
  nan_label: str = "Missing",
176
+ nan_color: str | None = None,
177
+ nan_hatch: str | None = None,
178
+ hatch: str | None = None,
173
179
  legend_kwargs: dict | None = None,
174
180
  title_kwargs: dict | None = None,
175
181
  legend: bool = True,
176
182
  **kwargs,
177
183
  ) -> None:
178
- """Initialiser."""
184
+ """Initializer."""
185
+ new_gdfs = {}
186
+ for i, gdf in enumerate(gdfs):
187
+ if isinstance(gdf, str):
188
+ raise ValueError("gdfs cannot be a string in ThematicMap.")
189
+ name = _determine_best_name(gdf, column, i)
190
+ if name in new_gdfs:
191
+ name += str(i)
192
+ try:
193
+ new_gdfs[name] = to_gdf(gdf)
194
+ except Exception:
195
+ continue
196
+
197
+ new_kwargs = {}
198
+ self.kwargs = {}
199
+ for key, value in kwargs.items():
200
+ try:
201
+ new_gdfs[key] = to_gdf(value)
202
+ except Exception:
203
+ new_kwargs[key] = value
204
+
179
205
  super().__init__(
180
- *gdfs,
181
206
  column=column,
182
207
  scheme=scheme,
183
208
  k=k,
184
209
  bins=bins,
185
210
  nan_label=nan_label,
211
+ nan_color=nan_color,
212
+ **new_gdfs,
186
213
  )
187
214
 
215
+ self.kwargs = self.kwargs | new_kwargs
216
+
188
217
  self.title = title
189
218
  self._size = size
219
+ self.hatch = hatch
190
220
  self._dark = dark
191
221
  self.title_kwargs = title_kwargs or {}
192
222
  if title_position and "position" in self.title_kwargs:
@@ -219,7 +249,7 @@ class ThematicMap(Map):
219
249
 
220
250
  self._title_fontsize = self._size * 1.9
221
251
 
222
- black = kwargs.pop("black", None)
252
+ black = self.kwargs.pop("black", None)
223
253
  self._dark = self._dark or black
224
254
 
225
255
  if not self.cmap and not self._is_categorical:
@@ -235,13 +265,15 @@ class ThematicMap(Map):
235
265
  if cmap:
236
266
  self._cmap = cmap
237
267
 
238
- for key, value in kwargs.items():
268
+ new_kwargs = {}
269
+ for key, value in self.kwargs.items():
239
270
  if key not in MAP_KWARGS:
240
- self.kwargs[key] = value
271
+ new_kwargs[key] = value
241
272
  elif is_property(self, key):
242
273
  setattr(self, f"_{key}", value)
243
274
  else:
244
275
  setattr(self, key, value)
276
+ self.kwargs = new_kwargs
245
277
 
246
278
  for key, value in legend_kwargs.items():
247
279
  if key not in LEGEND_KWARGS:
@@ -261,6 +293,20 @@ class ThematicMap(Map):
261
293
  self.diffx = self.maxx - self.minx
262
294
  self.diffy = self.maxy - self.miny
263
295
 
296
+ if self._gdf[self._column].isna().any():
297
+ isnas = []
298
+ for label, gdf in self._gdfs.items():
299
+
300
+ isnas.append(gdf[gdf[self._column].isna()])
301
+ self._gdfs[label] = gdf[gdf[self._column].notna()]
302
+ color = self.facecolor if nan_hatch else self.nan_color
303
+ self._more_data[nan_label] = {
304
+ "gdf": pd.concat(isnas, ignore_index=True),
305
+ "color": color,
306
+ "hatch": nan_hatch,
307
+ } | new_kwargs
308
+ self._gdf = pd.concat(self.gdfs.values(), ignore_index=True)
309
+
264
310
  @property
265
311
  def valid_keywords(self) -> set[str]:
266
312
  """List all valid keywords for the class initialiser."""
@@ -279,6 +325,52 @@ class ThematicMap(Map):
279
325
  super().change_cmap(cmap, start, stop)
280
326
  return self
281
327
 
328
+ def add_data(
329
+ self,
330
+ *,
331
+ color: str | None = None,
332
+ hatch: str | None = None,
333
+ **kwargs,
334
+ ) -> "ThematicMap":
335
+ """Add Geometric Data of a given color or hatch.
336
+
337
+ The geodata must be passed as keyword argument.
338
+ The keyword will be used as label in the legend.
339
+
340
+ Args:
341
+ color: Color of the data.
342
+ hatch: Hatch of the data. See https://matplotlib.org/stable/gallery/shapes_and_collections/hatch_style_reference.html.
343
+ **kwargs: Must include exactly one GeoDataFrame or object that can be converted to GeoDataFrame.
344
+ Additional kwargs are passed to geopandas.GeoDataFrame.plot and matplotlib.patches.Patch.
345
+ """
346
+ new_kwargs = {}
347
+ n = 0
348
+ for key, value in kwargs.items():
349
+ try:
350
+ gdf = to_gdf(value)
351
+ label = key
352
+ n += 1
353
+ except Exception:
354
+ new_kwargs[key] = value
355
+
356
+ if n != 1:
357
+ raise ValueError(
358
+ "Must specify a single geometry object as keyword argument."
359
+ )
360
+ if not color and not hatch:
361
+ raise TypeError("Must pass either 'color' or 'hatch'.")
362
+ if hatch is not None:
363
+ color = self.facecolor
364
+ gdf["label"] = label
365
+ self._more_data[label] = {
366
+ "gdf": gdf,
367
+ "color": color,
368
+ "hatch": hatch,
369
+ } | new_kwargs
370
+ if self.bounds is None:
371
+ self.bounds = to_bbox(self._gdf.total_bounds)
372
+ return self
373
+
282
374
  def add_background(
283
375
  self,
284
376
  gdf: GeoDataFrame,
@@ -327,11 +419,13 @@ class ThematicMap(Map):
327
419
  include_legend = False
328
420
 
329
421
  elif self._is_categorical:
330
- kwargs = self._prepare_categorical_plot(kwargs)
422
+ self._prepare_categorical_plot()
423
+ if self._gdf is not None:
424
+ kwargs["color"] = self._gdf["color"]
331
425
  if self.legend:
332
426
  self.legend._prepare_categorical_legend(
333
427
  categories_colors=self._categories_colors_dict,
334
- nan_label=self.nan_label,
428
+ hatch=self.hatch,
335
429
  )
336
430
 
337
431
  else:
@@ -339,19 +433,23 @@ class ThematicMap(Map):
339
433
  if self.legend:
340
434
  if not self.legend.rounding:
341
435
  self.legend._rounding = self.legend._get_rounding(
342
- array=self._gdf.loc[~self._nan_idx, self._column]
436
+ array=self._gdf[self._column].dropna()
343
437
  )
344
438
 
345
439
  self.legend._prepare_continous_legend(
346
440
  bins=self.bins,
347
441
  colors=self._unique_colors,
348
- nan_label=self.nan_label,
349
442
  bin_values=self._bins_unique_values,
443
+ nan_label=self.nan_label,
444
+ hatch=self.hatch,
350
445
  )
351
446
 
447
+ if self.legend and self._more_data:
448
+ self.legend._add_more_data_to_legend(self._more_data)
449
+
352
450
  if self.legend and not self.legend._position_has_been_set:
353
451
  self.legend._position = self.legend._get_best_legend_position(
354
- self._gdf, k=self._k + bool(len(self._nan_idx))
452
+ self._gdf, k=self._k + self._gdf[self._column].isna().any()
355
453
  )
356
454
 
357
455
  self._prepare_plot(**kwargs)
@@ -359,7 +457,9 @@ class ThematicMap(Map):
359
457
  if self.legend:
360
458
  self.ax = self.legend._actually_add_legend(ax=self.ax)
361
459
 
362
- self.ax = self._gdf.plot(legend=include_legend, ax=self.ax, **kwargs)
460
+ self.ax = self._gdf.plot(
461
+ legend=include_legend, ax=self.ax, hatch=self.hatch, **kwargs
462
+ )
363
463
 
364
464
  if __test:
365
465
  return self
@@ -394,16 +494,17 @@ class ThematicMap(Map):
394
494
  )
395
495
  self.fig.patch.set_facecolor(self.facecolor)
396
496
  self.ax.set_axis_off()
497
+ self.ax.set_xlim([self.minx - self.diffx * 0.03, self.maxx + self.diffx * 0.03])
498
+ self.ax.set_ylim([self.miny - self.diffy * 0.03, self.maxy + self.diffy * 0.03])
397
499
 
398
500
  if hasattr(self, "_background_gdfs"):
399
501
  self._actually_add_background()
400
- elif self.bounds is not None:
401
- self.ax.set_xlim(
402
- [self.minx - self.diffx * 0.03, self.maxx + self.diffx * 0.03]
403
- )
404
- self.ax.set_ylim(
405
- [self.miny - self.diffy * 0.03, self.maxy + self.diffy * 0.03]
406
- )
502
+ # if self.bounds is not None:
503
+
504
+ for datadict in self._more_data.values():
505
+ gdf = datadict["gdf"]
506
+ datadict = {key: value for key, value in datadict.items() if key != "gdf"}
507
+ gdf.plot(ax=self.ax, **datadict)
407
508
 
408
509
  if self.title:
409
510
  self.ax.set_title(
@@ -437,7 +538,10 @@ class ThematicMap(Map):
437
538
 
438
539
  classified = self._classify_from_bins(self._gdf, bins=self.bins)
439
540
  classified_sequential = self._push_classification(classified)
440
- n_colors = len(np.unique(classified_sequential)) - any(self._nan_idx)
541
+ n_colors = (
542
+ len(np.unique(classified_sequential))
543
+ - self._gdf[self._column].isna().any()
544
+ )
441
545
  self._unique_colors = self._get_continous_colors(n=n_colors)
442
546
  self._bins_unique_values = self._make_bin_value_dict(
443
547
  self._gdf, classified_sequential
@@ -453,27 +557,16 @@ class ThematicMap(Map):
453
557
  bins=self.bins, rounding=self.legend._rounding
454
558
  )
455
559
 
456
- if any(self._nan_idx):
560
+ if self._gdf[self._column].isna().any():
457
561
  self.bins = self.bins + [self.nan_label]
458
562
 
459
563
  return kwargs
460
564
 
461
- def _prepare_categorical_plot(self, kwargs: dict) -> dict:
462
- """Map values to colors."""
463
- self._make_categories_colors_dict()
464
- if self._gdf is not None and len(self._gdf):
465
- self._fix_nans()
466
-
467
- if self._gdf is not None:
468
- colorarray = self._gdf["color"]
469
- kwargs["color"] = colorarray
470
- return kwargs
471
-
472
565
  def _actually_add_legend(self) -> None:
473
566
  """Add legend to the axis and fill it with colors and labels."""
474
567
  if not self.legend._position_has_been_set:
475
568
  self.legend._position = self.legend._get_best_legend_position(
476
- self._gdf, k=self._k + bool(len(self._nan_idx))
569
+ self._gdf, k=self._k + self._gdf[self._column].isna().any()
477
570
  )
478
571
 
479
572
  if self._is_categorical:
@@ -518,15 +611,15 @@ class ThematicMap(Map):
518
611
  return bins_unique_values
519
612
 
520
613
  def _actually_add_background(self) -> None:
521
- self.ax.set_xlim([self.minx - self.diffx * 0.03, self.maxx + self.diffx * 0.03])
522
- self.ax.set_ylim([self.miny - self.diffy * 0.03, self.maxy + self.diffy * 0.03])
614
+ # self.ax.set_xlim([self.minx - self.diffx * 0.03, self.maxx + self.diffx * 0.03])
615
+ # self.ax.set_ylim([self.miny - self.diffy * 0.03, self.maxy + self.diffy * 0.03])
523
616
  self._background_gdfs.plot(
524
617
  ax=self.ax, color=self.bg_gdf_color, **self.bg_gdf_kwargs
525
618
  )
526
619
 
527
620
  @staticmethod
528
621
  def _get_matplotlib_figure_and_axix(
529
- figsize: tuple[int, int]
622
+ figsize: tuple[int, int],
530
623
  ) -> tuple[matplotlib.figure.Figure, matplotlib.axes.Axes]:
531
624
  fig = plt.figure(figsize=figsize)
532
625
  ax = fig.add_subplot(1, 1, 1)
@@ -539,7 +632,7 @@ class ThematicMap(Map):
539
632
  "#fefefe",
540
633
  "#383836",
541
634
  )
542
- self.nan_color = "#666666"
635
+ self.nan_color = "#666666" if self._nan_color_was_none else self.nan_color
543
636
  if not self._is_categorical:
544
637
  self.change_cmap("viridis")
545
638
 
@@ -557,7 +650,7 @@ class ThematicMap(Map):
557
650
  "#0f0f0f",
558
651
  "#e8e6e6",
559
652
  )
560
- self.nan_color = "#c2c2c2"
653
+ self.nan_color = "#c2c2c2" if self._nan_color_was_none else self.nan_color
561
654
  if not self._is_categorical:
562
655
  self.change_cmap("RdPu", start=23)
563
656
 
@@ -569,16 +662,6 @@ class ThematicMap(Map):
569
662
  }.items():
570
663
  setattr(self.legend, key, color)
571
664
 
572
- @property
573
- def dark(self) -> bool:
574
- """Whether to use dark background and light text colors."""
575
- return self._dark
576
-
577
- @dark.setter
578
- def dark(self, new_value: bool):
579
- self._dark = new_value
580
- self._dark_or_light()
581
-
582
665
  @property
583
666
  def title_fontsize(self) -> int:
584
667
  """Title fontsize, not to be confused with legend.title_fontsize."""
sgis/maps/wms.py CHANGED
@@ -55,6 +55,7 @@ class NorgeIBilderWms(WmsLoader):
55
55
  contains: str | Iterable[str] | None = None
56
56
  not_contains: str | Iterable[str] | None = None
57
57
  show: bool | Iterable[int] | int = False
58
+ _use_json: bool = True
58
59
 
59
60
  def load_tiles(self) -> None:
60
61
  """Load all Norge i bilder tiles into self.tiles."""
@@ -184,7 +185,7 @@ class NorgeIBilderWms(WmsLoader):
184
185
 
185
186
  self.years = [str(int(year)) for year in self.years]
186
187
 
187
- if all(year in JSON_YEARS for year in self.years):
188
+ if self._use_json and all(year in JSON_YEARS for year in self.years):
188
189
  try:
189
190
  with open(JSON_PATH, encoding="utf-8") as file:
190
191
  self.tiles = json.load(file)
@@ -94,6 +94,8 @@ except ImportError:
94
94
  """Placeholder."""
95
95
 
96
96
 
97
+ from ..conf import _get_instance
98
+ from ..conf import config
97
99
  from ..geopandas_tools.bounds import get_total_bounds
98
100
  from ..geopandas_tools.conversion import to_bbox
99
101
  from ..geopandas_tools.conversion import to_gdf
@@ -106,7 +108,7 @@ from ..helpers import is_method
106
108
  from ..helpers import is_property
107
109
  from ..io._is_dapla import is_dapla
108
110
  from ..io.opener import opener
109
- from . import sentinel_config as config
111
+ from . import sentinel_config
110
112
  from .base import _array_to_geojson
111
113
  from .base import _gdf_to_arr
112
114
  from .base import _get_res_from_bounds
@@ -443,11 +445,15 @@ class _ImageBase:
443
445
  metadata_attributes: ClassVar[dict | None] = None
444
446
  masking: ClassVar[BandMasking | None] = None
445
447
 
446
- def __init__(self, *, metadata=None, bbox=None, **kwargs) -> None:
448
+ def __init__(self, *, metadata=None, bbox=None, file_system=None, **kwargs) -> None:
447
449
 
448
450
  self._bounds = None
449
451
  self._path = None
450
452
  self._bbox = to_bbox(bbox) if bbox is not None else None
453
+ if file_system is None:
454
+ self.file_system = _get_instance(config, "file_system")
455
+ else:
456
+ self.file_system = file_system
451
457
 
452
458
  self.metadata_attributes = self.metadata_attributes or {}
453
459
 
@@ -3135,8 +3141,8 @@ class ImageCollection(_ImageBase):
3135
3141
  class Sentinel2Config:
3136
3142
  """Holder of Sentinel 2 regexes, band_ids etc."""
3137
3143
 
3138
- image_regexes: ClassVar[str] = (config.SENTINEL2_IMAGE_REGEX,)
3139
- filename_regexes: ClassVar[str] = (config.SENTINEL2_FILENAME_REGEX,)
3144
+ image_regexes: ClassVar[str] = (sentinel_config.SENTINEL2_IMAGE_REGEX,)
3145
+ filename_regexes: ClassVar[str] = (sentinel_config.SENTINEL2_FILENAME_REGEX,)
3140
3146
  metadata_attributes: ClassVar[
3141
3147
  dict[str, Callable | functools.partial | tuple[str]]
3142
3148
  ] = {
@@ -3222,8 +3228,8 @@ class Sentinel2Config:
3222
3228
  class Sentinel2CloudlessConfig(Sentinel2Config):
3223
3229
  """Holder of regexes, band_ids etc. for Sentinel 2 cloudless mosaic."""
3224
3230
 
3225
- image_regexes: ClassVar[str] = (config.SENTINEL2_MOSAIC_IMAGE_REGEX,)
3226
- filename_regexes: ClassVar[str] = (config.SENTINEL2_MOSAIC_FILENAME_REGEX,)
3231
+ image_regexes: ClassVar[str] = (sentinel_config.SENTINEL2_MOSAIC_IMAGE_REGEX,)
3232
+ filename_regexes: ClassVar[str] = (sentinel_config.SENTINEL2_MOSAIC_FILENAME_REGEX,)
3227
3233
  masking: ClassVar[None] = None
3228
3234
  all_bands: ClassVar[list[str]] = [
3229
3235
  x.replace("B0", "B") for x in Sentinel2Config.all_bands
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ssb-sgis
3
- Version: 1.2.1
3
+ Version: 1.2.3
4
4
  Summary: GIS functions used at Statistics Norway.
5
5
  Home-page: https://github.com/statisticsnorway/ssb-sgis
6
6
  License: MIT
@@ -9,11 +9,11 @@ sgis/geopandas_tools/centerlines.py,sha256=Q65Sx01SeAlulBEd9oaZkB2maBBNdLcJwAbTI
9
9
  sgis/geopandas_tools/cleaning.py,sha256=PkAVVZ84ahek8_uVlTRtCO8nCWO6DdGltWLTmPOsvxM,24426
10
10
  sgis/geopandas_tools/conversion.py,sha256=w3W0Utaw7SESRR659percNLwOY9_yfg6DL5hcuM1CUA,25017
11
11
  sgis/geopandas_tools/duplicates.py,sha256=TDDM4u1n7SIkyJrOfl1Lno92AmUPqtXBHsj1IUKC0hI,14992
12
- sgis/geopandas_tools/general.py,sha256=PHcQipR579mhABPALQICw2HnnByGe65XMHthTzVH_Ps,43927
12
+ sgis/geopandas_tools/general.py,sha256=YRpNEdwTHyFdQOdAfbCmYXS7PxoDjXxoagwpteXkYdI,43937
13
13
  sgis/geopandas_tools/geocoding.py,sha256=n47aFQMm4yX1MsPnTM4dFjwegCA1ZmGUDj1uyu7OJV4,691
14
14
  sgis/geopandas_tools/geometry_types.py,sha256=ijQDbQaZPqPGjBl707H4yooNXpk21RXyatI7itnvqLk,7603
15
15
  sgis/geopandas_tools/neighbors.py,sha256=tMs8jUU0np5QvIysUdF0lLEdXwiXTBotTSdgUXclEfY,17480
16
- sgis/geopandas_tools/overlay.py,sha256=WsJFt9QjkYCUQY_2ckySZ0yG66EeEBHpkyipHs0do4o,23399
16
+ sgis/geopandas_tools/overlay.py,sha256=5i9u8GgFuU0fCqzELsbIaoUPhw-E7eZHl_yKB0wEcGM,23464
17
17
  sgis/geopandas_tools/point_operations.py,sha256=JM4hvfIVxZaZdGNlGzcCurrKzkgC_b9hzbFYN42f9WY,6972
18
18
  sgis/geopandas_tools/polygon_operations.py,sha256=v-B9IgbFfm4dVHKPyzvmnNiqVCdtl9ddpCsQpZZ-9sU,49284
19
19
  sgis/geopandas_tools/polygons_as_rings.py,sha256=BX_GZS6F9I4NbEpiOlNBd7zywJjdfdJVi_MkeONBuiM,14941
@@ -23,20 +23,20 @@ sgis/geopandas_tools/utils.py,sha256=X0pRvB1tWgV_0BCrRS1HU9LtLGnZCpvVPxyqM9JGb0Y
23
23
  sgis/helpers.py,sha256=4N6vFWQ3TYVzRHNcWY_fNa_GkFuaZB3vtCkkFND-qs0,9628
24
24
  sgis/io/__init__.py,sha256=uyBr20YDqB2bQttrd5q1JuGOvX32A-MSvS7Wmw5f5qg,177
25
25
  sgis/io/_is_dapla.py,sha256=wmfkSe98IrLhUg3dtXZusV6OVC8VlY1kbc5EQDf3P-Q,358
26
- sgis/io/dapla_functions.py,sha256=3jt5444gXNDV5Md8E2_Sjvb4p0QjHptjqDjw7aHWlns,30476
26
+ sgis/io/dapla_functions.py,sha256=cwCmwgOoWOaYMJ35hgAJtCJ7m8bQBM4RsL7y3afjnLc,30539
27
27
  sgis/io/opener.py,sha256=HWO3G1NB6bpXKM94JadCD513vjat1o1TFjWGWzyVasg,898
28
28
  sgis/io/read_parquet.py,sha256=FvZYv1rLkUlrSaUY6QW6E1yntmntTeQuZ9ZRgCDO4IM,3776
29
29
  sgis/maps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
30
  sgis/maps/examine.py,sha256=Pb0dH8JazU5E2svfQrzHO1Bi-sjy5SeyY6zoeMO34jE,9369
31
- sgis/maps/explore.py,sha256=0QDPaj5YU2Jps5iujuHu-vk_R9mFh_aOhbN1eU-fxcI,47898
31
+ sgis/maps/explore.py,sha256=4ly_zeMiHUZThBzoVt62Z4smEZH97qsnzodaaRiBJco,47697
32
32
  sgis/maps/httpserver.py,sha256=eCDoB9x74kSLiGEj2X3O91t3oscY_ia17UNuaaJ6tCc,2472
33
- sgis/maps/legend.py,sha256=lVRVCkhPmJRjGK23obFJZAO3qp6du1LYnobkkN7DPkc,26279
34
- sgis/maps/map.py,sha256=veTx5blncH54jDx3WCLwstryn9CjlaNqWggooJY49Pg,30480
35
- sgis/maps/maps.py,sha256=csPXJa9R7zwlDJ0lz8qW91l0uRxjo1m2smoU8IPtgLA,23091
36
- sgis/maps/norge_i_bilder.json,sha256=W_mFfte3DxugWbEudZ5fadZ2JeFYb0hyab2Quf4oJME,481311
37
- sgis/maps/thematicmap.py,sha256=w6q4_gIr8BubQgsPJkc6WXk-tmplDLGcKyjphhFp7ng,21873
33
+ sgis/maps/legend.py,sha256=qq2RkebuaNAdFztlXrDOWbN0voeK5w5VycmRKyx0NdM,26512
34
+ sgis/maps/map.py,sha256=q0gqOg_DD1ea7B_8__nuFN1dYA7o3uIxS6KuJwmVNhQ,30269
35
+ sgis/maps/maps.py,sha256=Ti4nfm6bz_8ZWVHoEHF61moI3LQH9Ee6Jd8NHzInWkw,23135
36
+ sgis/maps/norge_i_bilder.json,sha256=VKmb7rg4jvgc8_Ve1fFnHyZ_Dkv4T5GTA0UCpqpFAi4,492751
37
+ sgis/maps/thematicmap.py,sha256=xTX_Y6ZXLcjNCgfUOr87pAMD4cjKxhFudZZXn_ewpII,25171
38
38
  sgis/maps/tilesources.py,sha256=F4mFHxPwkiPJdVKzNkScTX6xbJAMIUtlTq4mQ83oguw,1746
39
- sgis/maps/wms.py,sha256=y8xJSWCqE1SZPInWKiTGdGLI015hOFrdwUyPVouU1LU,6885
39
+ sgis/maps/wms.py,sha256=UjsKAvrZkcYRgjVGGeg6XA4Lkx6WU9w6WTyeSkwN78w,6931
40
40
  sgis/networkanalysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  sgis/networkanalysis/_get_route.py,sha256=9I3t9pnccUPr4mozy3TJCOpGCCf3UOIojmsbifubZbA,6368
42
42
  sgis/networkanalysis/_od_cost_matrix.py,sha256=zkyPX7ObT996ahaFJ2oI0D0SqQWbWyfy_qLtXwValPg,3434
@@ -56,12 +56,12 @@ sgis/parallel/parallel.py,sha256=qPhCiL81SZNKnJqFrW-rHrJeZvC7jO9_FjxO0RMdEUo,400
56
56
  sgis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
57
  sgis/raster/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
58
  sgis/raster/base.py,sha256=tiZEuMcVK6hOm_aIjWhQ1WGshcjsxT1fFkuBSLFiMC0,7785
59
- sgis/raster/image_collection.py,sha256=wyrxb9HNzp916HKnsF7BuW6HzrGFU2zOyxRwLmytXog,126273
59
+ sgis/raster/image_collection.py,sha256=W5x4PsaOnXALAXTDj3q-X6TMVgVD9kyFXmFdJewe9lY,126533
60
60
  sgis/raster/indices.py,sha256=efJmgfPg_VuSzXFosXV661IendF8CwPFWtMhyP4TMUg,222
61
61
  sgis/raster/regex.py,sha256=kYhVpRYzoXutx1dSYmqMoselWXww7MMEsTPmLZwHjbM,3759
62
62
  sgis/raster/sentinel_config.py,sha256=nySDqn2R8M6W8jguoBeSAK_zzbAsqmaI59i32446FwY,1268
63
63
  sgis/raster/zonal.py,sha256=D4Gyptw-yOLTCO41peIuYbY-DANsJCG19xXDlf1QAz4,2299
64
- ssb_sgis-1.2.1.dist-info/LICENSE,sha256=np3IfD5m0ZUofn_kVzDZqliozuiO6wrktw3LRPjyEiI,1073
65
- ssb_sgis-1.2.1.dist-info/METADATA,sha256=yStXt7J5YdWyJVMZd8bnzCkYX2NbYb6kEerzS55BLAc,11740
66
- ssb_sgis-1.2.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
67
- ssb_sgis-1.2.1.dist-info/RECORD,,
64
+ ssb_sgis-1.2.3.dist-info/LICENSE,sha256=np3IfD5m0ZUofn_kVzDZqliozuiO6wrktw3LRPjyEiI,1073
65
+ ssb_sgis-1.2.3.dist-info/METADATA,sha256=14UzO4efbS_k7OMKyV7rCQjZknag0TTuwQ6sgaQvaww,11740
66
+ ssb_sgis-1.2.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
67
+ ssb_sgis-1.2.3.dist-info/RECORD,,