ssb-sgis 0.3.7__py3-none-any.whl → 0.3.9__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/parallel/parallel.py CHANGED
@@ -1,9 +1,11 @@
1
1
  import functools
2
+ import inspect
2
3
  import itertools
3
4
  import multiprocessing
5
+ from collections.abc import Callable, Collection, Iterable
4
6
  from pathlib import Path
5
7
  from typing import Any
6
- from collections.abc import Collection, Callable, Iterable
8
+
7
9
 
8
10
  try:
9
11
  import dapla as dp
@@ -20,12 +22,19 @@ from ..helpers import LocalFunctionError, dict_zip, dict_zip_union, in_jupyter
20
22
 
21
23
 
22
24
  try:
23
- from ..io.dapla import exists, read_geopandas
25
+ from ..io.dapla_functions import exists, read_geopandas
24
26
  from ..io.write_municipality_data import write_municipality_data
25
27
  except ImportError:
26
28
  pass
27
29
 
28
30
 
31
+ def turn_args_into_kwargs(func: Callable, args: tuple, index_start: int):
32
+ if not isinstance(args, tuple):
33
+ raise TypeError("args should be a tuple (it should not be unpacked with *)")
34
+ argnames = inspect.getfullargspec(func).args[index_start:]
35
+ return {name: value for value, name in zip(args, argnames, strict=False)}
36
+
37
+
29
38
  class Parallel:
30
39
  """Run functions in parallell.
31
40
 
@@ -51,9 +60,13 @@ class Parallel:
51
60
  offered through joblib's Parallel class.
52
61
  context: Start method for the processes. Defaults to 'spawn'
53
62
  to avoid frozen processes.
63
+ maxtasksperchild: Number of tasks a worker process can complete before
64
+ it will exit and be replaced with a fresh worker process, to enable
65
+ unused resources to be freed. Defaults to 10 to
54
66
  **kwargs: Keyword arguments to be passed to either
55
67
  multiprocessing.Pool or joblib.Parallel, depending
56
- on the backend.
68
+ on the backend. Not to be confused with the kwargs passed to functions in
69
+ the map and starmap methods.
57
70
  """
58
71
 
59
72
  def __init__(
@@ -61,9 +74,11 @@ class Parallel:
61
74
  processes: int,
62
75
  backend: str = "multiprocessing",
63
76
  context: str = "spawn",
77
+ maxtasksperchild: int = 10,
64
78
  **kwargs,
65
79
  ):
66
80
  self.processes = int(processes)
81
+ self.maxtasksperchild = maxtasksperchild
67
82
  self.backend = backend
68
83
  self.context = context
69
84
  self.kwargs = kwargs
@@ -74,14 +89,17 @@ class Parallel:
74
89
  self,
75
90
  func: Callable,
76
91
  iterable: Collection,
92
+ args: tuple | None = None,
77
93
  kwargs: dict | None = None,
78
94
  ) -> list[Any]:
79
- """Run functions in parallel with items of an iterable as first arguemnt.
95
+ """Run functions in parallel with items of an iterable as 0th arguemnt.
80
96
 
81
97
  Args:
82
98
  func: Function to be run.
83
99
  iterable: An iterable where each item will be passed to func as
84
- first positional argument.
100
+ 0th positional argument.
101
+ Args: Positional arguments passed to 'func' starting from the 1st argument.
102
+ The 0th argument will be reserved for the values of 'iterable'.
85
103
  kwargs: Keyword arguments passed to 'func'. Must be passed as a dict,
86
104
  not unpacked into separate keyword arguments.
87
105
 
@@ -101,14 +119,21 @@ class Parallel:
101
119
  >>> results
102
120
  [2, 4, 6]
103
121
 
104
- With kwargs.
122
+ With args and kwargs.
105
123
 
106
124
  >>> iterable = [1, 2, 3]
107
125
  >>> def x2(x, plus, minus):
108
126
  ... return x * 2 + plus - minus
109
127
  >>> p = sg.Parallel(4, backend="loky")
110
- >>> results = p.map(x2, iterable, kwargs=dict(plus=2, minus=1))
111
- >>> results
128
+ ...
129
+ >>> # these three are the same
130
+ >>> results1 = p.map(x2, iterable, args=(2, 1))
131
+ >>> results2 = p.map(x2, iterable, kwargs=dict(plus=2, minus=1))
132
+ >>> results3 = p.map(x2, iterable, args=(2,), kwargs=dict(minus=1))
133
+ >>> assert results1 == results2 == results3
134
+ ...
135
+ >>> results1
136
+ [3, 5, 7]
112
137
 
