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 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 get_content(self) -> bytes:
224
+ def _get_save_path(self, save_path: str = None) -> str:
220
225
  """
221
- Get the raw content of the 3D model.
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
- bytes: The raw content of the 3D model in glTF format.
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 = Model.get_model(api=client, uuid="12345678-1234-5678-1234-567812345678")
234
- >>> content = model.get_content()
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
- endpoint = urljoin(self.api.base_url, f'{self.endpoint}/content/')
240
- response = self.api.session.get(endpoint)
241
-
242
- if response.status_code != 200:
243
- raise ApiRequestError(f"Failed to get model content: {response.status_code}")
244
-
245
- return response.content
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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: geobox
3
- Version: 1.4.1
3
+ Version: 1.4.2
4
4
  Summary: SDK for Geobox's APIs
5
5
  Author-email: Hamid Heydari <heydari.h62@gmail.com>
6
6
  License: MIT
@@ -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=JfGYGo1P9jcbYLr3RkwrvhTTnb-xmH_EsuqO0M_yT5c,36118
16
- geobox/model3d.py,sha256=GUpZdRcy6Fs83PdqdfX70F_uxIAqkyTbsMWYSI7rV5k,12011
17
- geobox/mosaic.py,sha256=6wSK9xkjtBUEtIsZANWVYwsJbDx112mO1SQOXcPTVo8,23780
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=FqeiZf2E4tJ2FG-mIfRKov6H1QWUrMSErVpNWcb3Wx0,24038
20
- geobox/raster.py,sha256=gBWZUm88uJwjgSlp7auS0nEB9KjkTv1F9hvdPaJqCic,30084
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=eB1zadgS4xqxV1NEUwaXsh5PIwAX054tYBqdu8ZO6hs,56452
30
+ geobox/vectorlayer.py,sha256=s8zH68ALeBvep5bW5wuHkDm9x07Z52GhPaeDbznJ3wY,57066
31
31
  geobox/version.py,sha256=0GLPhxCeEb2bAkdpPJWtXPXc1KP6kQ_TOMwLAL0ldo0,9374
32
- geobox/view.py,sha256=t-MlTNDL1T53Mybny5UOMTjVQwDdaDovLJfyl3Qgx1I,40919
32
+ geobox/view.py,sha256=xAxBhxwoWAoiG8YJBEF93UJ4e4VeJx17rZpfdl2Q8DU,41507
33
33
  geobox/workflow.py,sha256=_WEIy1zLpBFx5yeuZ4ClnwPdU90jQbdy5bWYYIRa4JY,11549
34
- geobox-1.4.1.dist-info/licenses/LICENSE,sha256=AvFB7W94sJYKLDhBxLRshL3upexCOG8HQY_1JibB96w,1063
35
- geobox-1.4.1.dist-info/METADATA,sha256=KF1UGO6DhvFbUGt4WcubAl9QH7VAcGz1K0OMytVgaC0,2658
36
- geobox-1.4.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
37
- geobox-1.4.1.dist-info/top_level.txt,sha256=ppXH8Bu2mlB-pLQ6lsoWEm2Gr6wZx1uzkhetsYA5ins,7
38
- geobox-1.4.1.dist-info/RECORD,,
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