geobox 1.4.1__py3-none-any.whl → 1.4.2__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.
- geobox/map.py +22 -3
- geobox/model3d.py +101 -16
- geobox/mosaic.py +19 -0
- geobox/query.py +3 -1
- geobox/raster.py +19 -0
- geobox/vectorlayer.py +19 -0
- geobox/view.py +19 -0
- {geobox-1.4.1.dist-info → geobox-1.4.2.dist-info}/METADATA +1 -1
- {geobox-1.4.1.dist-info → geobox-1.4.2.dist-info}/RECORD +12 -12
- {geobox-1.4.1.dist-info → geobox-1.4.2.dist-info}/WHEEL +0 -0
- {geobox-1.4.1.dist-info → geobox-1.4.2.dist-info}/licenses/LICENSE +0 -0
- {geobox-1.4.1.dist-info → geobox-1.4.2.dist-info}/top_level.txt +0 -0
geobox/map.py
CHANGED
|
@@ -574,11 +574,30 @@ class Map(Base):
|
|
|
574
574
|
'view_settings': {},
|
|
575
575
|
'toc_settings': []
|
|
576
576
|
})
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
def update_settings(self, settings: Dict) -> Dict:
|
|
580
|
+
"""
|
|
581
|
+
Update the settings
|
|
582
|
+
|
|
583
|
+
settings (Dict): settings dictionary
|
|
584
|
+
|
|
585
|
+
Returns:
|
|
586
|
+
Dict: updated settings
|
|
587
|
+
|
|
588
|
+
Example:
|
|
589
|
+
>>> from geobox import GeoboxClient
|
|
590
|
+
>>> client = GeoboxClient()
|
|
591
|
+
>>> map1 = client.get_map(uuid="12345678-1234-5678-1234-567812345678")
|
|
592
|
+
>>> map2 = client.get_map(uuid="12345678-1234-5678-1234-567812345678")
|
|
593
|
+
>>> map1.update_settings(map2.settings)
|
|
594
|
+
"""
|
|
595
|
+
return super()._set_settings(self.endpoint, settings)
|
|
577
596
|
|
|
578
597
|
|
|
579
598
|
def set_settings(self, **kwargs) -> Dict:
|
|
580
599
|
"""
|
|
581
|
-
Set the settings of the map
|
|
600
|
+
Set the settings of the map using keywords
|
|
582
601
|
|
|
583
602
|
Keyword Args:
|
|
584
603
|
map_unit (str): 'latlng' | 'utm'.
|
|
@@ -736,7 +755,7 @@ class Map(Base):
|
|
|
736
755
|
if not response or json:
|
|
737
756
|
return response
|
|
738
757
|
else:
|
|
739
|
-
return [Model(self.api, model['obj'], model) for model in response['objects']]
|
|
758
|
+
return [Model(self.api, model['obj'], model) for model in response['objects'] if response.get('objects')]
|
|
740
759
|
|
|
741
760
|
|
|
742
761
|
def set_models(self, data: Dict) -> List['Model']:
|
|
@@ -771,7 +790,7 @@ class Map(Base):
|
|
|
771
790
|
"""
|
|
772
791
|
endpoint = urljoin(self.endpoint, 'models/')
|
|
773
792
|
response = self.api.put(endpoint, data)
|
|
774
|
-
return [Model(self.api, model['obj'], model) for model in response['objects']]
|
|
793
|
+
return [Model(self.api, model['obj'], model) for model in response['objects'] if response.get('objects')]
|
|
775
794
|
|
|
776
795
|
|
|
777
796
|
def add_model(self,
|
geobox/model3d.py
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
from typing import Dict, List, Optional, Optional, Union, TYPE_CHECKING
|
|
2
2
|
from urllib.parse import urljoin, urlencode
|
|
3
|
+
import os
|
|
4
|
+
import zipfile
|
|
5
|
+
import sys
|
|
6
|
+
import requests
|
|
7
|
+
import mimetypes
|
|
3
8
|
|
|
4
9
|
from .base import Base
|
|
5
10
|
from .exception import ApiRequestError
|
|
@@ -216,33 +221,113 @@ class Model(Base):
|
|
|
216
221
|
super().delete(self.endpoint)
|
|
217
222
|
|
|
218
223
|
|
|
219
|
-
def
|
|
224
|
+
def _get_save_path(self, save_path: str = None) -> str:
|
|
220
225
|
"""
|
|
221
|
-
Get the
|
|
226
|
+
Get the path where the file should be saved.
|
|
227
|
+
|
|
228
|
+
Args:
|
|
229
|
+
save_path (str, optional): The path to save the file.
|
|
222
230
|
|
|
223
231
|
Returns:
|
|
224
|
-
|
|
232
|
+
str: The path where the file is saved.
|
|
233
|
+
|
|
234
|
+
Raises:
|
|
235
|
+
ValueError: If save_path does not end with a '/'.
|
|
236
|
+
|
|
237
|
+
Example:
|
|
238
|
+
>>> from geobox import GeoboxClient
|
|
239
|
+
>>> from geobox.file import File
|
|
240
|
+
>>> from geobox import GeoboxClient
|
|
241
|
+
>>> client = GeoboxClient()
|
|
242
|
+
>>> file_path = File.get_file(client, uuid="12345678-1234-5678-1234-567812345678")
|
|
243
|
+
"""
|
|
244
|
+
# If save_path is provided, check if it ends with a '/'
|
|
245
|
+
if save_path and save_path.endswith('/'):
|
|
246
|
+
return f'{save_path}'
|
|
247
|
+
|
|
248
|
+
if save_path and not save_path.endswith('/'):
|
|
249
|
+
raise ValueError("save_path must end with a '/'")
|
|
250
|
+
|
|
251
|
+
return os.getcwd()
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def _create_progress_bar(self) -> 'tqdm':
|
|
255
|
+
"""Creates a progress bar for the task."""
|
|
256
|
+
try:
|
|
257
|
+
from tqdm.auto import tqdm
|
|
258
|
+
except ImportError:
|
|
259
|
+
from .api import logger
|
|
260
|
+
logger.warning("[tqdm] extra is required to show the progress bar. install with: pip insatll geobox[tqdm]")
|
|
261
|
+
return None
|
|
262
|
+
|
|
263
|
+
return tqdm(unit="B",
|
|
264
|
+
total=int(self.size),
|
|
265
|
+
file=sys.stdout,
|
|
266
|
+
dynamic_ncols=True,
|
|
267
|
+
desc="Downloading",
|
|
268
|
+
unit_scale=True,
|
|
269
|
+
unit_divisor=1024,
|
|
270
|
+
ascii=True
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def download(self, save_path: str = None, progress_bar: bool = True) -> str:
|
|
275
|
+
"""
|
|
276
|
+
Download the 3D model, save it as a .glb file, zip it, and return the zip file path.
|
|
277
|
+
|
|
278
|
+
Args:
|
|
279
|
+
save_path (str, optional): Directory where the file should be saved.
|
|
280
|
+
progress_bar (bool, optional): Whether to show a progress bar. Default: True
|
|
281
|
+
|
|
282
|
+
Returns:
|
|
283
|
+
str: Path to the .zip file containing the .glb model.
|
|
225
284
|
|
|
226
285
|
Raises:
|
|
227
286
|
ApiRequestError: If the API request fails.
|
|
228
287
|
|
|
229
288
|
Example:
|
|
230
289
|
>>> from geobox import GeoboxClient
|
|
231
|
-
>>> from geobox.model3d import Model
|
|
232
290
|
>>> client = GeoboxClient()
|
|
233
|
-
>>> model =
|
|
234
|
-
>>>
|
|
235
|
-
>>> # Save the content to a file
|
|
236
|
-
>>> with open('model.gltf', 'wb') as f:
|
|
237
|
-
... f.write(content)
|
|
291
|
+
>>> model = client.get_models()[0]
|
|
292
|
+
>>> model.get_content()
|
|
238
293
|
"""
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
if
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
294
|
+
if not self.uuid:
|
|
295
|
+
raise ValueError("Model UUID is required to download content")
|
|
296
|
+
|
|
297
|
+
if self.data.get('obj'):
|
|
298
|
+
model = self.api.get_model(self.obj)
|
|
299
|
+
else:
|
|
300
|
+
model = self
|
|
301
|
+
|
|
302
|
+
save_path = model._get_save_path(save_path)
|
|
303
|
+
os.makedirs(save_path, exist_ok=True)
|
|
304
|
+
|
|
305
|
+
endpoint = urljoin(model.api.base_url, f"{model.endpoint}/content/")
|
|
306
|
+
with model.api.session.get(endpoint, stream=True) as response:
|
|
307
|
+
if response.status_code != 200:
|
|
308
|
+
raise ApiRequestError(f"Failed to get model content: {response.status_code}")
|
|
309
|
+
|
|
310
|
+
glb_filename = f"{model.name}.glb"
|
|
311
|
+
glb_path = os.path.join(save_path, glb_filename)
|
|
312
|
+
|
|
313
|
+
with open(glb_path, "wb") as f:
|
|
314
|
+
pbar = model._create_progress_bar() if progress_bar else None
|
|
315
|
+
for chunk in response.iter_content(chunk_size=8192):
|
|
316
|
+
f.write(chunk)
|
|
317
|
+
if pbar:
|
|
318
|
+
pbar.update(len(chunk))
|
|
319
|
+
pbar.refresh()
|
|
320
|
+
if pbar:
|
|
321
|
+
pbar.close()
|
|
322
|
+
|
|
323
|
+
zip_filename = f"{model.name}.zip"
|
|
324
|
+
zip_path = os.path.join(save_path, zip_filename)
|
|
325
|
+
with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zipf:
|
|
326
|
+
zipf.write(glb_path, arcname=os.path.basename(glb_path))
|
|
327
|
+
|
|
328
|
+
os.remove(glb_path)
|
|
329
|
+
|
|
330
|
+
return os.path.abspath(zip_path)
|
|
246
331
|
|
|
247
332
|
|
|
248
333
|
@property
|
geobox/mosaic.py
CHANGED
|
@@ -401,6 +401,25 @@ class Mosaic(Raster):
|
|
|
401
401
|
"""
|
|
402
402
|
return super().settings
|
|
403
403
|
|
|
404
|
+
|
|
405
|
+
def update_settings(self, settings: Dict) -> Dict:
|
|
406
|
+
"""
|
|
407
|
+
Update the settings
|
|
408
|
+
|
|
409
|
+
settings (Dict): settings dictionary
|
|
410
|
+
|
|
411
|
+
Returns:
|
|
412
|
+
Dict: updated settings
|
|
413
|
+
|
|
414
|
+
Example:
|
|
415
|
+
>>> from geobox import GeoboxClient
|
|
416
|
+
>>> client = GeoboxClient()
|
|
417
|
+
>>> mosaic1 = client.get_mosaic(uuid="12345678-1234-5678-1234-567812345678")
|
|
418
|
+
>>> mosaic2 = client.get_mosaic(uuid="12345678-1234-5678-1234-567812345678")
|
|
419
|
+
>>> mosaic1.update_settings(mosaic2.settings)
|
|
420
|
+
"""
|
|
421
|
+
return super().update_settings(settings)
|
|
422
|
+
|
|
404
423
|
|
|
405
424
|
def set_settings(self, **kwargs) -> None:
|
|
406
425
|
"""
|
geobox/query.py
CHANGED
|
@@ -179,7 +179,7 @@ class Query(Base):
|
|
|
179
179
|
|
|
180
180
|
|
|
181
181
|
@classmethod
|
|
182
|
-
def create_query(cls, api: 'GeoboxClient', name: str, display_name: str = None, sql: str = None, params: List = None) -> 'Query':
|
|
182
|
+
def create_query(cls, api: 'GeoboxClient', name: str, display_name: str = None, description:str = None, sql: str = None, params: List = None) -> 'Query':
|
|
183
183
|
"""
|
|
184
184
|
Creates a new query.
|
|
185
185
|
|
|
@@ -187,6 +187,7 @@ class Query(Base):
|
|
|
187
187
|
api (Api): The GeoboxClient instance for making requests.
|
|
188
188
|
name (str): The name of the query.
|
|
189
189
|
display_name (str, optional): The display name of the query.
|
|
190
|
+
description (str, optional): The description of the query.
|
|
190
191
|
sql (str, optional): The SQL statement for the query.
|
|
191
192
|
params (list, optional): The parameters for the SQL statement.
|
|
192
193
|
|
|
@@ -204,6 +205,7 @@ class Query(Base):
|
|
|
204
205
|
data = {
|
|
205
206
|
"name": name,
|
|
206
207
|
"display_name": display_name,
|
|
208
|
+
"description": description,
|
|
207
209
|
"sql": sql,
|
|
208
210
|
"params": params
|
|
209
211
|
}
|
geobox/raster.py
CHANGED
|
@@ -641,6 +641,25 @@ class Raster(Base):
|
|
|
641
641
|
>>> raster.settings
|
|
642
642
|
"""
|
|
643
643
|
return super()._get_settings(self.endpoint)
|
|
644
|
+
|
|
645
|
+
|
|
646
|
+
def update_settings(self, settings: Dict) -> Dict:
|
|
647
|
+
"""
|
|
648
|
+
Update the settings
|
|
649
|
+
|
|
650
|
+
settings (Dict): settings dictionary
|
|
651
|
+
|
|
652
|
+
Returns:
|
|
653
|
+
Dict: updated settings
|
|
654
|
+
|
|
655
|
+
Example:
|
|
656
|
+
>>> from geobox import GeoboxClient
|
|
657
|
+
>>> client = GeoboxClient()
|
|
658
|
+
>>> raster1 = client.get_raster(uuid="12345678-1234-5678-1234-567812345678")
|
|
659
|
+
>>> raster2 = client.get_raster(uuid="12345678-1234-5678-1234-567812345678")
|
|
660
|
+
>>> raster1.update_settings(raster2.settings)
|
|
661
|
+
"""
|
|
662
|
+
return super()._set_settings(self.endpoint, settings)
|
|
644
663
|
|
|
645
664
|
|
|
646
665
|
def set_settings(self, **kwargs) -> None:
|
geobox/vectorlayer.py
CHANGED
|
@@ -1062,6 +1062,25 @@ class VectorLayer(Base):
|
|
|
1062
1062
|
>>> setting = layer.setting
|
|
1063
1063
|
"""
|
|
1064
1064
|
return super()._get_settings(endpoint=self.endpoint)
|
|
1065
|
+
|
|
1066
|
+
|
|
1067
|
+
def update_settings(self, settings: Dict) -> Dict:
|
|
1068
|
+
"""
|
|
1069
|
+
Update the settings
|
|
1070
|
+
|
|
1071
|
+
settings (Dict): settings dictionary
|
|
1072
|
+
|
|
1073
|
+
Returns:
|
|
1074
|
+
Dict: updated settings
|
|
1075
|
+
|
|
1076
|
+
Example:
|
|
1077
|
+
>>> from geobox import GeoboxClient
|
|
1078
|
+
>>> client = GeoboxClient()
|
|
1079
|
+
>>> layer1 = client.get_vector(uuid="12345678-1234-5678-1234-567812345678")
|
|
1080
|
+
>>> layer2 = client.get_vector(uuid="12345678-1234-5678-1234-567812345678")
|
|
1081
|
+
>>> layer1.update_settings(layer2.settings)
|
|
1082
|
+
"""
|
|
1083
|
+
return super()._set_settings(self.endpoint, settings)
|
|
1065
1084
|
|
|
1066
1085
|
|
|
1067
1086
|
def set_settings(self, **kwargs) -> Dict:
|
geobox/view.py
CHANGED
|
@@ -722,6 +722,25 @@ class VectorLayerView(VectorLayer):
|
|
|
722
722
|
return super().settings
|
|
723
723
|
|
|
724
724
|
|
|
725
|
+
def update_settings(self, settings: Dict) -> Dict:
|
|
726
|
+
"""
|
|
727
|
+
Update the settings
|
|
728
|
+
|
|
729
|
+
settings (Dict): settings dictionary
|
|
730
|
+
|
|
731
|
+
Returns:
|
|
732
|
+
Dict: updated settings
|
|
733
|
+
|
|
734
|
+
Example:
|
|
735
|
+
>>> from geobox import GeoboxClient
|
|
736
|
+
>>> client = GeoboxClient()
|
|
737
|
+
>>> view1 = client.get_view(uuid="12345678-1234-5678-1234-567812345678")
|
|
738
|
+
>>> view2 = client.get_view(uuid="12345678-1234-5678-1234-567812345678")
|
|
739
|
+
>>> view1.update_settings(view2.settings)
|
|
740
|
+
"""
|
|
741
|
+
return super().update_settings(settings)
|
|
742
|
+
|
|
743
|
+
|
|
725
744
|
def set_settings(self, **kwargs) -> Dict:
|
|
726
745
|
"""
|
|
727
746
|
Set the settings of the Vector Layer.
|
|
@@ -12,12 +12,12 @@ geobox/field.py,sha256=p9eitUpnsiGj6GUhjSomk6HWlsNJSbE-Oh_4VcjaqVo,10562
|
|
|
12
12
|
geobox/file.py,sha256=cMm-SwTzRKALiIj-gkY4UJzUsOuN5SGz50eU1ylNAxk,20079
|
|
13
13
|
geobox/layout.py,sha256=TdE5FJ7fzbhkexojY8h-r68hXb5UYM6MIfNkxfs_RKA,11285
|
|
14
14
|
geobox/log.py,sha256=Xuq4oKPwaypZ4nYEOIXu13dH4AkQcf0pkTw85gDQqS4,4063
|
|
15
|
-
geobox/map.py,sha256=
|
|
16
|
-
geobox/model3d.py,sha256=
|
|
17
|
-
geobox/mosaic.py,sha256=
|
|
15
|
+
geobox/map.py,sha256=kksFBS79TOKN9KBByXzj2atSvZhIAuMA85hSjo_szeA,36788
|
|
16
|
+
geobox/model3d.py,sha256=acT5dXwq3Lmhfq5-cPOnYJMZR1gzj3cfF6kyxMleHag,14924
|
|
17
|
+
geobox/mosaic.py,sha256=zKo6cEtaqz7fFcWIzhURxZIkICUQlpEhpFBjGJ5GJ1M,24385
|
|
18
18
|
geobox/plan.py,sha256=jUzl6CQBY6IsdieEppJOmE0sSjwvu6eHO89pC_JFs6I,12066
|
|
19
|
-
geobox/query.py,sha256=
|
|
20
|
-
geobox/raster.py,sha256=
|
|
19
|
+
geobox/query.py,sha256=ubS1Og3rC_6-zW-cbR30o7bZw2MZNZY652VLCvVvmWE,24173
|
|
20
|
+
geobox/raster.py,sha256=fTIM9HKVddaFfO9o-mEbZSM31qpCr6KAszguInZjd2A,30702
|
|
21
21
|
geobox/route.py,sha256=cKZTTHBHM8woWbhHIpCvrRX_doJcTkGktouee0z7oG0,2723
|
|
22
22
|
geobox/scene.py,sha256=GEzvWB-l-xO-8IodwFAPt4T7lZxuzEKJ1H0cqfx78W4,11301
|
|
23
23
|
geobox/settings.py,sha256=rGRdM18Vo7xnjfZXPLRMbKeoVC_lZmzkNRPS0SQv05o,5660
|
|
@@ -27,12 +27,12 @@ geobox/tileset.py,sha256=bQOckE04F31vb-NYmNsQzXndZSTDZyskWspRikjZuBs,24241
|
|
|
27
27
|
geobox/usage.py,sha256=_54xL-n-2Bg9wGpoOBKnh85WqdpMWEtqxRJVaFlVWe0,7908
|
|
28
28
|
geobox/user.py,sha256=YY72uRvjKUUWUZbxhrft37FVBlqDeosPMf3EpMVBhc0,15069
|
|
29
29
|
geobox/utils.py,sha256=qLtchKIdw-az3KCiiFv0-Cpmx9RfBxORjlATvVyDIaQ,1314
|
|
30
|
-
geobox/vectorlayer.py,sha256=
|
|
30
|
+
geobox/vectorlayer.py,sha256=s8zH68ALeBvep5bW5wuHkDm9x07Z52GhPaeDbznJ3wY,57066
|
|
31
31
|
geobox/version.py,sha256=0GLPhxCeEb2bAkdpPJWtXPXc1KP6kQ_TOMwLAL0ldo0,9374
|
|
32
|
-
geobox/view.py,sha256=
|
|
32
|
+
geobox/view.py,sha256=xAxBhxwoWAoiG8YJBEF93UJ4e4VeJx17rZpfdl2Q8DU,41507
|
|
33
33
|
geobox/workflow.py,sha256=_WEIy1zLpBFx5yeuZ4ClnwPdU90jQbdy5bWYYIRa4JY,11549
|
|
34
|
-
geobox-1.4.
|
|
35
|
-
geobox-1.4.
|
|
36
|
-
geobox-1.4.
|
|
37
|
-
geobox-1.4.
|
|
38
|
-
geobox-1.4.
|
|
34
|
+
geobox-1.4.2.dist-info/licenses/LICENSE,sha256=AvFB7W94sJYKLDhBxLRshL3upexCOG8HQY_1JibB96w,1063
|
|
35
|
+
geobox-1.4.2.dist-info/METADATA,sha256=5-4FR_CCE6LGfz96_urdMuEjN1s0xikKEn8vG2Q5WPI,2658
|
|
36
|
+
geobox-1.4.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
37
|
+
geobox-1.4.2.dist-info/top_level.txt,sha256=ppXH8Bu2mlB-pLQ6lsoWEm2Gr6wZx1uzkhetsYA5ins,7
|
|
38
|
+
geobox-1.4.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|