113
138
  If in Jupyter the function should be defined in another module.
114
139
  And if using the multiprocessing backend, the code should be
@@ -122,9 +147,15 @@ class Parallel:
122
147
  [2, 4, 6]
123
148
  """
124
149
 
150
+ if args:
151
+ # start at index 1, meaning the 0th argument (the iterable) is still available
152
+ args_as_kwargs = turn_args_into_kwargs(func, args, index_start=1)
153
+ else:
154
+ args_as_kwargs = {}
155
+
125
156
  self.validate_execution(func)
126
157
 
127
- kwargs = self._validate_kwargs(kwargs)
158
+ kwargs = self._validate_kwargs(kwargs) | args_as_kwargs
128
159
 
129
160
  func_with_kwargs = functools.partial(func, **kwargs)
130
161
 
@@ -141,7 +172,7 @@ class Parallel:
141
172
 
142
173
  if self.backend == "multiprocessing":
143
174
  with multiprocessing.get_context(self.context).Pool(
144
- processes, **self.kwargs
175
+ processes, maxtasksperchild=self.maxtasksperchild, **self.kwargs
145
176
  ) as pool:
146
177
  return pool.map(func_with_kwargs, iterable)
147
178
 
@@ -154,6 +185,7 @@ class Parallel:
154
185
  self,
155
186
  func: Callable,
156
187
  iterable: Collection[Iterable[Any]],
188
+ args: tuple | None = None,
157
189
  kwargs: dict | None = None,
158
190
  ) -> list[Any]:
159
191
  """Run functions in parallel where items of the iterable are unpacked.
@@ -165,6 +197,8 @@ class Parallel:
165
197
  func: Function to be run.
166
198
  iterable: An iterable of iterables, where each item will be
167
199
  unpacked as positional argument to the function.
200
+ Args: Positional arguments passed to 'func' starting at argument position
201
+ n + 1, where n is the length of the iterables inside the iterable.
168
202
  kwargs: Keyword arguments passed to 'func'. Must be passed as a dict,
169
203
  not unpacked into separate keyword arguments.
170
204
 
@@ -184,6 +218,17 @@ class Parallel:
184
218
  >>> results
185
219
  [3, 5, 7]
186
220
 
221
+ With args and kwargs. Since the iterables inside 'iterable' are of length 2,
222
+ 'args' will start at argument number three, e.i. 'c'.
223
+
224
+ >>> iterable = [(1, 2), (2, 3), (3, 4)]
225
+ >>> def add(a, b, c, *, d):
226
+ ... return a + b + c + d
227
+ >>> p = sg.Parallel(3, backend="loky")
228
+ >>> results = p.starmap(add, iterable, args=(1,), kwargs={"d": 0.1})
229
+ >>> results
230
+ [4.1, 6.1, 8.1]
231
+
187
232
  If in Jupyter the function should be defined in another module.
188
233
  And if using the multiprocessing backend, the code should be
189
234
  guarded by if __name__ == "__main__".
@@ -196,9 +241,18 @@ class Parallel:
196
241
  [3, 5, 7]
197
242
 
