geoai-py 0.16.0__tar.gz → 0.18.0__tar.gz

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.
Files changed (59) hide show
  1. {geoai_py-0.16.0 → geoai_py-0.18.0}/.gitignore +3 -0
  2. {geoai_py-0.16.0 → geoai_py-0.18.0}/PKG-INFO +5 -2
  3. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/__init__.py +16 -1
  4. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/agents/__init__.py +4 -0
  5. geoai_py-0.18.0/geoai/agents/catalog_models.py +51 -0
  6. geoai_py-0.18.0/geoai/agents/catalog_tools.py +907 -0
  7. geoai_py-0.18.0/geoai/agents/geo_agents.py +1487 -0
  8. geoai_py-0.18.0/geoai/agents/stac_models.py +67 -0
  9. geoai_py-0.18.0/geoai/agents/stac_tools.py +435 -0
  10. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/change_detection.py +16 -1
  11. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/download.py +5 -1
  12. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/timm_segment.py +4 -1
  13. geoai_py-0.18.0/geoai/tools/__init__.py +65 -0
  14. geoai_py-0.18.0/geoai/tools/cloudmask.py +431 -0
  15. geoai_py-0.18.0/geoai/tools/multiclean.py +357 -0
  16. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/train.py +123 -6
  17. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai_py.egg-info/PKG-INFO +5 -2
  18. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai_py.egg-info/SOURCES.txt +7 -0
  19. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai_py.egg-info/requires.txt +4 -1
  20. {geoai_py-0.16.0 → geoai_py-0.18.0}/mkdocs.yml +5 -0
  21. {geoai_py-0.16.0 → geoai_py-0.18.0}/pyproject.toml +3 -3
  22. {geoai_py-0.16.0 → geoai_py-0.18.0}/requirements.txt +2 -1
  23. geoai_py-0.16.0/geoai/agents/geo_agents.py +0 -595
  24. {geoai_py-0.16.0 → geoai_py-0.18.0}/.dockerignore +0 -0
  25. {geoai_py-0.16.0 → geoai_py-0.18.0}/.editorconfig +0 -0
  26. {geoai_py-0.16.0 → geoai_py-0.18.0}/.pre-commit-config.yaml +0 -0
  27. {geoai_py-0.16.0 → geoai_py-0.18.0}/CITATION.cff +0 -0
  28. {geoai_py-0.16.0 → geoai_py-0.18.0}/Dockerfile +0 -0
  29. {geoai_py-0.16.0 → geoai_py-0.18.0}/LICENSE +0 -0
  30. {geoai_py-0.16.0 → geoai_py-0.18.0}/MANIFEST.in +0 -0
  31. {geoai_py-0.16.0 → geoai_py-0.18.0}/README.md +0 -0
  32. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/agents/map_tools.py +0 -0
  33. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/classify.py +0 -0
  34. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/detectron2.py +0 -0
  35. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/dinov3.py +0 -0
  36. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/extract.py +0 -0
  37. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/geoai.py +0 -0
  38. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/hf.py +0 -0
  39. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/map_widgets.py +0 -0
  40. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/sam.py +0 -0
  41. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/segment.py +0 -0
  42. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/segmentation.py +0 -0
  43. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/timm_train.py +0 -0
  44. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai/utils.py +0 -0
  45. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai_py.egg-info/dependency_links.txt +0 -0
  46. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai_py.egg-info/entry_points.txt +0 -0
  47. {geoai_py-0.16.0 → geoai_py-0.18.0}/geoai_py.egg-info/top_level.txt +0 -0
  48. {geoai_py-0.16.0 → geoai_py-0.18.0}/pytest.ini +0 -0
  49. {geoai_py-0.16.0 → geoai_py-0.18.0}/requirements_docs.txt +0 -0
  50. {geoai_py-0.16.0 → geoai_py-0.18.0}/setup.cfg +0 -0
  51. {geoai_py-0.16.0 → geoai_py-0.18.0}/tests/__init__.py +0 -0
  52. {geoai_py-0.16.0 → geoai_py-0.18.0}/tests/create_test_data.py +0 -0
  53. {geoai_py-0.16.0 → geoai_py-0.18.0}/tests/test_classify.py +0 -0
  54. {geoai_py-0.16.0 → geoai_py-0.18.0}/tests/test_download.py +0 -0
  55. {geoai_py-0.16.0 → geoai_py-0.18.0}/tests/test_extract.py +0 -0
  56. {geoai_py-0.16.0 → geoai_py-0.18.0}/tests/test_fixtures.py +0 -0
  57. {geoai_py-0.16.0 → geoai_py-0.18.0}/tests/test_geoai.py +0 -0
  58. {geoai_py-0.16.0 → geoai_py-0.18.0}/tests/test_segment.py +0 -0
  59. {geoai_py-0.16.0 → geoai_py-0.18.0}/tests/test_utils.py +0 -0
@@ -7,6 +7,7 @@ private/
7
7
  tests/data/
8
8
  CLAUDE.md
9
9
  AI_AGENTS.md
10
+ AGENTS.md
10
11
  docs/examples/timm_output/
11
12
  docs/examples/timm_seg_output/
12
13
  docs/examples/timm_buildings/
@@ -17,6 +18,8 @@ docs/examples/timm_buildings/
17
18
  **/*.zip
18
19
  **/*.las
