ssb-sgis 1.2.2__py3-none-any.whl → 1.2.4__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/__init__.py +1 -0
- sgis/geopandas_tools/cleaning.py +0 -1
- sgis/geopandas_tools/general.py +1 -1
- sgis/geopandas_tools/overlay.py +3 -1
- sgis/geopandas_tools/runners.py +47 -0
- sgis/io/dapla_functions.py +23 -6
- sgis/maps/explore.py +32 -35
- sgis/maps/legend.py +49 -43
- sgis/maps/map.py +117 -131
- sgis/maps/maps.py +2 -2
- sgis/maps/norge_i_bilder.json +410 -135
- sgis/maps/thematicmap.py +128 -47
- sgis/maps/wms.py +2 -1
- sgis/raster/image_collection.py +12 -6
- {ssb_sgis-1.2.2.dist-info → ssb_sgis-1.2.4.dist-info}/METADATA +1 -1
- {ssb_sgis-1.2.2.dist-info → ssb_sgis-1.2.4.dist-info}/RECORD +18 -18
- {ssb_sgis-1.2.2.dist-info → ssb_sgis-1.2.4.dist-info}/LICENSE +0 -0
- {ssb_sgis-1.2.2.dist-info → ssb_sgis-1.2.4.dist-info}/WHEEL +0 -0
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
|
-
"""
|
|
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
|
-
|
|
268
|
+
new_kwargs = {}
|
|
269
|
+
for key, value in self.kwargs.items():
|
|
239
270
|
if key not in MAP_KWARGS:
|
|
240
|
-
|
|
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,18 @@ 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
|
+
isnas.append(gdf[gdf[self._column].isna()])
|
|
300
|
+
self._gdfs[label] = gdf[gdf[self._column].notna()]
|
|
301
|
+
self._more_data[nan_label] = {
|
|
302
|
+
"gdf": pd.concat(isnas, ignore_index=True),
|
|
303
|
+
"color": self.nan_color,
|
|
304
|
+
"hatch": nan_hatch,
|
|
305
|
+
} | new_kwargs
|
|
306
|
+
self._gdf = pd.concat(self.gdfs.values(), ignore_index=True)
|
|
307
|
+
|
|
264
308
|
@property
|
|
265
309
|
def valid_keywords(self) -> set[str]:
|
|
266
310
|
"""List all valid keywords for the class initialiser."""
|
|
@@ -279,6 +323,52 @@ class ThematicMap(Map):
|
|
|
279
323
|
super().change_cmap(cmap, start, stop)
|
|
280
324
|
return self
|
|
281
325
|
|
|
326
|
+
def add_data(
|
|
327
|
+
self,
|
|
328
|
+
*,
|
|
329
|
+
color: str | None = None,
|
|
330
|
+
hatch: str | None = None,
|
|
331
|
+
**kwargs,
|
|
332
|
+
) -> "ThematicMap":
|
|
333
|
+
"""Add Geometric Data of a given color or hatch.
|
|
334
|
+
|
|
335
|
+
The geodata must be passed as keyword argument.
|
|
336
|
+
The keyword will be used as label in the legend.
|
|
337
|
+
|
|
338
|
+
Args:
|
|
339
|
+
color: Color of the data.
|
|
340
|
+
hatch: Hatch of the data. See https://matplotlib.org/stable/gallery/shapes_and_collections/hatch_style_reference.html.
|
|
341
|
+
**kwargs: Must include exactly one GeoDataFrame or object that can be converted to GeoDataFrame.
|
|
342
|
+
Additional kwargs are passed to geopandas.GeoDataFrame.plot and matplotlib.patches.Patch.
|
|
343
|
+
"""
|
|
344
|
+
new_kwargs = {}
|
|
345
|
+
n = 0
|
|
346
|
+
for key, value in kwargs.items():
|
|
347
|
+
try:
|
|
348
|
+
gdf = to_gdf(value)
|
|
349
|
+
label = key
|
|
350
|
+
n += 1
|
|
351
|
+
except Exception:
|
|
352
|
+
new_kwargs[key] = value
|
|
353
|
+
|
|
354
|
+
if n != 1:
|
|
355
|
+
raise ValueError(
|
|
356
|
+
"Must specify a single geometry object as keyword argument."
|
|
357
|
+
)
|
|
358
|
+
if not color and not hatch:
|
|
359
|
+
raise TypeError("Must pass either 'color' or 'hatch'.")
|
|
360
|
+
if hatch is not None:
|
|
361
|
+
color = self.facecolor
|
|
362
|
+
gdf["label"] = label
|
|
363
|
+
self._more_data[label] = {
|
|
364
|
+
"gdf": gdf,
|
|
365
|
+
"color": color,
|
|
366
|
+
"hatch": hatch,
|
|
367
|
+
} | new_kwargs
|
|
368
|
+
if self.bounds is None:
|
|
369
|
+
self.bounds = to_bbox(self._gdf.total_bounds)
|
|
370
|
+
return self
|
|
371
|
+
|
|
282
372
|
def add_background(
|
|
283
373
|
self,
|
|
284
374
|
gdf: GeoDataFrame,
|
|
@@ -327,11 +417,13 @@ class ThematicMap(Map):
|
|
|
327
417
|
include_legend = False
|
|
328
418
|
|
|
329
419
|
elif self._is_categorical:
|
|
330
|
-
|
|
420
|
+
self._prepare_categorical_plot()
|
|
421
|
+
if self._gdf is not None:
|
|
422
|
+
kwargs["color"] = self._gdf["color"]
|
|
331
423
|
if self.legend:
|
|
332
424
|
self.legend._prepare_categorical_legend(
|
|
333
425
|
categories_colors=self._categories_colors_dict,
|
|
334
|
-
|
|
426
|
+
hatch=self.hatch,
|
|
335
427
|
)
|
|
336
428
|
|
|
337
429
|
else:
|
|
@@ -339,19 +431,23 @@ class ThematicMap(Map):
|
|
|
339
431
|
if self.legend:
|
|
340
432
|
if not self.legend.rounding:
|
|
341
433
|
self.legend._rounding = self.legend._get_rounding(
|
|
342
|
-
array=self._gdf
|
|
434
|
+
array=self._gdf[self._column].dropna()
|
|
343
435
|
)
|
|
344
436
|
|
|
345
437
|
self.legend._prepare_continous_legend(
|
|
346
438
|
bins=self.bins,
|
|
347
439
|
colors=self._unique_colors,
|
|
348
|
-
nan_label=self.nan_label,
|
|
349
440
|
bin_values=self._bins_unique_values,
|
|
441
|
+
nan_label=self.nan_label,
|
|
442
|
+
hatch=self.hatch,
|
|
350
443
|
)
|
|
351
444
|
|
|
445
|
+
if self.legend and self._more_data:
|
|
446
|
+
self.legend._add_more_data_to_legend(self._more_data)
|
|
447
|
+
|
|
352
448
|
if self.legend and not self.legend._position_has_been_set:
|
|
353
449
|
self.legend._position = self.legend._get_best_legend_position(
|
|
354
|
-
self._gdf, k=self._k +
|
|
450
|
+
self._gdf, k=self._k + self._gdf[self._column].isna().any()
|
|
355
451
|
)
|
|
356
452
|
|
|
357
453
|
self._prepare_plot(**kwargs)
|
|
@@ -359,7 +455,9 @@ class ThematicMap(Map):
|
|
|
359
455
|
if self.legend:
|
|
360
456
|
self.ax = self.legend._actually_add_legend(ax=self.ax)
|
|
361
457
|
|
|
362
|
-
self.ax = self._gdf.plot(
|
|
458
|
+
self.ax = self._gdf.plot(
|
|
459
|
+
legend=include_legend, ax=self.ax, hatch=self.hatch, **kwargs
|
|
460
|
+
)
|
|
363
461
|
|
|
364
462
|
if __test:
|
|
365
463
|
return self
|
|
@@ -394,16 +492,17 @@ class ThematicMap(Map):
|
|
|
394
492
|
)
|
|
395
493
|
self.fig.patch.set_facecolor(self.facecolor)
|
|
396
494
|
self.ax.set_axis_off()
|
|
495
|
+
self.ax.set_xlim([self.minx - self.diffx * 0.03, self.maxx + self.diffx * 0.03])
|
|
496
|
+
self.ax.set_ylim([self.miny - self.diffy * 0.03, self.maxy + self.diffy * 0.03])
|
|
397
497
|
|
|
398
498
|
if hasattr(self, "_background_gdfs"):
|
|
399
499
|
self._actually_add_background()
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
)
|
|
500
|
+
# if self.bounds is not None:
|
|
501
|
+
|
|
502
|
+
for datadict in self._more_data.values():
|
|
503
|
+
gdf = datadict["gdf"]
|
|
504
|
+
datadict = {key: value for key, value in datadict.items() if key != "gdf"}
|
|
505
|
+
gdf.plot(ax=self.ax, **datadict)
|
|
407
506
|
|
|
408
507
|
if self.title:
|
|
409
508
|
self.ax.set_title(
|
|
@@ -437,7 +536,10 @@ class ThematicMap(Map):
|
|
|
437
536
|
|
|
438
537
|
classified = self._classify_from_bins(self._gdf, bins=self.bins)
|
|
439
538
|
classified_sequential = self._push_classification(classified)
|
|
440
|
-
n_colors =
|
|
539
|
+
n_colors = (
|
|
540
|
+
len(np.unique(classified_sequential))
|
|
541
|
+
- self._gdf[self._column].isna().any()
|
|
542
|
+
)
|
|
441
543
|
self._unique_colors = self._get_continous_colors(n=n_colors)
|
|
442
544
|
self._bins_unique_values = self._make_bin_value_dict(
|
|
443
545
|
self._gdf, classified_sequential
|
|
@@ -453,27 +555,16 @@ class ThematicMap(Map):
|
|
|
453
555
|
bins=self.bins, rounding=self.legend._rounding
|
|
454
556
|
)
|
|
455
557
|
|
|
456
|
-
if
|
|
558
|
+
if self._gdf[self._column].isna().any():
|
|
457
559
|
self.bins = self.bins + [self.nan_label]
|
|
458
560
|
|
|
459
561
|
return kwargs
|
|
460
562
|
|
|
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
563
|
def _actually_add_legend(self) -> None:
|
|
473
564
|
"""Add legend to the axis and fill it with colors and labels."""
|
|
474
565
|
if not self.legend._position_has_been_set:
|
|
475
566
|
self.legend._position = self.legend._get_best_legend_position(
|
|
476
|
-
self._gdf, k=self._k +
|
|
567
|
+
self._gdf, k=self._k + self._gdf[self._column].isna().any()
|
|
477
568
|
)
|
|
478
569
|
|
|
479
570
|
if self._is_categorical:
|
|
@@ -518,15 +609,15 @@ class ThematicMap(Map):
|
|
|
518
609
|
return bins_unique_values
|
|
519
610
|
|
|
520
611
|
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])
|
|
612
|
+
# self.ax.set_xlim([self.minx - self.diffx * 0.03, self.maxx + self.diffx * 0.03])
|
|
613
|
+
# self.ax.set_ylim([self.miny - self.diffy * 0.03, self.maxy + self.diffy * 0.03])
|
|
523
614
|
self._background_gdfs.plot(
|
|
524
615
|
ax=self.ax, color=self.bg_gdf_color, **self.bg_gdf_kwargs
|
|
525
616
|
)
|
|
526
617
|
|
|
527
618
|
@staticmethod
|
|
528
619
|
def _get_matplotlib_figure_and_axix(
|
|
529
|
-
figsize: tuple[int, int]
|
|
620
|
+
figsize: tuple[int, int],
|
|
530
621
|
) -> tuple[matplotlib.figure.Figure, matplotlib.axes.Axes]:
|
|
531
622
|
fig = plt.figure(figsize=figsize)
|
|
532
623
|
ax = fig.add_subplot(1, 1, 1)
|
|
@@ -539,7 +630,7 @@ class ThematicMap(Map):
|
|
|
539
630
|
"#fefefe",
|
|
540
631
|
"#383836",
|
|
541
632
|
)
|
|
542
|
-
self.nan_color = "#666666"
|
|
633
|
+
self.nan_color = "#666666" if self._nan_color_was_none else self.nan_color
|
|
543
634
|
if not self._is_categorical:
|
|
544
635
|
self.change_cmap("viridis")
|
|
545
636
|
|
|
@@ -557,7 +648,7 @@ class ThematicMap(Map):
|
|
|
557
648
|
"#0f0f0f",
|
|
558
649
|
"#e8e6e6",
|
|
559
650
|
)
|
|
560
|
-
self.nan_color = "#c2c2c2"
|
|
651
|
+
self.nan_color = "#c2c2c2" if self._nan_color_was_none else self.nan_color
|
|
561
652
|
if not self._is_categorical:
|
|
562
653
|
self.change_cmap("RdPu", start=23)
|
|
563
654
|
|
|
@@ -569,16 +660,6 @@ class ThematicMap(Map):
|
|
|
569
660
|
}.items():
|
|
570
661
|
setattr(self.legend, key, color)
|
|
571
662
|
|
|
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
663
|
@property
|
|
583
664
|
def title_fontsize(self) -> int:
|
|
584
665
|
"""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)
|
sgis/raster/image_collection.py
CHANGED
|
@@ -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
|
|
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] = (
|
|
3139
|
-
filename_regexes: ClassVar[str] = (
|
|
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] = (
|
|
3226
|
-
filename_regexes: ClassVar[str] = (
|
|
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,4 +1,4 @@
|
|
|
1
|
-
sgis/__init__.py,sha256=
|
|
1
|
+
sgis/__init__.py,sha256=FcE8XYmVlyO-6s15AC8dLqIjp2KZpar2ND3siIxX830,7747
|
|
2
2
|
sgis/conf.py,sha256=pLqmvIKoKmXoW8chja3iQpbDUp9Z39vzl97MGH8ZHW0,2614
|
|
3
3
|
sgis/debug_config.py,sha256=Tfr19kU46hSkkspsIJcrUWvlhaL4U3-f8xEPkujSCAQ,593
|
|
4
4
|
sgis/exceptions.py,sha256=WNaEBPNNx0rmz-YDzlFX4vIE7ocJQruUTqS2RNAu2zU,660
|
|
@@ -6,37 +6,37 @@ sgis/geopandas_tools/__init__.py,sha256=bo8lFMcltOz7TtWAi52_ekR2gd3mjfBfKeMDV5zu
|
|
|
6
6
|
sgis/geopandas_tools/bounds.py,sha256=YJyF0gp78hFAjLLZmDquRKCBAtbt7QouG3snTcJeNQs,23822
|
|
7
7
|
sgis/geopandas_tools/buffer_dissolve_explode.py,sha256=ReIgoeh6CUVcLmsUZ_pyoWYg6iBZzYiGmFq6CMOKRvE,19535
|
|
8
8
|
sgis/geopandas_tools/centerlines.py,sha256=Q65Sx01SeAlulBEd9oaZkB2maBBNdLcJwAbTILg4SPU,11848
|
|
9
|
-
sgis/geopandas_tools/cleaning.py,sha256=
|
|
9
|
+
sgis/geopandas_tools/cleaning.py,sha256=fST0xFztmyn-QUOAfvjZmu7aO_zPiolWK7gd7TR6ffI,24393
|
|
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=
|
|
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=
|
|
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
|
|
20
|
-
sgis/geopandas_tools/runners.py,sha256=
|
|
20
|
+
sgis/geopandas_tools/runners.py,sha256=J4lH0RXYDYTLVeQFgNv8gEY0E97QGIQ4zPW5vfoxgDU,12979
|
|
21
21
|
sgis/geopandas_tools/sfilter.py,sha256=BPz6-_9B7QdyYmVatZXavdHj7FIW_ztIyJHQOkKJt7A,10284
|
|
22
22
|
sgis/geopandas_tools/utils.py,sha256=X0pRvB1tWgV_0BCrRS1HU9LtLGnZCpvVPxyqM9JGb0Y,1415
|
|
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=
|
|
26
|
+
sgis/io/dapla_functions.py,sha256=AbP400wE8wd3KhfoX_BoEC6ba9fR0gCg8qWSqdkJ5dU,30815
|
|
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=
|
|
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=
|
|
34
|
-
sgis/maps/map.py,sha256=
|
|
35
|
-
sgis/maps/maps.py,sha256=
|
|
36
|
-
sgis/maps/norge_i_bilder.json,sha256=
|
|
37
|
-
sgis/maps/thematicmap.py,sha256=
|
|
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=Z3o_Bca0oty5Cn35pZfX5Qy52sXDVIMVSFD6IlZrovo,25111
|
|
38
38
|
sgis/maps/tilesources.py,sha256=F4mFHxPwkiPJdVKzNkScTX6xbJAMIUtlTq4mQ83oguw,1746
|
|
39
|
-
sgis/maps/wms.py,sha256=
|
|
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=
|
|
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.
|
|
65
|
-
ssb_sgis-1.2.
|
|
66
|
-
ssb_sgis-1.2.
|
|
67
|
-
ssb_sgis-1.2.
|
|
64
|
+
ssb_sgis-1.2.4.dist-info/LICENSE,sha256=np3IfD5m0ZUofn_kVzDZqliozuiO6wrktw3LRPjyEiI,1073
|
|
65
|
+
ssb_sgis-1.2.4.dist-info/METADATA,sha256=0vA7hJ78jGcP1uHtgeeNYN-Ne_9xZQ_fX3SRamcESxw,11740
|
|
66
|
+
ssb_sgis-1.2.4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
67
|
+
ssb_sgis-1.2.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|