198
243
  """
244
+ if args:
245
+ # starting the count at the length of the iterables inside the iterables
246
+ iterable = list(iterable)
247
+ args_as_kwargs = turn_args_into_kwargs(
248
+ func, args, index_start=len(iterable[0])
249
+ )
250
+ else:
251
+ args_as_kwargs = {}
252
+
199
253
  self.validate_execution(func)
200
254
 
201
- kwargs = self._validate_kwargs(kwargs)
255
+ kwargs = self._validate_kwargs(kwargs) | args_as_kwargs
202
256
 
203
257
  func_with_kwargs = functools.partial(func, **kwargs)
204
258
 
@@ -215,7 +269,7 @@ class Parallel:
215
269
 
216
270
  if self.backend == "multiprocessing":
217
271
  with multiprocessing.get_context(self.context).Pool(
218
- processes, **self.kwargs
272
+ processes, maxtasksperchild=self.maxtasksperchild, **self.kwargs
219
273
  ) as pool:
220
274
  return pool.starmap(func_with_kwargs, iterable)
221
275
 
sgis/raster/raster.py CHANGED
@@ -2,10 +2,10 @@ import numbers
2
2
  import re
3
3
  import uuid
4
4
  import warnings
5
+ from collections.abc import Callable
5
6
  from copy import copy, deepcopy
6
7
  from json import loads
7
8
  from pathlib import Path
8
- from collections.abc import Callable
9
9
 
10
10
  import geopandas as gpd
11
11
  import matplotlib.pyplot as plt
@@ -73,18 +73,18 @@ class Raster(RasterBase):
73
73
 
74
74
  Read tif file.
75
75
 
76
- >>> path = 'https://media.githubusercontent.com/media/statisticsnorway/ssb-sgis/main/tests/testdata/dtm_10.tif'
76
+ >>> path = 'https://media.githubusercontent.com/media/statisticsnorway/ssb-sgis/main/tests/testdata/raster/dtm_10.tif'
77
77
  >>> raster = sg.Raster.from_path(path)
78
78
  >>> raster
79
- Raster(shape=(1, 201, 201), res=10, crs=ETRS89 / UTM zone 33N (N-E), path=https://media.githubusercontent.com/media/statisticsnorway/ssb-sgis/main/tests/testdata/dtm_10.tif)
79
+ Raster(shape=(1, 201, 201), res=10, crs=ETRS89 / UTM zone 33N (N-E), path=https://media.githubusercontent.com/media/statisticsnorway/ssb-sgis/main/tests/testdata/raster/dtm_10.tif)
80
80
 
81
81
  Load the entire image as an numpy ndarray.
82
82
  Operations are done in place to save memory.
83
83
  The array is stored in the array attribute.
84
84
 
85
- >>> r.load()
86
- >>> r.array[r.array < 0] = 0
87
- >>> r.array
85
+ >>> raster.load()
86
+ >>> raster.array[raster.array < 0] = 0
87
+ >>> raster.array
88
88
  [[[ 0. 0. 0. ... 158.4 155.6 152.6]
89
89
  [ 0. 0. 0. ... 158. 154.8 151.9]
90
90
  [ 0. 0. 0. ... 158.5 155.1 152.3]
@@ -95,41 +95,43 @@ class Raster(RasterBase):
95
95
 
96
96
  Save as tif file.
97
97
 
98
- >>> r.write("path/to/file.tif")
98
+ >>> raster.write("path/to/file.tif")
99
99
 
100
100
  Convert to GeoDataFrame.
101
101
 
102
- >>> gdf = r.to_gdf(column="elevation")
102
+ >>> gdf = raster.to_gdf(column="elevation")
103
103
  >>> gdf
104
- elevation geometry band
105
- 0 1.9 POLYGON ((-25665.000 6676005.000, -25665.000 6... 1
106
- 1 11.0 POLYGON ((-25655.000 6676005.000, -25655.000 6... 1
107
- 2 18.1 POLYGON ((-25645.000 6676005.000, -25645.000 6... 1
108
- 3 15.8 POLYGON ((-25635.000 6676005.000, -25635.000 6... 1
109
- 4 11.6 POLYGON ((-25625.000 6676005.000, -25625.000 6... 1
110
- ... ... ... ...
111
- 25096 13.4 POLYGON ((-24935.000 6674005.000, -24935.000 6... 1
112
- 25097 9.4 POLYGON ((-24925.000 6674005.000, -24925.000 6... 1
113
- 25098 5.3 POLYGON ((-24915.000 6674005.000, -24915.000 6... 1
114
- 25099 2.3 POLYGON ((-24905.000 6674005.000, -24905.000 6... 1
115
- 25100 0.1 POLYGON ((-24895.000 6674005.000, -24895.000 6... 1
104
+ elevation geometry band_index
105
+ 0 1.9 POLYGON ((-25665.000 6676005.000, -25665.000 6... 1
106
+ 1 11.0 POLYGON ((-25655.000 6676005.000, -25655.000 6... 1
107
+ 2 18.1 POLYGON ((-25645.000 6676005.000, -25645.000 6... 1
108
+ 3 15.8 POLYGON ((-25635.000 6676005.000, -25635.000 6... 1
109
+ 4 11.6 POLYGON ((-25625.000 6676005.000, -25625.000 6... 1
110
+ ... ... ... ...
111
+ 25096 13.4 POLYGON ((-24935.000 6674005.000, -24935.000 6... 1
112
+ 25097 9.4 POLYGON ((-24925.000 6674005.000, -24925.000 6... 1
113
+ 25098 5.3 POLYGON ((-24915.000 6674005.000, -24915.000 6... 1
114
+ 25099 2.3 POLYGON ((-24905.000 6674005.000, -24905.000 6... 1
115
+ 25100 0.1 POLYGON ((-24895.000 6674005.000, -24895.000 6... 1
116
116
 
117
117
  The image can also be clipped by a mask while loading.
118
118
 
119
- >>> small_circle = gdf.centroid.buffer(50)
120
- >>> raster = sg.Raster.from_path(path).clip(small_circle, crop=True)
121
- Raster(shape=(1, 11, 11), res=10, crs=ETRS89 / UTM zone 33N (N-E), path=https://media.githubusercontent.com/media/statisticsnorway/ssb-sgis/main/tests/testdata/dtm_10.tif)
119
+ >>> small_circle = raster_as_polygons.unary_union.centroid.buffer(50)
120
+ >>> raster = sg.Raster.from_path(path).clip(small_circle)
121
+ Raster(shape=(1, 10, 10), res=10, crs=ETRS89 / UTM zone 33N (N-E), path=https://media.githubusercontent.com/media/statisticsnorway/ssb-sgis/main/tests/testdata/raster/dtm_10.tif)
122
122
 
123
123
  Construct raster from GeoDataFrame.
124
124
  The arrays are put on top of each other in a 3 dimensional array.
125
125
 
126
- >>> r2 = r.from_gdf(gdf, columns=["elevation", "elevation_x2"], res=20)
127
- >>> r2
128
- Raster(shape=(2, 100, 100), res=20, crs=ETRS89 / UTM zone 33N (N-E), path=None)
126
+ >>> raster_as_polygons["elevation_x2"] = raster_as_polygons["elevation"] * 2
127
+ >>> raster_from_polygons = sg.Raster.from_gdf(raster_as_polygons, columns=["elevation", "elevation_x2"], res=20)
128
+ >>> raster_from_polygons
129
+ Raster(shape=(2, 100, 100), res=20, raster_id=-260056673995, crs=ETRS89 / UTM zone 33N (N-E), path=None)
129
130
 
130
131
  Calculate zonal statistics for each polygon in 'gdf'.
131
132
 
132
- >>> zonal = r.zonal(gdf, aggfunc=["sum", np.mean])
133
+ >>> zonal = raster.zonal(raster_as_polygons, aggfunc=["sum", np.mean])
134
+ >>> zonal
133
135
  sum mean geometry
134
136
  0 1.9 1.9 POLYGON ((-25665.000 6676005.000, -25665.000 6...
135
137
  1 11.0 11.0 POLYGON ((-25655.000 6676005.000, -25655.000 6...
@@ -1,17 +1,18 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ssb-sgis
3
- Version: 0.3.7
3
+ Version: 0.3.9
4
4
  Summary: GIS functions used at Statistics Norway.
5
5
  Home-page: https://github.com/statisticsnorway/ssb-sgis
6
6
  License: MIT
7
7
  Author: Statistics Norway
8
8
  Author-email: ort@ssb.no
9
- Requires-Python: >=3.10,<3.12
9
+ Requires-Python: >=3.10,<4
10
10
  Classifier: Development Status :: 3 - Alpha
11
11
  Classifier: License :: OSI Approved :: MIT License
12
12
  Classifier: Programming Language :: Python :: 3
13
13
  Classifier: Programming Language :: Python :: 3.10
14
14
  Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
15
16
  Classifier: Topic :: Scientific/Engineering :: GIS
16
17
  Requires-Dist: branca (>=0.6.0)
17
18
  Requires-Dist: folium (>=0.14.0)
@@ -44,6 +45,8 @@ Description-Content-Type: text/markdown
44
45
 
45
46
  GIS Python tools used in [Statistics Norway](https://www.ssb.no/en).
46
47
 
48
+ See documentation [here](https://statisticsnorway.github.io/ssb-sgis/reference/index.html).
49
+
47
50
  [![PyPI](https://img.shields.io/pypi/v/ssb-sgis.svg)][pypi_]
48
51
  [![Status](https://img.shields.io/pypi/status/ssb-sgis.svg)][status]
49
52
  [![Python Version](https://img.shields.io/pypi/pyversions/ssb-sgis)][python version]
@@ -88,7 +91,7 @@ roads = sg.read_parquet_url(
88
91
  "https://media.githubusercontent.com/media/statisticsnorway/ssb-sgis/main/tests/testdata/roads_oslo_2022.parquet"
89
92
  )
90
93
 
91
- connected_roads = sg.get_connected_components(roads).query("connected == 1")
94
+ connected_roads = sg.get_connected_components(roads).loc[lambda x: x["connected"] == 1]
92
95
 
93
96
  directed_roads = sg.make_directed_network_norway(
94
97
  connected_roads,
@@ -0,0 +1,59 @@
1
+ sgis/__init__.py,sha256=L27d20iJn8LBWwmE7raQy8DWKr8b6eAuTdj22QAVIww,3601
2
+ sgis/exceptions.py,sha256=ztMp4sB9xxPvwj2IEsO5kOaB4FmHuU_7-M2pZ7qaxTs,576
3
+ sgis/geopandas_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ sgis/geopandas_tools/bounds.py,sha256=7REImJZQq35BmvznCcih92mzrVYmX43pIznA8PTeU6Y,17616
5
+ sgis/geopandas_tools/buffer_dissolve_explode.py,sha256=5y6tZlp2-4uYHylD2BBqY95BVRi5-y6H3RIf-jGUCvc,12166
6
+ sgis/geopandas_tools/centerlines.py,sha256=96jZpORHm-As4MoT8ImHPCoq2UDyBhKKw98a84Qes-A,14142
7
+ sgis/geopandas_tools/cleaning.py,sha256=QMG4m3itM0GSwR3QsSOhD_eHhzC-yVFa7JuS85aDAdo,11548
8
+ sgis/geopandas_tools/conversion.py,sha256=xogsnMDOrlMj2fS1mYEpYLOXvDT6UC993Dd_yfnHIqw,17242
9
+ sgis/geopandas_tools/duplicates.py,sha256=GuplKTQ7lRz0jtzWyTGVcSDieX6i8Aswt9Kh_W_DR4g,10422
10
+ sgis/geopandas_tools/general.py,sha256=M0Axq4GDRuxuAlZjZTNF2DQVp7dN9uquI6LZ-1q_bYw,18649
11
+ sgis/geopandas_tools/geocoding.py,sha256=n47aFQMm4yX1MsPnTM4dFjwegCA1ZmGUDj1uyu7OJV4,691
12
+ sgis/geopandas_tools/geometry_types.py,sha256=9kv-CZFDp98QJykhkY1ZTT7gaH3s1-Q3FcozEFk4mvk,7147
13
+ sgis/geopandas_tools/neighbors.py,sha256=7jtO1ZWv71Gj0sI5OdbrfqhVqAHiHkkzxvBUZEn8M80,15047
14
+ sgis/geopandas_tools/overlay.py,sha256=iLI92P_ZN7OIWkSmFLzoJPs_RkiTMdM4zWwjwhu2hFQ,14693
15
+ sgis/geopandas_tools/point_operations.py,sha256=Cpa02sf_W8nI6FvzJGO9jNM_ZOwIz8nDhKxNdQTqom4,6897
16
+ sgis/geopandas_tools/polygon_operations.py,sha256=VIZaHvxL-ucV5xaXLbDdZP9JMOM1qFWQ_91_KP24N2A,35737
17
+ sgis/geopandas_tools/polygons_as_rings.py,sha256=4NzdEuGD9BXKuXxcDEMt-qIoxmdq-nuwKqfjxdW3fJA,10276
18
+ sgis/geopandas_tools/sfilter.py,sha256=LVTWRPbY2TNngubSTmdNpZjdP-E9CbMKU1oDrBYnhYQ,8513
19
+ sgis/helpers.py,sha256=JG6Px77gNH7p3GqCyGQlu1z0wuUcxdho4VtfCfcr1-s,6066
20
+ sgis/io/_is_dapla.py,sha256=TZhVjrSfNmpNSRbt2C7L8OHXWnlmJ2euNX8IUY7xAjI,459
21
+ sgis/io/dapla_functions.py,sha256=16-1WzKqa2l3hWL2uJOLHnhOLdm_iIPkH6rN44SO0ek,7622
22
+ sgis/io/opener.py,sha256=Y5CzWFCJz_XweBTEHVysLOKhSEEXdrPsBk_7a63XmBg,538
23
+ sgis/io/read_parquet.py,sha256=GSW2NDy4-XosbamPEzB1xhWxFAPHuGEJZglfQ-V6DzY,3774
24
+ sgis/io/write_municipality_data.py,sha256=-EDUP6TcQCVEUT8XVwYVcqhYkzoltu9PpbjTTf8-afE,6457
25
+ sgis/maps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ sgis/maps/examine.py,sha256=UwGOuVnmO0nmnQm-7TSJQQs1AT1YW7RVA7w-kh56O7c,8073
27
+ sgis/maps/explore.py,sha256=_YhRF6PiwQcfmVrYZr0Lk4rKKq_2Dz3Cv7Txlk-C4kQ,27857
28
+ sgis/maps/httpserver.py,sha256=z9D66SizO9GIZKaSLIqpFWnwOZZh-kiuVPjFt3WZr8o,1902
29
+ sgis/maps/legend.py,sha256=buHo_UwzPYHIs7kS6H_xETekIR8m9R4PACXfTTMYQWE,20680
30
+ sgis/maps/map.py,sha256=Ba0xp_DJhT9QYTIfwsMphEyrd2oL_ReDEAt-s6tcfm0,22806
31
+ sgis/maps/maps.py,sha256=p8ksh-pkUxGtDwkVKq8zVghGokXLapqbencMi1YGlOg,18197
32
+ sgis/maps/thematicmap.py,sha256=6aVPciftW1YjxjRVQDipxayl3aI3tHpYiZ3HfpnSavc,14132
33
+ sgis/maps/tilesources.py,sha256=gGqNJ4d0PkIP72lZe2c5OMJsxJHz2DVsczw7QSjn96M,2733
34
+ sgis/networkanalysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ sgis/networkanalysis/_get_route.py,sha256=qWnMabeyIdCKOlnFYNYQUrnl_iBdSSequtsbWAbPIM4,6308
36
+ sgis/networkanalysis/_od_cost_matrix.py,sha256=6plN-cpGib8RL7_LhMxo09RJOMR2mjj7M02T4NgLnCA,2151
37
+ sgis/networkanalysis/_points.py,sha256=aQzn_E_-N-hbtoWMxOzm3PFiwO3O0_AUk9-EOoay_24,4206
38
+ sgis/networkanalysis/_service_area.py,sha256=7bOf1I6yzDJMQxYFCtjQw9lpW7YNStVbX8z-QS8Nyec,5336
39
+ sgis/networkanalysis/closing_network_holes.py,sha256=L7g5Z7qr9oH8JaJ8oqDNrkg2bwAcgh0tuXZCB_1MfGg,13329
40
+ sgis/networkanalysis/cutting_lines.py,sha256=SiEJXIBMJvBBsHgT_FwV5h97i0Z2TFNwSh1dMS93KQQ,14267
41
+ sgis/networkanalysis/directednetwork.py,sha256=2l_qBH7wyEd3HMBfMG_0i_xyHUFKbyB1vTDRYI3olnA,11217
42
+ sgis/networkanalysis/finding_isolated_networks.py,sha256=IZWWotvnvxSgK5lXtByiynL13aWJRPl1HhNpyf0ddSU,3370
43
+ sgis/networkanalysis/network.py,sha256=UvPPIEfZCjoLBIyHFuSsWXYarku2l3CHrkhX3iiGkl4,7686
44
+ sgis/networkanalysis/networkanalysis.py,sha256=raz5T5Va5xvnLJC7tNkPx57ZUIdm1aEeqMMpOZPGDqQ,67276
45
+ sgis/networkanalysis/networkanalysisrules.py,sha256=UMSo5-a8OF-0yzDgjxNcU0TpMjOpVrqrejgHikMRsXU,12607
46
+ sgis/networkanalysis/nodes.py,sha256=p87X0JRrxL7XGEDWe4K6meWqKqZMD2f_jM6zptuBRRQ,6844
47
+ sgis/networkanalysis/traveling_salesman.py,sha256=UBa4ZPwcAgUeqgYt-Uvr_2g3BKsOvNfTfvKMGjoRuTY,5558
48
+ sgis/parallel/parallel.py,sha256=sE6SPKb0-Wo9trn769N9kLc_WOYWxUSl7lAdSQidumk,16050
49
+ sgis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
+ sgis/raster/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
+ sgis/raster/base.py,sha256=FOXdHl6yT9ge-Ofk4UreeN6LUBL6inNIExGGD1OHF0s,5385
52
+ sgis/raster/elevationraster.py,sha256=yrE6dg0NgJp0KmrJqdygF74tKbnnwgLQ4rfwBELCYSY,2867
53
+ sgis/raster/raster.py,sha256=ZwtHpG86xwy83tz3Xhi72ZGuAX0_hIo6FAL_8j4VvYo,40862
54
+ sgis/raster/sentinel.py,sha256=0x1HwebRRTCExmsMAXwnct23eMXDBj_KHz8CoP0NOxI,1025
55
+ sgis/raster/zonal.py,sha256=P2bJ8Uvnrc4U1JbyBsKEhjGNaU4FOvRNmxOOF9EzM34,3249
56
+ ssb_sgis-0.3.9.dist-info/LICENSE,sha256=lL2h0dNKGTKAE0CjTy62SDbRennVD1xPgM5LzGqhKeo,1074
57
+ ssb_sgis-0.3.9.dist-info/METADATA,sha256=2ovVu6h0d07YqCoDVaPVvXzA2xEBico1uOzhuGMDs8I,9163
58
+ ssb_sgis-0.3.9.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
59
+ ssb_sgis-0.3.9.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.7.0
2
+ Generator: poetry-core 1.8.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
File without changes
@@ -1,58 +0,0 @@
1
- sgis/__init__.py,sha256=mvhHbxLAYQfaI-1-M4X85JvCZxRGiEGnBXNKaFaOcpE,3448
2
- sgis/exceptions.py,sha256=ztMp4sB9xxPvwj2IEsO5kOaB4FmHuU_7-M2pZ7qaxTs,576
3
- sgis/geopandas_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- sgis/geopandas_tools/bounds.py,sha256=7REImJZQq35BmvznCcih92mzrVYmX43pIznA8PTeU6Y,17616
5
- sgis/geopandas_tools/buffer_dissolve_explode.py,sha256=8cyI6Hdc6n2k0wNKN4l5wHJ1k_UUjbNy-aMberXh9Kw,11997
6
- sgis/geopandas_tools/centerlines.py,sha256=9pejh7K34MfANTGxt2Lk4Ras1SJChWS20VuyZCPZ1aA,11762
7
- sgis/geopandas_tools/conversion.py,sha256=QOgPN4QQEn9N3vS4gRARVROMrXl7ojZyuYg1VsamYf0,16963
8
- sgis/geopandas_tools/duplicates.py,sha256=HO-AeZzG95hJvoNVlx7G8IvzB_jfoJpnXDhbVqKbfhU,9741
9
- sgis/geopandas_tools/general.py,sha256=TD9zY3Ogn0GbBQyUHlYddt8P8aL1_nY0wuaCDbf80mI,18181
10
- sgis/geopandas_tools/geocoding.py,sha256=n47aFQMm4yX1MsPnTM4dFjwegCA1ZmGUDj1uyu7OJV4,691
11
- sgis/geopandas_tools/geometry_types.py,sha256=9kv-CZFDp98QJykhkY1ZTT7gaH3s1-Q3FcozEFk4mvk,7147
12
- sgis/geopandas_tools/neighbors.py,sha256=NfxWGA_itbs0vaqhCefqyhEKsS4uf-f6TZERPN9KJrM,14735
13
- sgis/geopandas_tools/overlay.py,sha256=x-kQ3V_SEzcivYHUYIYAviheD637jXaK-7dqeEwyQao,14423
14
- sgis/geopandas_tools/point_operations.py,sha256=Cpa02sf_W8nI6FvzJGO9jNM_ZOwIz8nDhKxNdQTqom4,6897
15
- sgis/geopandas_tools/polygon_operations.py,sha256=OxKuMqlvpHmFX5fRB9anx_8szK8-UuJEoWPyUyDN_Y0,28679
16
- sgis/geopandas_tools/polygons_as_rings.py,sha256=Om0VJZVr1Kafzd8YeEIoiLhUCRpzAwNaJZ0vyajJ72I,8219
17
- sgis/geopandas_tools/sfilter.py,sha256=kN7Pdrm6-xFknrnH5YbS4sTBT7EEIjcR5ts7EE4sbms,8434
18
- sgis/geopandas_tools/snap_polygons.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- sgis/helpers.py,sha256=vcJCYIe35keVQdNqYjGz57f06a2Qs61YC3LbBceDTfE,5580
20
- sgis/io/_is_dapla.py,sha256=TZhVjrSfNmpNSRbt2C7L8OHXWnlmJ2euNX8IUY7xAjI,459
21
- sgis/io/dapla.py,sha256=N9JX4tFVcDmqQj5rwkM7B5zXiETgBsl1nTWGCwP7NTE,6970
22
- sgis/io/opener.py,sha256=Y5CzWFCJz_XweBTEHVysLOKhSEEXdrPsBk_7a63XmBg,538
23
- sgis/io/read_parquet.py,sha256=GSW2NDy4-XosbamPEzB1xhWxFAPHuGEJZglfQ-V6DzY,3774
24
- sgis/io/write_municipality_data.py,sha256=pM-IG85Q6KBj9NK9grlYvGXEe-ohj1tdr58S9tCiaoE,6218
25
- sgis/maps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- sgis/maps/examine.py,sha256=fLLA7NfHql-mj_45oQkyPSqS0Gw1O_25v1tlreUn65c,7996
27
- sgis/maps/explore.py,sha256=wsYRw5Qro1Ok9zMAl2zs95AHcE4kIC25y075nfWvWDE,25518
28
- sgis/maps/httpserver.py,sha256=z9D66SizO9GIZKaSLIqpFWnwOZZh-kiuVPjFt3WZr8o,1902
29
- sgis/maps/legend.py,sha256=buHo_UwzPYHIs7kS6H_xETekIR8m9R4PACXfTTMYQWE,20680
30
- sgis/maps/map.py,sha256=CAFnnqHt2IxdygNiTZNOPqLm6iIbXErhMCFw8wDDvUQ,21690
31
- sgis/maps/maps.py,sha256=aWfn3ssqpy-7c0uFd7R4bcjCMw5Klvnp7Jz_zcH2Bds,18424
32
- sgis/maps/thematicmap.py,sha256=6aVPciftW1YjxjRVQDipxayl3aI3tHpYiZ3HfpnSavc,14132
33
- sgis/networkanalysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
- sgis/networkanalysis/_get_route.py,sha256=qWnMabeyIdCKOlnFYNYQUrnl_iBdSSequtsbWAbPIM4,6308
35
- sgis/networkanalysis/_od_cost_matrix.py,sha256=6plN-cpGib8RL7_LhMxo09RJOMR2mjj7M02T4NgLnCA,2151
36
- sgis/networkanalysis/_points.py,sha256=aQzn_E_-N-hbtoWMxOzm3PFiwO3O0_AUk9-EOoay_24,4206
37
- sgis/networkanalysis/_service_area.py,sha256=7bOf1I6yzDJMQxYFCtjQw9lpW7YNStVbX8z-QS8Nyec,5336
38
- sgis/networkanalysis/closing_network_holes.py,sha256=u-aKPd1p7u3AmnI2ryCksWAP6BHRqZdu80J8TxVQ9sU,12413
39
- sgis/networkanalysis/cutting_lines.py,sha256=7hG8Po-oFQMSD6DdDmHZc1nqRqcy7HcXxWCFUfWaMOs,14168
40
- sgis/networkanalysis/directednetwork.py,sha256=2l_qBH7wyEd3HMBfMG_0i_xyHUFKbyB1vTDRYI3olnA,11217
41
- sgis/networkanalysis/finding_isolated_networks.py,sha256=rwgS1GN24BbhZTkk-XB3iKunErEs4YKHlbWCQprevYU,3359
42
- sgis/networkanalysis/network.py,sha256=UvPPIEfZCjoLBIyHFuSsWXYarku2l3CHrkhX3iiGkl4,7686
43
- sgis/networkanalysis/networkanalysis.py,sha256=raz5T5Va5xvnLJC7tNkPx57ZUIdm1aEeqMMpOZPGDqQ,67276
44
- sgis/networkanalysis/networkanalysisrules.py,sha256=UMSo5-a8OF-0yzDgjxNcU0TpMjOpVrqrejgHikMRsXU,12607
45
- sgis/networkanalysis/nodes.py,sha256=YVN9N3YJFoO3Zu8sF0sP4vynSNYzy1YN9sBdH1vM86M,6854
46
- sgis/networkanalysis/traveling_salesman.py,sha256=5m_Lf5En99Q8hnvAZAvN7RWZjBP1Tzdaz97DhZNkCZ0,5426
47
- sgis/parallel/parallel.py,sha256=DXmvH893Dgcx5QwxOpPZi1QBzscMorEAIzwGYf3nJrU,13509
48
- sgis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
- sgis/raster/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
- sgis/raster/base.py,sha256=FOXdHl6yT9ge-Ofk4UreeN6LUBL6inNIExGGD1OHF0s,5385
51
- sgis/raster/elevationraster.py,sha256=yrE6dg0NgJp0KmrJqdygF74tKbnnwgLQ4rfwBELCYSY,2867
52
- sgis/raster/raster.py,sha256=vWwLwr2lg5j0GBfU0g9KZoIqOPd5klGWfHxGHExZbpg,40524
53
- sgis/raster/sentinel.py,sha256=0x1HwebRRTCExmsMAXwnct23eMXDBj_KHz8CoP0NOxI,1025
54
- sgis/raster/zonal.py,sha256=P2bJ8Uvnrc4U1JbyBsKEhjGNaU4FOvRNmxOOF9EzM34,3249
55
- ssb_sgis-0.3.7.dist-info/LICENSE,sha256=lL2h0dNKGTKAE0CjTy62SDbRennVD1xPgM5LzGqhKeo,1074
56
- ssb_sgis-0.3.7.dist-info/METADATA,sha256=yKdWxxjxRBvnmY0Yk6tJ1AJeTaitGArS9jZOX6QJ1K4,9011
57
- ssb_sgis-0.3.7.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
58
- ssb_sgis-0.3.7.dist-info/RECORD,,