19
20
  *.geojson
21
+ *.gpkg
22
+ *.csv
20
23
  docs/examples/*.md
21
24
  *.xml
22
25
  docs/examples/output/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: geoai-py
3
- Version: 0.16.0
3
+ Version: 0.18.0
4
4
  Summary: A Python package for using Artificial Intelligence (AI) with geospatial data
5
5
  Author-email: Qiusheng Wu <giswqs@gmail.com>
6
6
  License: MIT License
@@ -39,15 +39,18 @@ Requires-Dist: rioxarray
39
39
  Requires-Dist: scikit-image
40
40
  Requires-Dist: scikit-learn
41
41
  Requires-Dist: timm
42
+ Requires-Dist: tokenizers>=0.22.1
42
43
  Requires-Dist: torch
43
44
  Requires-Dist: torchgeo
44
45
  Requires-Dist: torchinfo
45
46
  Requires-Dist: tqdm
46
- Requires-Dist: transformers
47
+ Requires-Dist: transformers>=4.57.1
47
48
  Provides-Extra: extra
48
49
  Requires-Dist: overturemaps; extra == "extra"
49
50
  Requires-Dist: torchange; extra == "extra"
50
51
  Requires-Dist: lightly-train; extra == "extra"
52
+ Requires-Dist: multiclean; extra == "extra"
53
+ Requires-Dist: omnicloudmask; extra == "extra"
51
54
  Provides-Extra: agents
52
55
  Requires-Dist: strands-agents; extra == "agents"
53
56
  Requires-Dist: strands-agents-tools; extra == "agents"
@@ -2,7 +2,7 @@
2
2
 
3
3
  __author__ = """Qiusheng Wu"""
4
4
  __email__ = "giswqs@gmail.com"
5
- __version__ = "0.16.0"
5
+ __version__ = "0.18.0"
6
6
 
7
7
 
8
8
  import os
@@ -121,3 +121,18 @@ from .timm_segment import (
121
121
  timm_semantic_segmentation,
122
122
  push_timm_model_to_hub,
123
123
  )
124
+
125
+ # Import tools subpackage
126
+ from . import tools
127
+
128
+ # Expose commonly used tools at package level for convenience
129
+ try:
130
+ from .tools import (
131
+ clean_segmentation_mask,
132
+ clean_raster,
133
+ clean_raster_batch,
134
+ compare_masks,
135
+ )
136
+ except ImportError:
137
+ # MultiClean not available (missing dependency)
138
+ pass
@@ -1,8 +1,12 @@
1
+ from .catalog_tools import CatalogTools
1
2
  from .geo_agents import (
3
+ CatalogAgent,
2
4
  GeoAgent,
5
+ STACAgent,
3
6
  create_ollama_model,
4
7
  create_anthropic_model,
5
8
  create_openai_model,
6
9
  create_bedrock_model,
7
10
  )
8
11
  from .map_tools import MapTools
12
+ from .stac_tools import STACTools
@@ -0,0 +1,51 @@
1
+ """Structured output models for catalog search results."""
2
+
3
+ from typing import Any, Dict, List, Optional
4
+
5
+ from pydantic import BaseModel, Field
6
+
7
+
8
+ class CatalogDatasetInfo(BaseModel):
9
+ """Information about a catalog dataset."""
10
+
11
+ id: str = Field(..., description="Dataset identifier")
12
+ title: str = Field(..., description="Dataset title")
13
+ type: Optional[str] = Field(
14
+ None, description="Dataset type (e.g., image, image_collection, table)"
15
+ )
16
+ provider: Optional[str] = Field(None, description="Data provider")
17
+ description: Optional[str] = Field(None, description="Dataset description")
18
+ keywords: Optional[str] = Field(None, description="Keywords/tags")
19
+ snippet: Optional[str] = Field(
20
+ None, description="Code snippet to access the dataset"
21
+ )
22
+ start_date: Optional[str] = Field(None, description="Start date of coverage")
23
+ end_date: Optional[str] = Field(None, description="End date of coverage")
24
+ bbox: Optional[str] = Field(None, description="Bounding box")
25
+ license: Optional[str] = Field(None, description="License information")
26
+ url: Optional[str] = Field(None, description="Documentation URL")
27
+ catalog: Optional[str] = Field(None, description="Catalog URL")
28
+ deprecated: Optional[str] = Field(None, description="Deprecated status")
29
+
30
+
31
+ class CatalogSearchResult(BaseModel):
32
+ """Container for catalog search results."""
33
+
34
+ query: str = Field(..., description="Original search query")
35
+ dataset_count: int = Field(..., description="Number of datasets found")
36
+ datasets: List[CatalogDatasetInfo] = Field(
37
+ default_factory=list, description="List of catalog datasets"
38
+ )
39
+ filters: Optional[Dict[str, Any]] = Field(
40
+ None, description="Filters applied to search"
41
+ )
42
+
43
+
44
+ class LocationInfo(BaseModel):
45
+ """Geographic location information."""
46
+
47
+ name: str = Field(..., description="Location name")
48
+ bbox: List[float] = Field(
49
+ ..., description="Bounding box [west, south, east, north]"
50
+ )
51
+ center: List[float] = Field(..., description="Center coordinates [lon, lat]")