diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index f1dbd99..1e5ab81 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -12,7 +12,7 @@ env: IMAGE_NAME: ${{github.repository}} jobs: deploy: - uses: EPFL-ENAC/epfl-enac-build-push-deploy-action/.github/workflows/deploy.yml@main + uses: EPFL-ENAC/epfl-enac-build-push-deploy-action/.github/workflows/deploy.yml@v2.2.0 secrets: token: ${{ secrets.CD_TOKEN }} with: diff --git a/admin/src/components/BuildingDialog.vue b/admin/src/components/BuildingDialog.vue index b25b09d..52bdc73 100644 --- a/admin/src/components/BuildingDialog.vue +++ b/admin/src/components/BuildingDialog.vue @@ -121,7 +121,7 @@
{{ $t('building_elements') }}
-
+
{{ $t('no_building_elements') }}
@@ -333,7 +333,22 @@ async function onSave() { delete selected.value.professionals; selected.value.professional_ids = professionals.value; delete selected.value.building_elements; - selected.value.building_elements = buildingElements.value; + if (buildingElements.value) { + selected.value.building_elements = buildingElements.value.map((be) => { + return { + ...be, + materials: + be.materials + ?.filter((m) => m.building_material_id !== undefined && (m.distance || m.weight)) + .map((m) => { + return { + ...m, + building_element_id: be.id, + }; + }) || [], + }; + }); + } if (selected.value.id) { service .update(selected.value.id, selected.value) @@ -379,6 +394,7 @@ function onAddBuildingElement() { building_id: selected.value.id, technical_construction_id: undefined, professional_ids: [], + materials: [], }); } diff --git a/admin/src/components/BuildingElementForm.vue b/admin/src/components/BuildingElementForm.vue index c15936d..6665699 100644 --- a/admin/src/components/BuildingElementForm.vue +++ b/admin/src/components/BuildingElementForm.vue @@ -11,6 +11,7 @@ clearable :label="$t('technical_construction')" :hint="$t('building_element_technical_construction_used_hint')" + @update:model-value="onTechnicalConstructionChange" />
@@ -27,6 +28,42 @@ />
+
+
{{ $t('building_element_materials') }}
+
{{ $t('building_element_materials_hint') }}
+ + +
+ {{ $t('no_building_element_materials') }} +
+ + + + + + + + + + +
+ + + +
+
@@ -38,6 +75,7 @@ export default defineComponent({ diff --git a/admin/src/components/BuildingElementMaterialForm.vue b/admin/src/components/BuildingElementMaterialForm.vue new file mode 100644 index 0000000..f80c02a --- /dev/null +++ b/admin/src/components/BuildingElementMaterialForm.vue @@ -0,0 +1,99 @@ + + + + diff --git a/admin/src/components/models.ts b/admin/src/components/models.ts index 05427d1..fb81873 100644 --- a/admin/src/components/models.ts +++ b/admin/src/components/models.ts @@ -23,6 +23,10 @@ export interface Option { level?: number; selectable?: boolean; } +export interface OptionNumber { + value: number; + label: string; +} export interface Suggestions { key: string; diff --git a/admin/src/i18n/en/index.js b/admin/src/i18n/en/index.js index 09285c8..5e0095f 100644 --- a/admin/src/i18n/en/index.js +++ b/admin/src/i18n/en/index.js @@ -45,10 +45,16 @@ export default { article_top_pro_hint: 'Bio/history.', article_top_tc_hint: 'Background and manufacturing.', article_top: 'Article (top)', + building_element_materials: 'Materials used', + building_element_materials_hint: 'Provide some details about the materials used in this building element.', + building_element_building_material_distance_hint: 'Distance to fetch the building materials in kilometers.', + building_element_building_material_used_hint: 'Building material used in the selected technical construction.', + building_element_building_material_weight_hint: 'Weight of the building material in kilograms.', building_building_material_used_hint: 'Building material used.', building_element_professionals_hint: 'Professionals involved.', building_element_technical_construction_used_hint: 'Technical construction used.', building_elements: 'Building elements', + building_material: 'Building material', building_material_constituants_hint: 'Building material are made of natural resources.', building_material_constituants: 'Building material constituants', building_materials: 'Building materials', @@ -75,6 +81,7 @@ export default { diffusivity_hint: 'D, *10^-6*m2/s', diffusivity: 'Diffusivity', dimension: 'Dimension', + distance: 'Distance', drop_index: 'Drop index', edit: 'Edit', effusivity_hint: 'E, W*sqrt(h)/(m2*K)', @@ -117,6 +124,7 @@ export default { natural_resource_constituants: 'Natural resources constituants', natural_resources: 'Natural resources', no_building_elements: 'No building elements', + no_building_element_materials: 'No materials information', no_results: 'No results', other: 'Other', other_addresses: 'Other addresses', @@ -176,6 +184,7 @@ export default { vapor_diffusion_resistance_hint: 'µ', vapor_diffusion_resistance: 'Water vapor diffusion resistance', website: 'Website', + weight: 'Weight', write: 'Write', year_of_construction: 'Year of construction', youngs_modulus_hint: 'E, Mpa', diff --git a/admin/src/i18n/fr/index.js b/admin/src/i18n/fr/index.js index 0349a6e..8317dfd 100644 --- a/admin/src/i18n/fr/index.js +++ b/admin/src/i18n/fr/index.js @@ -34,10 +34,16 @@ export default { article_top_pro_hint: 'Bio/histoire.', article_top_tc_hint: 'Origine et fabrication.', article_top: 'Article (haut)', + building_element_materials: 'Matériaux utilisés', + building_element_materials_hint: 'Fournir des détails sur les matériaux utilisés dans cet élément de bâtiment.', building_building_material_used_hint: 'Matériaux de construction utilisés.', building_element_professionals_hint: 'Professionnels impliqués dans la construction.', building_element_technical_construction_used_hint: 'Constructions techniques utilisées.', + building_element_building_material_distance_hint: 'Distance pour obtenir les matériaux de construction en kilomètres.', + building_element_building_material_used_hint: 'Matériaux de construction utilisés dans la construction technique sélectionnée.', + building_element_building_material_weight_hint: 'Poids du matériau de construction en kilogrammes.', building_elements: 'Éléments de bâtiment', + building_material: 'Matériau de construction', building_material_constituants_hint: 'Les matériaux de construction sont fabriqués à partir de ressources naturelles.', building_material_constituants: 'Matériaux de construction constituants', building_materials: 'Matériaux de construction', @@ -59,6 +65,7 @@ export default { description_tc_hint: 'Description générale, principales propriétés et utilisations.', description: 'Description', dimension: 'Dimension', + distance: 'Distance', drop_index: "Supprimer l'index", edit: 'Editer', email: 'Courriel', @@ -94,6 +101,7 @@ export default { name: 'Nom', natural_resource_constituants: 'Ressources naturelles constituants', natural_resources: 'Ressources naturelles', + no_building_element_materials: "Pas d'information sur les matériaux", no_building_elements: 'Aucun élément de bâtiment', no_results: 'Aucun résultat', other: 'Autre', @@ -136,6 +144,7 @@ export default { vapor_diffusion_resistance_hint: 'µ', vapor_diffusion_resistance: "Resistance à la diffusion de vapeur d'eau", website: 'Site web', + weight: 'Poids', write: 'Ecrire', year_of_construction: 'Année de construction', zone: 'Zone', diff --git a/admin/src/models.ts b/admin/src/models.ts index dc5bc6c..f11084f 100644 --- a/admin/src/models.ts +++ b/admin/src/models.ts @@ -141,11 +141,22 @@ export interface TechnicalConstruction extends PhysicalEntity { building_material_ids?: number[]; } +export interface BuildingElementMaterial { + id?: number; + distance?: number; + weight?: number; + + // draft + building_element_id?: number; + building_material_id?: number; +} + export interface BuildingElement { id?: number; building?: Building; technical_construction?: TechnicalConstruction; professionals?: Professional[]; + materials?: BuildingElementMaterial[]; // draft building_id?: number; diff --git a/admin/src/stores/services.ts b/admin/src/stores/services.ts index 389c9bb..b3ca4f6 100644 --- a/admin/src/stores/services.ts +++ b/admin/src/stores/services.ts @@ -13,13 +13,7 @@ import { Query } from 'src/components/models'; const authStore = useAuthStore(); export class Service< - Type extends - | NaturalResource - | TechnicalConstruction - | BuildingMaterial - | Building - | Professional - | BuildingElement, + Type extends NaturalResource | TechnicalConstruction | BuildingMaterial | Building | Professional | BuildingElement, > { constructor( public entityType: Type, @@ -39,14 +33,12 @@ export class Service< } async get(id: string): Promise { - return api.get(`/${this.entityName}/${id}`); + return api.get(`/${this.entityName}/${id}`).then((res) => res.data); } async find(query: Query | undefined) { const range = [query?.$skip || 0, query?.$limit || 10 - 1]; - const sort = query?.$sort - ? [query?.$sort[0], query?.$sort[1] ? 'DESC' : 'ASC'] - : ['id', 'ASC']; + const sort = query?.$sort ? [query?.$sort[0], query?.$sort[1] ? 'DESC' : 'ASC'] : ['id', 'ASC']; return api .get(`/${this.entityName}/`, { params: { @@ -98,9 +90,7 @@ export class Service< type: this.entityName, }, }; - return api - .post('/search/_index', {}, config) - .then((res) => res.data[this.entityName]); + return api.post('/search/_index', {}, config).then((res) => res.data[this.entityName]); }); } } @@ -108,14 +98,7 @@ export class Service< export const useServices = defineStore('services', () => { function make( entityName: string, - ): Service< - | NaturalResource - | TechnicalConstruction - | BuildingMaterial - | Building - | Professional - | BuildingElement - > { + ): Service { let entityType; switch (entityName) { case 'natural-resource': diff --git a/admin/src/utils/geocoder.ts b/admin/src/utils/geocoder.ts index a014586..c5fc71f 100644 --- a/admin/src/utils/geocoder.ts +++ b/admin/src/utils/geocoder.ts @@ -84,13 +84,14 @@ export const geocoderApi = { export function toAddress(feature: Feature) { let text = ''; if (feature.properties?.address) { + const withHouseNumber = Object.keys(feature.properties.address).includes('house_number'); ['amenity', 'office', 'road', 'house_number', 'postcode', 'village', 'town', 'city', 'country_code'].forEach( (key) => { if (feature.properties?.address[key]) { const val = feature.properties.address[key]; text += (['country_code'].includes(key) ? val.toUpperCase() : val) + - (['amenity', 'office'].includes(key) ? ', ' : ' '); + (['amenity', 'office', withHouseNumber ? 'house_number' : 'road'].includes(key) ? ', ' : ' '); } }, ); diff --git a/backend/api/main.py b/backend/api/main.py index e690f2a..6bfabad 100644 --- a/backend/api/main.py +++ b/backend/api/main.py @@ -14,6 +14,7 @@ from api.views.building_elements import router as building_elements_router from api.views.taxonomy import router as taxonomy_router from api.views.search import router as search_router +from titiler.core.factory import TilerFactory basicConfig(level=DEBUG) @@ -111,3 +112,7 @@ async def get_health( prefix="/search", tags=["Search"], ) + +# Create TilerFactory instance for COGs +cog = TilerFactory() +app.include_router(cog.router, prefix="/cog", tags=["Maps"]) diff --git a/backend/api/models/domain.py b/backend/api/models/domain.py index 82a5e7f..347a80a 100644 --- a/backend/api/models/domain.py +++ b/backend/api/models/domain.py @@ -240,8 +240,29 @@ class BuildingElement(BuildingElementBase, table=True): back_populates="building_elements") professionals: List["Professional"] = Relationship( back_populates="building_elements", link_model=BuildingElementProfessional) + materials: List["BuildingElementMaterial"] = Relationship( + back_populates="building_element", cascade_delete=True) +class BuildingElementMaterialBase(SQLModel): + distance: Optional[float] = Field(default=None) + weight: Optional[float] = Field(default=None) + building_element_id: Optional[int] = Field( + default=None, foreign_key="buildingelement.id", ondelete="CASCADE") + building_material_id: Optional[int] = Field( + default=None, foreign_key="buildingmaterial.id", ondelete="CASCADE") + + +class BuildingElementMaterial(BuildingElementMaterialBase, table=True): + id: Optional[int] = Field( + default=None, + nullable=False, + primary_key=True, + index=True, + ) + building_element: Optional["BuildingElement"] = Relationship( + back_populates="materials") + # Buildings diff --git a/backend/api/models/query.py b/backend/api/models/query.py index f658184..4e44e16 100644 --- a/backend/api/models/query.py +++ b/backend/api/models/query.py @@ -1,6 +1,6 @@ from typing import List, Optional, Dict from sqlmodel import Field -from api.models.domain import NaturalResource, NaturalResourceBase, BuildingMaterial, BuildingMaterialBase, TechnicalConstruction, TechnicalConstructionBase, BuildingBase, Professional, ProfessionalBase, BuildingElement, BuildingElementBase +from api.models.domain import NaturalResource, NaturalResourceBase, BuildingMaterial, BuildingMaterialBase, TechnicalConstruction, TechnicalConstructionBase, BuildingBase, Professional, ProfessionalBase, BuildingElement, BuildingElementBase, BuildingElementMaterial, BuildingElementMaterialBase from enacit4r_sql.models.query import ListResult # Natural resources @@ -53,11 +53,28 @@ class TechnicalConstructionResult(ListResult): # Building elements +class BuildingElementMaterialDraft(BuildingElementMaterialBase): + id: Optional[int] = Field(default=None) + building_element_id: Optional[int] = Field(default=None) + building_material_id: Optional[int] = Field(default=None) + + +class BuildingElementMaterialRead(BuildingElementMaterialBase): + id: Optional[int] = Field(default=None) + building_element: BuildingElementBase = None + building_material: BuildingMaterial = None + + +class BuildingElementMaterialResult(ListResult): + data: List[BuildingElementMaterialRead] = [] + + class BuildingElementDraft(BuildingElementBase): id: Optional[int] = Field(default=None) building_id: Optional[int] = Field(default=None) technical_construction_id: Optional[int] = Field(default=None) professional_ids: List[int] = None + materials: List[BuildingElementMaterialDraft] = None class BuildingElementRead(BuildingElementBase): @@ -65,11 +82,13 @@ class BuildingElementRead(BuildingElementBase): technical_construction: TechnicalConstruction = None building: BuildingBase = None professionals: List[Professional] = None + materials: List[BuildingElementMaterial] = None class BuildingElementResult(ListResult): data: List[BuildingElementRead] = [] + # Buildings diff --git a/backend/api/services/building_element_materials.py b/backend/api/services/building_element_materials.py new file mode 100644 index 0000000..6afbd08 --- /dev/null +++ b/backend/api/services/building_element_materials.py @@ -0,0 +1,114 @@ +from logging import debug +from api.db import AsyncSession +from sqlalchemy.sql import text +from sqlalchemy.orm import selectinload +from sqlmodel import select +from fastapi import HTTPException +from api.models.domain import BuildingElementMaterial, BuildingElementMaterial, BuildingElement, BuildingMaterial +from api.models.query import BuildingElementMaterialResult, BuildingElementMaterialDraft +from enacit4r_sql.utils.query import QueryBuilder + + +class BuildingElementMaterialQueryBuilder(QueryBuilder): + + def build_count_query_with_joins(self, filter): + query = self.build_count_query() + query = self._apply_joins(query, filter) + return query + + def build_query_with_joins(self, total_count, filter, fields=None): + start, end, query = self.build_query(total_count, fields) + query = self._apply_joins(query, filter) + return start, end, query + + def _apply_joins(self, query, filter): + query = query.distinct() + return query + + +class BuildingElementMaterialService: + + def __init__(self, session: AsyncSession): + self.session = session + self.folder = "building-element-materials" + + async def count(self) -> int: + """Count all building element materials""" + count = (await self.session.exec(text("select count(id) from BuildingElementMaterial"))).scalar() + return count + + async def get(self, id: int) -> BuildingElementMaterial: + """Get a building element material by id""" + res = await self.session.exec( + select(BuildingElementMaterial).where( + BuildingElementMaterial.id == id)) + entity = res.one_or_none() + if not entity: + raise HTTPException( + status_code=404, detail="Building element material not found") + return entity + + async def delete(self, id: int) -> BuildingElementMaterial: + """Delete a building element material by id""" + res = await self.session.exec( + select(BuildingElementMaterial) + .where(BuildingElementMaterial.id == id)) + entity = res.one_or_none() + if not entity: + raise HTTPException( + status_code=404, detail="Building element material not found") + await self.session.delete(entity) + await self.session.commit() + return entity + + async def find(self, filter: dict, fields: list, sort: list, range: list) -> BuildingElementMaterialResult: + """Get all building element materials matching filter and range""" + builder = BuildingElementMaterialQueryBuilder(BuildingElementMaterial, filter, sort, range, { + "$building_element": BuildingElement, + "$building_material": BuildingMaterial, + }) + + # Do a query to satisfy total count + count_query = builder.build_count_query_with_joins(filter) + total_count_query = await self.session.exec(count_query) + total_count = total_count_query.one() + + # Main query + start, end, query = builder.build_query_with_joins( + total_count, filter, fields) + + # Execute query + results = await self.session.exec(query) + entities = results.all() + + return BuildingElementMaterialResult( + total=total_count, + skip=start, + limit=end - start + 1, + data=entities + ) + + async def create(self, payload: BuildingElementMaterialDraft) -> BuildingElementMaterial: + """Create a new building element material""" + entity = BuildingElementMaterial(**payload.model_dump()) + # handle relationships + self.session.add(entity) + await self.session.commit() + return entity + + async def update(self, id: int, payload: BuildingElementMaterialDraft) -> BuildingElementMaterial: + """Update a building element material""" + res = await self.session.exec( + select(BuildingElementMaterial) + .where(BuildingElementMaterial.id == id)) + entity = res.one_or_none() + if not entity: + raise HTTPException( + status_code=404, detail="Building element material not found") + for key, value in payload.model_dump().items(): + debug(f"{key}: {value}") + if key not in ["id", "building_element_id", "building_material_id"]: + setattr(entity, key, value) + # handle relationships + await self.session.commit() + return entity diff --git a/backend/api/services/building_elements.py b/backend/api/services/building_elements.py index 14c111c..a5939a3 100644 --- a/backend/api/services/building_elements.py +++ b/backend/api/services/building_elements.py @@ -4,8 +4,9 @@ from sqlalchemy.orm import selectinload from sqlmodel import select from fastapi import HTTPException -from api.models.domain import BuildingElement, BuildingElement, TechnicalConstruction, Building, Professional -from api.models.query import BuildingElementResult, BuildingElementDraft +from api.models.domain import BuildingElement, BuildingElement, TechnicalConstruction, Building, Professional, BuildingElementMaterial +from api.models.query import BuildingElementResult, BuildingElementDraft, BuildingElementMaterialDraft +from api.services.building_element_materials import BuildingElementMaterialService from enacit4r_sql.utils.query import QueryBuilder @@ -22,7 +23,8 @@ def build_query_with_joins(self, total_count, filter, fields=None): if fields is None or len(fields) == 0: query = query.options(selectinload(BuildingElement.technical_construction), selectinload(BuildingElement.building), - selectinload(BuildingElement.professionals)) + selectinload(BuildingElement.professionals), + selectinload(BuildingElement.materials)) return start, end, query def _apply_joins(self, query, filter): @@ -63,6 +65,7 @@ async def delete(self, id: int) -> BuildingElement: raise HTTPException( status_code=404, detail="Building element not found") entity.professionals.clear() + entity.materials.clear() await self.session.delete(entity) await self.session.commit() return entity @@ -96,6 +99,8 @@ async def find(self, filter: dict, fields: list, sort: list, range: list) -> Bui async def create(self, payload: BuildingElementDraft) -> BuildingElement: """Create a new building element""" + materials = [*payload.materials] + payload.materials.clear() entity = BuildingElement(**payload.model_dump()) # handle relationships new_pros = await self._get_professionals(payload.professional_ids) @@ -103,6 +108,8 @@ async def create(self, payload: BuildingElementDraft) -> BuildingElement: entity.professionals.extend(new_pros) self.session.add(entity) await self.session.commit() + # handle building elements + await self._apply_building_element_materials(entity.id, payload.materials) return entity async def update(self, id: int, payload: BuildingElementDraft) -> BuildingElement: @@ -110,21 +117,41 @@ async def update(self, id: int, payload: BuildingElementDraft) -> BuildingElemen res = await self.session.exec( select(BuildingElement) .where(BuildingElement.id == id) - .options(selectinload(BuildingElement.professionals))) + .options(selectinload(BuildingElement.professionals), selectinload(BuildingElement.materials))) entity = res.one_or_none() if not entity: raise HTTPException( status_code=404, detail="Building element not found") for key, value in payload.model_dump().items(): debug(f"{key}: {value}") - if key not in ["id", "building_id", "technical_construction_id", "professional_ids"]: + if key not in ["id", "building_id", "technical_construction_id", "professional_ids", "materials"]: setattr(entity, key, value) # handle relationships new_pros = await self._get_professionals(payload.professional_ids) entity.professionals.clear() entity.professionals.extend(new_pros) await self.session.commit() + # handle building element materials + await self._apply_building_element_materials(entity.id, payload.materials) return entity async def _get_professionals(self, ids: list[int]): return await self.session.exec(select(Professional).filter(Professional.id.in_(ids))) + + async def _apply_building_element_materials(self, building_element_id: int, materials: list[BuildingElementMaterialDraft]): + bem_service = BuildingElementMaterialService(self.session) + # look up building elements for this building + res = await bem_service.find({"building_element_id": building_element_id}, [], [], []) + bems = res.data + updated_ids = [mat.id for mat in materials if mat.id is not None] + # delete building elements that are not in the new list + for bem in bems: + if bem.id not in updated_ids: + await bem_service.delete(bem.id) + # create/update building elements + for mat in materials: + mat.building_element_id = building_element_id + if mat.id is None: + await bem_service.create(mat) + else: + await bem_service.update(mat.id, mat) diff --git a/backend/api/services/buildings.py b/backend/api/services/buildings.py index 5243986..c8f0886 100644 --- a/backend/api/services/buildings.py +++ b/backend/api/services/buildings.py @@ -4,7 +4,7 @@ from sqlalchemy.orm import selectinload from sqlmodel import select from fastapi import HTTPException -from api.models.domain import FileItem, Building, BuildingMaterial, BuildingElement, Professional, BuildingBuildingMaterial, ProfessionalBuilding +from api.models.domain import FileItem, Building, BuildingMaterial, BuildingElement, BuildingElementProfessional, BuildingElementMaterial, Professional, BuildingBuildingMaterial, ProfessionalBuilding from api.models.query import BuildingDraft, BuildingResult, BuildingElementDraft from api.services.building_elements import BuildingElementService from enacit4r_sql.utils.query import QueryBuilder @@ -236,15 +236,33 @@ def _makeTags(self, entity: Building) -> list[str]: return tags async def _makeRelations(self, entity: Building) -> list[str]: + # building materials relations = (await self.session.exec(select(BuildingBuildingMaterial).where(BuildingBuildingMaterial.building_id == entity.id))).all() relates_to = [ f"building-material:{rel.building_material_id}" for rel in relations] + # professionals relations = (await self.session.exec(select(ProfessionalBuilding).where(ProfessionalBuilding.building_id == entity.id))).all() relates_to.extend( [f"professional:{rel.professional_id}" for rel in relations]) + # building elements relations = (await self.session.exec(select(BuildingElement).where(BuildingElement.building_id == entity.id))).all() relates_to.extend( [f"technical-construction:{rel.technical_construction_id}" for rel in relations]) + be_ids = [rel.id for rel in relations] + # building elelement professionals + for be_id in be_ids: + relations = (await self.session.exec(select(BuildingElementProfessional).where(BuildingElementProfessional.building_element_id == be_id))).all() + for rel in relations: + pid = f"professional:{rel.professional_id}" + if pid not in relates_to: + relates_to.append(pid) + for be_id in be_ids: + relations = (await self.session.exec(select(BuildingElementMaterial).where(BuildingElementMaterial.building_element_id == be_id))).all() + for rel in relations: + bmid = f"building-material:{rel.building_material_id}" + if bmid not in relates_to: + relates_to.append(bmid) + return relates_to async def _get_building_materials(self, ids: list[int]): diff --git a/backend/api/services/search.py b/backend/api/services/search.py index 32bece4..f06450b 100644 --- a/backend/api/services/search.py +++ b/backend/api/services/search.py @@ -108,6 +108,8 @@ def updateEntity(self, entity_type: str, entity, tags: list[str], relates_to: li doc["entity_type"] = entity_type doc["tags"] = tags doc["relates_to"] = relates_to + if "long" in doc and "lat" in doc: + doc["location"] = {"lat": doc["lat"], "lon": doc["long"]} self._updateDocument(doc_id, doc) def deleteEntity(self, entity_type: str, entity_id: int): diff --git a/backend/api/services/technical_constructions.py b/backend/api/services/technical_constructions.py index 0d9ef47..d59ac71 100644 --- a/backend/api/services/technical_constructions.py +++ b/backend/api/services/technical_constructions.py @@ -68,8 +68,9 @@ async def count(self) -> int: async def get(self, id: int) -> TechnicalConstruction: """Get a technical construction by id""" res = await self.session.exec( - select(TechnicalConstruction).where( - TechnicalConstruction.id == id)) + select(TechnicalConstruction) + .where(TechnicalConstruction.id == id) + .options(selectinload(TechnicalConstruction.building_materials))) entity = res.one_or_none() if not entity: raise HTTPException( diff --git a/backend/api/views/search.py b/backend/api/views/search.py index 7238141..a4deb85 100644 --- a/backend/api/views/search.py +++ b/backend/api/views/search.py @@ -125,6 +125,8 @@ async def find_entities( fields: List[str] = Query( ["entity_type", "tags", "id", "name", "description", "files", "location", "relates_to"]), exists: List[str] = Query([]), # filter documents with a non-empty field + # filter documents within the bounding box: top, left, bottom, right + bbox: List[float] = Query(None), # filter documents related to the given ids relates: List[str] = Query(None), skip: int = Query(0), @@ -138,6 +140,7 @@ async def find_entities( mustQueries.append(make_text_criteria(text, ENTITY_ANALYZED_FIELDS)) mustQueries.extend(make_tags_criteria(tags)) mustQueries.extend(make_exists_criteria(exists)) + mustQueries.extend(make_bbox_criteria(bbox)) if relates: mustQueries.append({"terms": {"relates_to": relates}}) @@ -186,3 +189,11 @@ def make_exists_criteria(exists: List[str]): for field in exists: mustQueries.append({"exists": {"field": field}}) return mustQueries + + +def make_bbox_criteria(bbox: List[float]): + mustQueries = [] + if bbox and len(bbox) == 4: + mustQueries.append( + {"geo_shape": {"location": {"shape": {"type": "envelope", "coordinates": [[bbox[0], bbox[1]], [bbox[2], bbox[3]]]}}}}) + return mustQueries diff --git a/backend/api/views/technical_constructions.py b/backend/api/views/technical_constructions.py index b2c626f..843fa6f 100644 --- a/backend/api/views/technical_constructions.py +++ b/backend/api/views/technical_constructions.py @@ -2,7 +2,7 @@ from api.db import get_session, AsyncSession from api.auth import kc_service, User from api.models.domain import TechnicalConstruction -from api.models.query import TechnicalConstructionResult, TechnicalConstructionDraft +from api.models.query import TechnicalConstructionResult, TechnicalConstructionDraft, TechnicalConstructionRead from api.services.technical_constructions import TechnicalConstructionService from enacit4r_sql.utils.query import validate_params, ValidationError @@ -25,7 +25,7 @@ async def find( raise HTTPException(status_code=400, detail=f"{e}") -@router.get("/{id}", response_model=TechnicalConstruction, response_model_exclude_none=True) +@router.get("/{id}", response_model=TechnicalConstructionRead, response_model_exclude_none=True) async def get(id: int, session: AsyncSession = Depends(get_session)) -> TechnicalConstruction: """Get a technical construction by id""" return await TechnicalConstructionService(session).get(id) diff --git a/backend/migrations/versions/2025_01_23_1516-f179385828f6_be_materials.py b/backend/migrations/versions/2025_01_23_1516-f179385828f6_be_materials.py new file mode 100644 index 0000000..b30c84c --- /dev/null +++ b/backend/migrations/versions/2025_01_23_1516-f179385828f6_be_materials.py @@ -0,0 +1,41 @@ +"""be_materials + +Revision ID: f179385828f6 +Revises: d5618e31618b +Create Date: 2025-01-23 15:16:24.931238 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'f179385828f6' +down_revision: Union[str, None] = 'd5618e31618b' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('buildingelementmaterial', + sa.Column('distance', sa.Float(), nullable=True), + sa.Column('weight', sa.Float(), nullable=True), + sa.Column('building_element_id', sa.Integer(), nullable=True), + sa.Column('building_material_id', sa.Integer(), nullable=True), + sa.Column('id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['building_element_id'], ['buildingelement.id'], ondelete='CASCADE'), + sa.ForeignKeyConstraint(['building_material_id'], ['buildingmaterial.id'], ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_buildingelementmaterial_id'), 'buildingelementmaterial', ['id'], unique=False) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_buildingelementmaterial_id'), table_name='buildingelementmaterial') + op.drop_table('buildingelementmaterial') + # ### end Alembic commands ### diff --git a/backend/poetry.lock b/backend/poetry.lock index 8980789..cee8263 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -1,5 +1,20 @@ # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +[[package]] +name = "affine" +version = "2.4.0" +description = "Matrices describing affine transformation of the plane" +optional = false +python-versions = ">=3.7" +files = [ + {file = "affine-2.4.0-py3-none-any.whl", hash = "sha256:8a3df80e2b2378aef598a83c1392efd47967afec4242021a0b06b4c7cbc61a92"}, + {file = "affine-2.4.0.tar.gz", hash = "sha256:a24d818d6a836c131976d22f8c27b8d3ca32d0af64c1d8d29deb7bafa4da1eea"}, +] + +[package.extras] +dev = ["coveralls", "flake8", "pydocstyle"] +test = ["pytest (>=4.6)", "pytest-cov"] + [[package]] name = "aiobotocore" version = "2.17.0" @@ -341,6 +356,17 @@ urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version > [package.extras] crt = ["awscrt (==0.22.0)"] +[[package]] +name = "cachetools" +version = "5.5.1" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.5.1-py3-none-any.whl", hash = "sha256:b76651fdc3b24ead3c648bbdeeb940c1b04d365b38b4af66788f9ec4a81d42bb"}, + {file = "cachetools-5.5.1.tar.gz", hash = "sha256:70f238fbba50383ef62e55c6aff6d9673175fe59f7c6782c7a0b9e38f4a9df95"}, +] + [[package]] name = "certifi" version = "2024.12.14" @@ -546,6 +572,87 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} +[[package]] +name = "click-plugins" +version = "1.1.1" +description = "An extension module for click to enable registering CLI commands via setuptools entry-points." +optional = false +python-versions = "*" +files = [ + {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, + {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, +] + +[package.dependencies] +click = ">=4.0" + +[package.extras] +dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"] + +[[package]] +name = "cligj" +version = "0.7.2" +description = "Click params for commmand line interfaces to GeoJSON" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" +files = [ + {file = "cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df"}, + {file = "cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27"}, +] + +[package.dependencies] +click = ">=4.0" + +[package.extras] +test = ["pytest-cov"] + +[[package]] +name = "color-operations" +version = "0.1.6" +description = "Apply basic color-oriented image operations." +optional = false +python-versions = ">=3.8" +files = [ + {file = "color_operations-0.1.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7264b5f169592b281a0991a882dec386a5e6078b70b997dff2476d6e80f3e319"}, + {file = "color_operations-0.1.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:afa2dad4200acaf117e6c845dff688d048bc309ec45f8053456d2a1d951eb765"}, + {file = "color_operations-0.1.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a40662ec99a9448d236b501198086c86d767574be92541aac496975bde0bc374"}, + {file = "color_operations-0.1.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84b78262df0897ceafc247fb5ab322f18bdc9d1c1094d02e697494c4a30bed69"}, + {file = "color_operations-0.1.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d622bcce88698738ee5a9da5f47fb54193f8fd873f91f79b12b614d10982fd38"}, + {file = "color_operations-0.1.6-cp310-cp310-win_amd64.whl", hash = "sha256:67dbd95c3d2d5be91c41bfde7a66a538a0c5d42a1a36e900c2718aca320e9912"}, + {file = "color_operations-0.1.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:65662664bb1d39e4d48a16ccd010e4fd2281a5abb7102ebf1d65245319ee1268"}, + {file = "color_operations-0.1.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6faaa11e03fa88cdf3564a6abaadd02068c7f88df968cefa3bd33d1a1e30d6c2"}, + {file = "color_operations-0.1.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbe49f8b91ed0c93dd1c5ec4baa144fcfe6a70ecaa81d9ca8c8ae2ad84dc560e"}, + {file = "color_operations-0.1.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3770e4e7bd0a972a65c5df313d5e32532db42b2f10898c417f769de93a7ba167"}, + {file = "color_operations-0.1.6-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c6d499de4d820183e9a0599b6e9ad445b7bc84c50c9162e7c3ba05660c34a668"}, + {file = "color_operations-0.1.6-cp311-cp311-win_amd64.whl", hash = "sha256:5c6d35dc7c194595b1391e0ccc2e38cbd7cb87be37dd27ed49a058bb7c1a5442"}, + {file = "color_operations-0.1.6-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:906316d4e67d057496d4547a8050f1c555c49d712e0f4f79908ee5da8ca7aef3"}, + {file = "color_operations-0.1.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e6fce57bcda78a871b58b30df05b478c4b2da9736ef500554bb1c9c41e02aca2"}, + {file = "color_operations-0.1.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c0d3fb1085d83f0082a223901a91325a68b8d03b10ed9d40881d4489dcc641f0"}, + {file = "color_operations-0.1.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:715672ee6d827d4b068f7558f9e473de54eafced3c9a195641b0cf39d9aea700"}, + {file = "color_operations-0.1.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59b6fea23da0d19afc15bb56c4707275d5ac6c7fd27936c5c64fcdf628c82a53"}, + {file = "color_operations-0.1.6-cp312-cp312-win_amd64.whl", hash = "sha256:375226cdc52b8b3fe576efb47e0fb4b3dc2c9a8ecbb82c208e86df7153a76882"}, + {file = "color_operations-0.1.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:229bc1a5a1128a9b7d51a85a5b8917d81baf8d334cbfe9213a7c4eaf736bbc0d"}, + {file = "color_operations-0.1.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:952f2135c4f36e1e6e33518b6b7ad4d395a51d065c3f09a61a6b77ea3588e28e"}, + {file = "color_operations-0.1.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1ecc7f0d455162cf11b8e02abd84585405050e0d54a62f77523e246690c291e2"}, + {file = "color_operations-0.1.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fee2c397ac0c0a2c5c686d5ce9a28b4f9b8106f3101d0c4e3718cebbf1c341cf"}, + {file = "color_operations-0.1.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:848a7e0956ba253616cd9cc2fc57da11f84574ca59ac24ef12734169189d61ab"}, + {file = "color_operations-0.1.6-cp38-cp38-win_amd64.whl", hash = "sha256:c80718220406fb55ca76de69f6c4793d662b01c31091ebbf77a13a1212e860b8"}, + {file = "color_operations-0.1.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d662746b8f6f8fe4923d9b351bcc61bf5ec8c6fd5fb108318f42928112106e13"}, + {file = "color_operations-0.1.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fed53f386e25cd68e4c75dc75839099f6fd14f5e590450ce4402ab0f1cb85356"}, + {file = "color_operations-0.1.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:519e363f7bcc61c057f3b5b5f80bbe0c290f9d3295624027826b345845649ede"}, + {file = "color_operations-0.1.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d96ba7b9fbc33bd43219f205c12b1f857429ba584fd2136d7c860132e64f228b"}, + {file = "color_operations-0.1.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcf49ac4e3f6fe8069a4ae1c2f69662557758bec4d285517bd4ed8c9dcfa1a08"}, + {file = "color_operations-0.1.6-cp39-cp39-win_amd64.whl", hash = "sha256:e42a392b22fc8135746ce9cb47c14f9a5d7153ceefac13d740d954f9bc18a034"}, + {file = "color_operations-0.1.6.tar.gz", hash = "sha256:9b5ff7409d189b8254a3524fc78202e2db4021be973592875d61722abe027ec6"}, +] + +[package.dependencies] +numpy = "*" + +[package.extras] +dev = ["bump-my-version", "pre-commit"] +test = ["colormath (==2.0.2)", "pytest", "pytest-cov"] + [[package]] name = "colorama" version = "0.4.6" @@ -878,6 +985,25 @@ files = [ {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"}, ] +[[package]] +name = "geojson-pydantic" +version = "1.2.0" +description = "Pydantic data models for the GeoJSON spec." +optional = false +python-versions = ">=3.9" +files = [ + {file = "geojson_pydantic-1.2.0-py3-none-any.whl", hash = "sha256:30f469d05f7f73dcac5f995579209d1ae74a148c0724018fa9492675e05eebf6"}, + {file = "geojson_pydantic-1.2.0.tar.gz", hash = "sha256:eb5c61d3106a28bc71c936ef4cb44f36025db314059217063fee87d82e50cc81"}, +] + +[package.dependencies] +pydantic = ">=2.0,<3.0" + +[package.extras] +dev = ["bump-my-version", "pre-commit"] +docs = ["mkdocs", "mkdocs-material", "pygments"] +test = ["pytest", "pytest-cov", "shapely"] + [[package]] name = "greenlet" version = "3.1.1" @@ -1034,6 +1160,23 @@ files = [ [package.extras] all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] +[[package]] +name = "jinja2" +version = "3.1.5" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, + {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + [[package]] name = "jmespath" version = "1.0.1" @@ -1219,6 +1362,29 @@ files = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "morecantile" +version = "6.2.0" +description = "Construct and use map tile grids (a.k.a TileMatrixSet / TMS)." +optional = false +python-versions = ">=3.8" +files = [ + {file = "morecantile-6.2.0-py3-none-any.whl", hash = "sha256:a3cc8f85c6afcddb6c2ec933ad692557f96e89689730dbbd4350bdcf6ac52be0"}, + {file = "morecantile-6.2.0.tar.gz", hash = "sha256:65c7150ea68bbe16ee6f75f3f171ac1ae51ab26e7a77c92a768048f40f916412"}, +] + +[package.dependencies] +attrs = "*" +pydantic = ">=2.0,<3.0" +pyproj = ">=3.1,<4.0" + +[package.extras] +benchmark = ["pytest", "pytest-benchmark"] +dev = ["bump-my-version", "pre-commit"] +docs = ["griffe-inherited-docstrings (>=1.0.0)", "mkdocs (>=1.4.3)", "mkdocs-material[imaging] (>=9.5)", "mkdocstrings[python] (>=0.25.1)", "pygments"] +rasterio = ["rasterio (>=1.2.1)"] +test = ["mercantile", "pytest", "pytest-cov", "rasterio (>=1.2.1)"] + [[package]] name = "multidict" version = "6.1.0" @@ -1323,6 +1489,118 @@ files = [ [package.dependencies] typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} +[[package]] +name = "numexpr" +version = "2.10.2" +description = "Fast numerical expression evaluator for NumPy" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numexpr-2.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5b0e82d2109c1d9e63fcd5ea177d80a11b881157ab61178ddbdebd4c561ea46"}, + {file = "numexpr-2.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc2b8035a0c2cdc352e58c3875cb668836018065cbf5752cb531015d9a568d8"}, + {file = "numexpr-2.10.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0db5ff5183935d1612653559c319922143e8fa3019007696571b13135f216458"}, + {file = "numexpr-2.10.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15f59655458056fdb3a621b1bb8e071581ccf7e823916c7568bb7c9a3e393025"}, + {file = "numexpr-2.10.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ce8cccf944339051e44a49a124a06287fe3066d0acbff33d1aa5aee10a96abb7"}, + {file = "numexpr-2.10.2-cp310-cp310-win32.whl", hash = "sha256:ba85371c9a8d03e115f4dfb6d25dfbce05387002b9bc85016af939a1da9624f0"}, + {file = "numexpr-2.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:deb64235af9eeba59fcefa67e82fa80cfc0662e1b0aa373b7118a28da124d51d"}, + {file = "numexpr-2.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6b360eb8d392483410fe6a3d5a7144afa298c9a0aa3e9fe193e89590b47dd477"}, + {file = "numexpr-2.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d9a42f5c24880350d88933c4efee91b857c378aaea7e8b86221fff569069841e"}, + {file = "numexpr-2.10.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83fcb11988b57cc25b028a36d285287d706d1f536ebf2662ea30bd990e0de8b9"}, + {file = "numexpr-2.10.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4213a92efa9770bc28e3792134e27c7e5c7e97068bdfb8ba395baebbd12f991b"}, + {file = "numexpr-2.10.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebdbef5763ca057eea0c2b5698e4439d084a0505d9d6e94f4804f26e8890c45e"}, + {file = "numexpr-2.10.2-cp311-cp311-win32.whl", hash = "sha256:3bf01ec502d89944e49e9c1b5cc7c7085be8ca2eb9dd46a0eafd218afbdbd5f5"}, + {file = "numexpr-2.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:e2d0ae24b0728e4bc3f1d3f33310340d67321d36d6043f7ce26897f4f1042db0"}, + {file = "numexpr-2.10.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5323a46e75832334f1af86da1ef6ff0add00fbacdd266250be872b438bdf2be"}, + {file = "numexpr-2.10.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a42963bd4c62d8afa4f51e7974debfa39a048383f653544ab54f50a2f7ec6c42"}, + {file = "numexpr-2.10.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5191ba8f2975cb9703afc04ae845a929e193498c0e8bcd408ecb147b35978470"}, + {file = "numexpr-2.10.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:97298b14f0105a794bea06fd9fbc5c423bd3ff4d88cbc618860b83eb7a436ad6"}, + {file = "numexpr-2.10.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9d7805ccb6be2d3b0f7f6fad3707a09ac537811e8e9964f4074d28cb35543db"}, + {file = "numexpr-2.10.2-cp312-cp312-win32.whl", hash = "sha256:cb845b2d4f9f8ef0eb1c9884f2b64780a85d3b5ae4eeb26ae2b0019f489cd35e"}, + {file = "numexpr-2.10.2-cp312-cp312-win_amd64.whl", hash = "sha256:57b59cbb5dcce4edf09cd6ce0b57ff60312479930099ca8d944c2fac896a1ead"}, + {file = "numexpr-2.10.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a37d6a51ec328c561b2ca8a2bef07025642eca995b8553a5267d0018c732976d"}, + {file = "numexpr-2.10.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:81d1dde7dd6166d8ff5727bb46ab42a6b0048db0e97ceb84a121334a404a800f"}, + {file = "numexpr-2.10.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5b3f814437d5a10797f8d89d2037cca2c9d9fa578520fc911f894edafed6ea3e"}, + {file = "numexpr-2.10.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9309f2e43fe6e4560699ef5c27d7a848b3ff38549b6b57194207cf0e88900527"}, + {file = "numexpr-2.10.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ebb73b93f5c4d6994f357fa5a47a9f7a5485577e633b3c46a603cb01445bbb19"}, + {file = "numexpr-2.10.2-cp313-cp313-win32.whl", hash = "sha256:ec04c9a3c050c175348801e27c18c68d28673b7bfb865ef88ce333be523bbc01"}, + {file = "numexpr-2.10.2-cp313-cp313-win_amd64.whl", hash = "sha256:d7a3fc83c959288544db3adc70612475d8ad53a66c69198105c74036182d10dd"}, + {file = "numexpr-2.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0495f8111c3633e265248709b8b3b521bbfa646ba384909edd10e2b9a588a83a"}, + {file = "numexpr-2.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2aa05ac71bee3b1253e73173c4d7fa96a09a18970c0226f1c2c07a71ffe988dc"}, + {file = "numexpr-2.10.2-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3a23c3002ab330056fbdd2785871937a6f2f2fa85d06c8d0ff74ea8418119d1"}, + {file = "numexpr-2.10.2-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a018a7d81326f4c73d8b5aee61794d7d8514512f43957c0db61eb2a8a86848c7"}, + {file = "numexpr-2.10.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:037859b17a0abe2b489d4c2cfdadd2bf458ec80dd83f338ea5544c7987e06b85"}, + {file = "numexpr-2.10.2-cp39-cp39-win32.whl", hash = "sha256:eb278ccda6f893a312aa0452701bb17d098b7b14eb7c9381517d509cce0a39a3"}, + {file = "numexpr-2.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:734b64c6d6a597601ce9d0ef7b666e678ec015b446f1d1412c23903c021436c3"}, + {file = "numexpr-2.10.2.tar.gz", hash = "sha256:b0aff6b48ebc99d2f54f27b5f73a58cb92fde650aeff1b397c71c8788b4fff1a"}, +] + +[package.dependencies] +numpy = ">=1.23.0" + +[[package]] +name = "numpy" +version = "2.2.2" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.10" +files = [ + {file = "numpy-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7079129b64cb78bdc8d611d1fd7e8002c0a2565da6a47c4df8062349fee90e3e"}, + {file = "numpy-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ec6c689c61df613b783aeb21f945c4cbe6c51c28cb70aae8430577ab39f163e"}, + {file = "numpy-2.2.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:40c7ff5da22cd391944a28c6a9c638a5eef77fcf71d6e3a79e1d9d9e82752715"}, + {file = "numpy-2.2.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:995f9e8181723852ca458e22de5d9b7d3ba4da3f11cc1cb113f093b271d7965a"}, + {file = "numpy-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78ea78450fd96a498f50ee096f69c75379af5138f7881a51355ab0e11286c97"}, + {file = "numpy-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fbe72d347fbc59f94124125e73fc4976a06927ebc503ec5afbfb35f193cd957"}, + {file = "numpy-2.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8e6da5cffbbe571f93588f562ed130ea63ee206d12851b60819512dd3e1ba50d"}, + {file = "numpy-2.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:09d6a2032faf25e8d0cadde7fd6145118ac55d2740132c1d845f98721b5ebcfd"}, + {file = "numpy-2.2.2-cp310-cp310-win32.whl", hash = "sha256:159ff6ee4c4a36a23fe01b7c3d07bd8c14cc433d9720f977fcd52c13c0098160"}, + {file = "numpy-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:64bd6e1762cd7f0986a740fee4dff927b9ec2c5e4d9a28d056eb17d332158014"}, + {file = "numpy-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:642199e98af1bd2b6aeb8ecf726972d238c9877b0f6e8221ee5ab945ec8a2189"}, + {file = "numpy-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6d9fc9d812c81e6168b6d405bf00b8d6739a7f72ef22a9214c4241e0dc70b323"}, + {file = "numpy-2.2.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:c7d1fd447e33ee20c1f33f2c8e6634211124a9aabde3c617687d8b739aa69eac"}, + {file = "numpy-2.2.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:451e854cfae0febe723077bd0cf0a4302a5d84ff25f0bfece8f29206c7bed02e"}, + {file = "numpy-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd249bc894af67cbd8bad2c22e7cbcd46cf87ddfca1f1289d1e7e54868cc785c"}, + {file = "numpy-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02935e2c3c0c6cbe9c7955a8efa8908dd4221d7755644c59d1bba28b94fd334f"}, + {file = "numpy-2.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a972cec723e0563aa0823ee2ab1df0cb196ed0778f173b381c871a03719d4826"}, + {file = "numpy-2.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d6d6a0910c3b4368d89dde073e630882cdb266755565155bc33520283b2d9df8"}, + {file = "numpy-2.2.2-cp311-cp311-win32.whl", hash = "sha256:860fd59990c37c3ef913c3ae390b3929d005243acca1a86facb0773e2d8d9e50"}, + {file = "numpy-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:da1eeb460ecce8d5b8608826595c777728cdf28ce7b5a5a8c8ac8d949beadcf2"}, + {file = "numpy-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467"}, + {file = "numpy-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a"}, + {file = "numpy-2.2.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825"}, + {file = "numpy-2.2.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37"}, + {file = "numpy-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748"}, + {file = "numpy-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0"}, + {file = "numpy-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278"}, + {file = "numpy-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba"}, + {file = "numpy-2.2.2-cp312-cp312-win32.whl", hash = "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283"}, + {file = "numpy-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb"}, + {file = "numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc"}, + {file = "numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369"}, + {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd"}, + {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be"}, + {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84"}, + {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff"}, + {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0"}, + {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de"}, + {file = "numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9"}, + {file = "numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369"}, + {file = "numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391"}, + {file = "numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39"}, + {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317"}, + {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49"}, + {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2"}, + {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7"}, + {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb"}, + {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648"}, + {file = "numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4"}, + {file = "numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576"}, + {file = "numpy-2.2.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b0531f0b0e07643eb089df4c509d30d72c9ef40defa53e41363eca8a8cc61495"}, + {file = "numpy-2.2.2-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:e9e82dcb3f2ebbc8cb5ce1102d5f1c5ed236bf8a11730fb45ba82e2841ec21df"}, + {file = "numpy-2.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0d4142eb40ca6f94539e4db929410f2a46052a0fe7a2c1c59f6179c39938d2a"}, + {file = "numpy-2.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:356ca982c188acbfa6af0d694284d8cf20e95b1c3d0aefa8929376fea9146f60"}, + {file = "numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f"}, +] + [[package]] name = "packaging" version = "24.2" @@ -1694,6 +1972,77 @@ azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0 toml = ["tomli (>=2.0.1)"] yaml = ["pyyaml (>=6.0.1)"] +[[package]] +name = "pyparsing" +version = "3.2.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, + {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyproj" +version = "3.7.0" +description = "Python interface to PROJ (cartographic projections and coordinate transformations library)" +optional = false +python-versions = ">=3.10" +files = [ + {file = "pyproj-3.7.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:d5c7e7d24b967e328a5efd013f466804a1f226d1106ac7efc47dcc99360dbc8f"}, + {file = "pyproj-3.7.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:448958c46bd3fe2da91c89ba551ac5835e63073ca861422c6eb1af89979dfab1"}, + {file = "pyproj-3.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f673ca345bb92afc93d4235938ca0c9a76237aa7addf42a95965c8dc8cad9b49"}, + {file = "pyproj-3.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee60895f60cbd1a9c903ab2bc22adea63004296a1c28b8775a11cf50905cf085"}, + {file = "pyproj-3.7.0-cp310-cp310-win32.whl", hash = "sha256:0dd31b0740ee010934234f848d2d092c66146cb8d0ba009a64e41d192caa7686"}, + {file = "pyproj-3.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:7943d85ba39e89c51b920339ff63162d63bf89da161f0acb6206b0d39b11661e"}, + {file = "pyproj-3.7.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:e66d8d42dbdf232e121546c5a1dec097caf0454e4885c09a8e03cdcee0753c03"}, + {file = "pyproj-3.7.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:7764b64a0aefe40134a2828b3a40be88f6c8b7832c45d8a9f2bd592ace4b2a3b"}, + {file = "pyproj-3.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53c442c5081dc95346996f5c4323fde2caafc69c6e60b4707aa46e88244f1e04"}, + {file = "pyproj-3.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc5b305d4d5d7697885681d9b660623e328227612823d5c660e0a9566cb48838"}, + {file = "pyproj-3.7.0-cp311-cp311-win32.whl", hash = "sha256:de2b47d748dc41cccb6b3b713d4d7dc9aa1046a82141c8665026908726426abc"}, + {file = "pyproj-3.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:38cba7c4c5679e40242dd959133e95b908d3b912dd66291094fd13510e8517ff"}, + {file = "pyproj-3.7.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:8cbec92bdd6e9933ca08795c12717d1384e9b51cf4b1acf0d753db255a75c51e"}, + {file = "pyproj-3.7.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8c4a8e4d3ba76c3adac3c087544cf92f7f9a19ea34946904a13fca48cc1c0106"}, + {file = "pyproj-3.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82624fb42aa31f6b1a860fbc0316babd07fd712642bc31022df4e9b4056bf463"}, + {file = "pyproj-3.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34e1bbb3f89c68d4a6835c40b2da8b27680eec60e8cc7cdb08c09bcc725b2b62"}, + {file = "pyproj-3.7.0-cp312-cp312-win32.whl", hash = "sha256:952515d5592167ad4436b355485f82acebed2a49b46722159e4584b75a763dd3"}, + {file = "pyproj-3.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0692f806224e8ed82fe4acfa57268ff444fdaf9f330689f24c0d96e59480cce1"}, + {file = "pyproj-3.7.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:94e8b903a9e83448fd2379c49dec3e8cd83c9ed36f54354e68b601cef56d5426"}, + {file = "pyproj-3.7.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:64cb5c17d6f6305a8b978a40f95560c87c5b363fcac40632337955664437875a"}, + {file = "pyproj-3.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c54e9bdda7ab9c4a5af50f9d6e6ee7704e05fafd504896b96ed1208c7aea098"}, + {file = "pyproj-3.7.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24fa4e9e0abba875f9524808410cc520067eaf38fd5549ed0ef7c43ac39923c9"}, + {file = "pyproj-3.7.0-cp313-cp313-win32.whl", hash = "sha256:b9e8353fc3c79dc14d1f5ac758a1a6e4eee04102c3c0b138670f121f5ac52eb4"}, + {file = "pyproj-3.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:10a8dc6ec61af97c89ff032647d743f8dc023645773da42ef43f7ae1125b3509"}, + {file = "pyproj-3.7.0.tar.gz", hash = "sha256:bf658f4aaf815d9d03c8121650b6f0b8067265c36e31bc6660b98ef144d81813"}, +] + +[package.dependencies] +certifi = "*" + +[[package]] +name = "pystac" +version = "1.12.1" +description = "Python library for working with the SpatioTemporal Asset Catalog (STAC) specification" +optional = false +python-versions = ">=3.10" +files = [ + {file = "pystac-1.12.1-py3-none-any.whl", hash = "sha256:eb46fe63b494cfd1ccf5dfafa9256a1893ef9b6d4ee69373e040e3888270357e"}, + {file = "pystac-1.12.1.tar.gz", hash = "sha256:7735d217c1c596f916d0a048c7bdd08f6bc6cb97369b628fab9b7eba4092fbdd"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" + +[package.extras] +jinja2 = ["jinja2 (<4.0)"] +orjson = ["orjson (>=3.5)"] +urllib3 = ["urllib3 (>=1.26)"] +validation = ["jsonschema (>=4.18,<5.0)"] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -1817,6 +2166,54 @@ files = [ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] +[[package]] +name = "rasterio" +version = "1.4.3" +description = "Fast and direct raster I/O for use with Numpy and SciPy" +optional = false +python-versions = ">=3.9" +files = [ + {file = "rasterio-1.4.3-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:80f994b92e5dda78f13291710bd5c43efcfd164f69a8a2c20489115df9d178c8"}, + {file = "rasterio-1.4.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:1a6e6ca9ec361599b48c9918ce25adb1a9203b8c8ca9b34ad78dccb3aef7945a"}, + {file = "rasterio-1.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b8a4311582274de2346450e5361d092b80b8b5c7b02fda6203402ba101ffabf"}, + {file = "rasterio-1.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:e79847a5a0e01399457a1e02d8c92040cb56729d054fe7796f0c17b246b18bf0"}, + {file = "rasterio-1.4.3-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:9c30114d95ebba4ff49f078b3c193d29ff56d832588649400a3fa78f1dda1c96"}, + {file = "rasterio-1.4.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:812c854e7177064aeb58def2d59752887ad6b3d39ff3f858ed9df3f2ddc95613"}, + {file = "rasterio-1.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54eef32d20a0dfbba59a8bb9828e562c3e9e97e2355b8dfe4a5274117976059f"}, + {file = "rasterio-1.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:4009f7ce4e0883d8e5b400970daa3f1ca309caac8916d955722ee4486654d452"}, + {file = "rasterio-1.4.3-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:e703e4b2c74c678786d5d110a3f30e26f3acfd65f09ccf35f69683a532f7a772"}, + {file = "rasterio-1.4.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:38a126f8dbf405cd3450b5bd10c6cc493a2e1be4cf83442d26f5e4f412372d36"}, + {file = "rasterio-1.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e90c2c300294265c16becc9822337ded0f01fb8664500b4d77890d633d8cd0e"}, + {file = "rasterio-1.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:a962ad4c29feaf38b1d7a94389313127de3646a5b9b734fbf9a04e16051a27ff"}, + {file = "rasterio-1.4.3-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:5d4fcb635379b3d7b2f5e944c153849e3d27e93f35ad73ad4d3f0b8a580f0c8e"}, + {file = "rasterio-1.4.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:98a9c89eade8c779e8ac1e525269faaa18c6b9818fc3c72cfc4627df71c66d0d"}, + {file = "rasterio-1.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9bab1a0bb22b8bed1db34b5258db93d790ed4e61ef21ac055a7c6933c8d5e84"}, + {file = "rasterio-1.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:1839960e2f3057a6daa323ccf67b330f8f2f0dbd4a50cc7031e88e649301c5c0"}, + {file = "rasterio-1.4.3-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:af04f788f6f814569184bd9da6c5d9889512212385ab58c52720dfb1f972671d"}, + {file = "rasterio-1.4.3-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:3f411a6a5bcb81ab6dc9128a8bccd13d3822cfa4a50c239e3a0528751a1ad5fc"}, + {file = "rasterio-1.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:597f8dcf494d0ca4254434496e83b1723fec206d23d64da5751a582a2b01e1d3"}, + {file = "rasterio-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:a702e21712ba237e34515d829847f9f5f06d8e665e864a7bb0a3d4d8f6dec10d"}, + {file = "rasterio-1.4.3.tar.gz", hash = "sha256:201f05dbc7c4739dacb2c78a1cf4e09c0b7265b0a4d16ccbd1753ce4f2af350a"}, +] + +[package.dependencies] +affine = "*" +attrs = "*" +certifi = "*" +click = ">=4.0" +click-plugins = "*" +cligj = ">=0.5" +numpy = ">=1.24" +pyparsing = "*" + +[package.extras] +all = ["boto3 (>=1.2.4)", "fsspec", "ghp-import", "hypothesis", "ipython (>=2.0)", "matplotlib", "numpydoc", "packaging", "pytest (>=2.8.2)", "pytest-cov (>=2.2.0)", "shapely", "sphinx", "sphinx-click", "sphinx-rtd-theme"] +docs = ["ghp-import", "numpydoc", "sphinx", "sphinx-click", "sphinx-rtd-theme"] +ipython = ["ipython (>=2.0)"] +plot = ["matplotlib"] +s3 = ["boto3 (>=1.2.4)"] +test = ["boto3 (>=1.2.4)", "fsspec", "hypothesis", "packaging", "pytest (>=2.8.2)", "pytest-cov (>=2.2.0)", "shapely"] + [[package]] name = "referencing" version = "0.35.1" @@ -1867,6 +2264,39 @@ files = [ [package.dependencies] requests = ">=2.0.1,<3.0.0" +[[package]] +name = "rio-tiler" +version = "7.4.0" +description = "User friendly Rasterio plugin to read raster datasets." +optional = false +python-versions = ">=3.9" +files = [ + {file = "rio_tiler-7.4.0-py3-none-any.whl", hash = "sha256:d275abffb00b9cd788b64ec62589f504506b5c9ffd27f44462e61bb3ee3a7ca2"}, + {file = "rio_tiler-7.4.0.tar.gz", hash = "sha256:8a99d6d7fef1e5e850c48d56403772e9221815fd5c0e8506fa32ed7c77666818"}, +] + +[package.dependencies] +attrs = "*" +cachetools = "*" +color-operations = "*" +httpx = "*" +morecantile = ">=5.0,<7.0" +numexpr = "*" +numpy = "*" +pydantic = ">=2.0,<3.0" +pystac = ">=0.5.4" +rasterio = ">=1.4.0" +typing-extensions = "*" + +[package.extras] +benchmark = ["pytest", "pytest-benchmark"] +dev = ["bump-my-version", "pre-commit"] +docs = ["griffe-inherited-docstrings (>=1.0.0)", "mkdocs (>=1.4.3)", "mkdocs-jupyter (>=0.24.5)", "mkdocs-material[imaging] (>=9.5)", "mkdocstrings[python] (>=0.25.1)", "pygments"] +s3 = ["boto3"] +test = ["boto3", "h5netcdf", "morecantile (>=6.0,<7.0)", "pytest", "pytest-cov", "rioxarray", "xarray"] +tilebench = ["pytest", "tilebench"] +xarray = ["rioxarray", "xarray"] + [[package]] name = "rpds-py" version = "0.22.3" @@ -1979,6 +2409,125 @@ files = [ {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, ] +[[package]] +name = "simplejson" +version = "3.19.3" +description = "Simple, fast, extensible JSON encoder/decoder for Python" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.5" +files = [ + {file = "simplejson-3.19.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f39caec26007a2d0efab6b8b1d74873ede9351962707afab622cc2285dd26ed0"}, + {file = "simplejson-3.19.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:83c87706265ae3028e8460d08b05f30254c569772e859e5ba61fe8af2c883468"}, + {file = "simplejson-3.19.3-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0b5ddd2c7d1d3f4d23224bc8a04bbf1430ae9a8149c05b90f8fc610f7f857a23"}, + {file = "simplejson-3.19.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:ad0e0b1ce9bd3edb5cf64b5b5b76eacbfdac8c5367153aeeec8a8b1407f68342"}, + {file = "simplejson-3.19.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:93be280fc69a952c76e261036312c20b910e7fa9e234f1d89bdfe3fa34f8a023"}, + {file = "simplejson-3.19.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:6d43e24b88c80f997081503f693be832fc90854f278df277dd54f8a4c847ab61"}, + {file = "simplejson-3.19.3-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:2876027ebdd599d730d36464debe84619b0368e9a642ca6e7c601be55aed439e"}, + {file = "simplejson-3.19.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:0766ca6222b410e08e0053a0dda3606cafb3973d5d00538307f631bb59743396"}, + {file = "simplejson-3.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:50d8b742d74c449c4dcac570d08ce0f21f6a149d2d9cf7652dbf2ba9a1bc729a"}, + {file = "simplejson-3.19.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd011fc3c1d88b779645495fdb8189fb318a26981eebcce14109460e062f209b"}, + {file = "simplejson-3.19.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:637c4d4b81825c1f4d651e56210bd35b5604034b192b02d2d8f17f7ce8c18f42"}, + {file = "simplejson-3.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f56eb03bc9e432bb81adc8ecff2486d39feb371abb442964ffb44f6db23b332"}, + {file = "simplejson-3.19.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef59a53be400c1fad2c914b8d74c9d42384fed5174f9321dd021b7017fd40270"}, + {file = "simplejson-3.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72e8abbc86fcac83629a030888b45fed3a404d54161118be52cb491cd6975d3e"}, + {file = "simplejson-3.19.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8efb03ca77bd7725dfacc9254df00d73e6f43013cf39bd37ef1a8ed0ebb5165"}, + {file = "simplejson-3.19.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:add8850db04b98507a8b62d248a326ecc8561e6d24336d1ca5c605bbfaab4cad"}, + {file = "simplejson-3.19.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fc3dc9fb413fc34c396f52f4c87de18d0bd5023804afa8ab5cc224deeb6a9900"}, + {file = "simplejson-3.19.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4dfa420bb9225dd33b6efdabde7c6a671b51150b9b1d9c4e5cd74d3b420b3fe1"}, + {file = "simplejson-3.19.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7b5c472099b39b274dcde27f1113db8d818c9aa3ba8f78cbb8ad04a4c1ac2118"}, + {file = "simplejson-3.19.3-cp310-cp310-win32.whl", hash = "sha256:817abad79241ed4a507b3caf4d3f2be5079f39d35d4c550a061988986bffd2ec"}, + {file = "simplejson-3.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:dd5b9b1783e14803e362a558680d88939e830db2466f3fa22df5c9319f8eea94"}, + {file = "simplejson-3.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e88abff510dcff903a18d11c2a75f9964e768d99c8d147839913886144b2065e"}, + {file = "simplejson-3.19.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:934a50a614fb831614db5dbfba35127ee277624dda4d15895c957d2f5d48610c"}, + {file = "simplejson-3.19.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:212fce86a22188b0c7f53533b0f693ea9605c1a0f02c84c475a30616f55a744d"}, + {file = "simplejson-3.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d9e8f836688a8fabe6a6b41b334aa550a6823f7b4ac3d3712fc0ad8655be9a8"}, + {file = "simplejson-3.19.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23228037dc5d41c36666384062904d74409a62f52283d9858fa12f4c22cffad1"}, + {file = "simplejson-3.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0791f64fed7d4abad639491f8a6b1ba56d3c604eb94b50f8697359b92d983f36"}, + {file = "simplejson-3.19.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f614581b61a26fbbba232a1391f6cee82bc26f2abbb6a0b44a9bba25c56a1c"}, + {file = "simplejson-3.19.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1df0aaf1cb787fdf34484ed4a1f0c545efd8811f6028623290fef1a53694e597"}, + {file = "simplejson-3.19.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:951095be8d4451a7182403354c22ec2de3e513e0cc40408b689af08d02611588"}, + {file = "simplejson-3.19.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2a954b30810988feeabde843e3263bf187697e0eb5037396276db3612434049b"}, + {file = "simplejson-3.19.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c40df31a75de98db2cdfead6074d4449cd009e79f54c1ebe5e5f1f153c68ad20"}, + {file = "simplejson-3.19.3-cp311-cp311-win32.whl", hash = "sha256:7e2a098c21ad8924076a12b6c178965d88a0ad75d1de67e1afa0a66878f277a5"}, + {file = "simplejson-3.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:c9bedebdc5fdad48af8783022bae307746d54006b783007d1d3c38e10872a2c6"}, + {file = "simplejson-3.19.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:66a0399e21c2112acacfebf3d832ebe2884f823b1c7e6d1363f2944f1db31a99"}, + {file = "simplejson-3.19.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6ef9383c5e05f445be60f1735c1816163c874c0b1ede8bb4390aff2ced34f333"}, + {file = "simplejson-3.19.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:42e5acf80d4d971238d4df97811286a044d720693092b20a56d5e56b7dcc5d09"}, + {file = "simplejson-3.19.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0b0efc7279d768db7c74d3d07f0b5c81280d16ae3fb14e9081dc903e8360771"}, + {file = "simplejson-3.19.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0552eb06e7234da892e1d02365cd2b7b2b1f8233aa5aabdb2981587b7cc92ea0"}, + {file = "simplejson-3.19.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf6a3b9a7d7191471b464fe38f684df10eb491ec9ea454003edb45a011ab187"}, + {file = "simplejson-3.19.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7017329ca8d4dca94ad5e59f496e5fc77630aecfc39df381ffc1d37fb6b25832"}, + {file = "simplejson-3.19.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:67a20641afebf4cfbcff50061f07daad1eace6e7b31d7622b6fa2c40d43900ba"}, + {file = "simplejson-3.19.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:dd6a7dabcc4c32daf601bc45e01b79175dde4b52548becea4f9545b0a4428169"}, + {file = "simplejson-3.19.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:08f9b443a94e72dd02c87098c96886d35790e79e46b24e67accafbf13b73d43b"}, + {file = "simplejson-3.19.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa97278ae6614346b5ca41a45a911f37a3261b57dbe4a00602048652c862c28b"}, + {file = "simplejson-3.19.3-cp312-cp312-win32.whl", hash = "sha256:ef28c3b328d29b5e2756903aed888960bc5df39b4c2eab157ae212f70ed5bf74"}, + {file = "simplejson-3.19.3-cp312-cp312-win_amd64.whl", hash = "sha256:1e662336db50ad665777e6548b5076329a94a0c3d4a0472971c588b3ef27de3a"}, + {file = "simplejson-3.19.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0959e6cb62e3994b5a40e31047ff97ef5c4138875fae31659bead691bed55896"}, + {file = "simplejson-3.19.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a7bfad839c624e139a4863007233a3f194e7c51551081f9789cba52e4da5167"}, + {file = "simplejson-3.19.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afab2f7f2486a866ff04d6d905e9386ca6a231379181a3838abce1f32fbdcc37"}, + {file = "simplejson-3.19.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00313681015ac498e1736b304446ee6d1c72c5b287cd196996dad84369998f7"}, + {file = "simplejson-3.19.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d936ae682d5b878af9d9eb4d8bb1fdd5e41275c8eb59ceddb0aeed857bb264a2"}, + {file = "simplejson-3.19.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c6657485393f2e9b8177c77a7634f13ebe70d5e6de150aae1677d91516ce6b"}, + {file = "simplejson-3.19.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a6a750d3c7461b1c47cfc6bba8d9e57a455e7c5f80057d2a82f738040dd1129"}, + {file = "simplejson-3.19.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ea7a4a998c87c5674a27089e022110a1a08a7753f21af3baf09efe9915c23c3c"}, + {file = "simplejson-3.19.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6300680d83a399be2b8f3b0ef7ef90b35d2a29fe6e9c21438097e0938bbc1564"}, + {file = "simplejson-3.19.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ab69f811a660c362651ae395eba8ce84f84c944cea0df5718ea0ba9d1e4e7252"}, + {file = "simplejson-3.19.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:256e09d0f94d9c3d177d9e95fd27a68c875a4baa2046633df387b86b652f5747"}, + {file = "simplejson-3.19.3-cp313-cp313-win32.whl", hash = "sha256:2c78293470313aefa9cfc5e3f75ca0635721fb016fb1121c1c5b0cb8cc74712a"}, + {file = "simplejson-3.19.3-cp313-cp313-win_amd64.whl", hash = "sha256:3bbcdc438dc1683b35f7a8dc100960c721f922f9ede8127f63bed7dfded4c64c"}, + {file = "simplejson-3.19.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:89b35433186e977fa86ff1fd179c1fadff39cfa3afa1648dab0b6ca53153acd9"}, + {file = "simplejson-3.19.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d43c2d7504eda566c50203cdc9dc043aff6f55f1b7dae0dcd79dfefef9159d1c"}, + {file = "simplejson-3.19.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6890ff9cf0bd2e1d487e2a8869ebd620a44684c0a9667fa5ee751d099d5d84c8"}, + {file = "simplejson-3.19.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1069143a8fb3905e1bc0696c62be7e3adf812e9f1976ac9ae15b05112ff57cc9"}, + {file = "simplejson-3.19.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb324bb903330cbb35d87cce367a12631cd5720afa06e5b9c906483970946da6"}, + {file = "simplejson-3.19.3-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:0a32859d45d7b85fb803bb68f6bee14526991a1190269116c33399fa0daf9bbf"}, + {file = "simplejson-3.19.3-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:23833ee7e791ec968b744dfee2a2d39df7152050051096caf4296506d75608d8"}, + {file = "simplejson-3.19.3-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:d73efb03c5b39249c82488a994f0998f9e4399e3d085209d2120503305ba77a8"}, + {file = "simplejson-3.19.3-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:7923878b7a0142d39763ec2dbecff3053c1bedd3653585a8474666e420fe83f5"}, + {file = "simplejson-3.19.3-cp36-cp36m-win32.whl", hash = "sha256:7355c7203353c36d46c4e7b6055293b3d2be097bbc5e2874a2b8a7259f0325dd"}, + {file = "simplejson-3.19.3-cp36-cp36m-win_amd64.whl", hash = "sha256:d1b8b4d6379fe55f471914345fe6171d81a18649dacf3248abfc9c349b4442eb"}, + {file = "simplejson-3.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d36608557b4dcd7a62c29ad4cd7c5a1720bbf7dc942eff9dc42d2c542a5f042d"}, + {file = "simplejson-3.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7137e69c6781ecf23afab064be94a277236c9cba31aa48ff1a0ec3995c69171e"}, + {file = "simplejson-3.19.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76f8c28fe2d426182405b18ddf3001fce47835a557dc15c3d8bdea01c03361da"}, + {file = "simplejson-3.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff7bc1bbdaa3e487c9469128bf39408e91f5573901cb852e03af378d3582c52d"}, + {file = "simplejson-3.19.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0782cb9bf827f0c488b6aa0f2819f618308a3caf2973cfd792e45d631bec4db"}, + {file = "simplejson-3.19.3-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:6fea0716c593dabb4392c4996d4e902a83b2428e6da82938cf28a523a11eb277"}, + {file = "simplejson-3.19.3-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:8f41bb5370b34f63171e65fdb00e12be1d83675cecb23e627df26f4c88dfc021"}, + {file = "simplejson-3.19.3-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:37105d1d708365b91165e1a6e505bdecc88637091348cf4b6adcdcb4f5a5fb8b"}, + {file = "simplejson-3.19.3-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:b9198c1f1f8910a3b86b60f4fe2556d9d28d3fefe35bffe6be509a27402e694d"}, + {file = "simplejson-3.19.3-cp37-cp37m-win32.whl", hash = "sha256:bc164f32dd9691e7082ce5df24b4cf8c6c394bbf9bdeeb5d843127cd07ab8ad2"}, + {file = "simplejson-3.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:1bd41f2cb1a2c57656ceff67b12d005cb255c728265e222027ad73193a04005a"}, + {file = "simplejson-3.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0733ecd95ae03ae718ec74aad818f5af5f3155d596f7b242acbc1621e765e5fb"}, + {file = "simplejson-3.19.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a0710d1a5e41c4f829caa1572793dd3130c8d65c2b194c24ff29c4c305c26e0"}, + {file = "simplejson-3.19.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1a53a07320c5ff574d8b1a89c937ce33608832f166f39dff0581ac43dc979abd"}, + {file = "simplejson-3.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1773cabfba66a6337b547e45dafbd471b09487370bcab75bd28f626520410d29"}, + {file = "simplejson-3.19.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c0104b4b7d2c75ccedbf1d9d5a3bd2daa75e51053935a44ba012e2fd4c43752"}, + {file = "simplejson-3.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c49eeb94b8f09dc8a5843c156a22b8bde6aa1ddc65ca8ddc62dddcc001e6a2d"}, + {file = "simplejson-3.19.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dc5c1a85ff388e98ea877042daec3d157b6db0d85bac6ba5498034689793e7e"}, + {file = "simplejson-3.19.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:49549e3d81ab4a58424405aa545602674d8c35c20e986b42bb8668e782a94bac"}, + {file = "simplejson-3.19.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:e1a1452ad5723ff129b081e3c8aa4ba56b8734fee4223355ed7b815a7ece69bc"}, + {file = "simplejson-3.19.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:d0d5a63f1768fed7e78cf55712dee81f5a345e34d34224f3507ebf71df2b754d"}, + {file = "simplejson-3.19.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:7e062767ac165df9a46963f5735aa4eee0089ec1e48b3f2ec46182754b96f55e"}, + {file = "simplejson-3.19.3-cp38-cp38-win32.whl", hash = "sha256:56134bbafe458a7b21f6fddbf889d36bec6d903718f4430768e3af822f8e27c2"}, + {file = "simplejson-3.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:bcde83a553a96dc7533736c547bddaa35414a2566ab0ecf7d3964fc4bdb84c11"}, + {file = "simplejson-3.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b5587feda2b65a79da985ae6d116daf6428bf7489992badc29fc96d16cd27b05"}, + {file = "simplejson-3.19.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e0d2b00ecbcd1a3c5ea1abc8bb99a26508f758c1759fd01c3be482a3655a176f"}, + {file = "simplejson-3.19.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:32a3ada8f3ea41db35e6d37b86dade03760f804628ec22e4fe775b703d567426"}, + {file = "simplejson-3.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f455672f4738b0f47183c5896e3606cd65c9ddee3805a4d18e8c96aa3f47c84"}, + {file = "simplejson-3.19.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b737a5fefedb8333fa50b8db3dcc9b1d18fd6c598f89fa7debff8b46bf4e511"}, + {file = "simplejson-3.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb47ee773ce67476a960e2db4a0a906680c54f662521550828c0cc57d0099426"}, + {file = "simplejson-3.19.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eed8cd98a7b24861da9d3d937f5fbfb6657350c547528a117297fe49e3960667"}, + {file = "simplejson-3.19.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:619756f1dd634b5bdf57d9a3914300526c3b348188a765e45b8b08eabef0c94e"}, + {file = "simplejson-3.19.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:dd7230d061e755d60a4d5445bae854afe33444cdb182f3815cff26ac9fb29a15"}, + {file = "simplejson-3.19.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:101a3c8392028cd704a93c7cba8926594e775ca3c91e0bee82144e34190903f1"}, + {file = "simplejson-3.19.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e557712fc79f251673aeb3fad3501d7d4da3a27eff0857af2e1d1afbbcf6685"}, + {file = "simplejson-3.19.3-cp39-cp39-win32.whl", hash = "sha256:0bc5544e3128891bf613b9f71813ee2ec9c11574806f74dd8bb84e5e95bf64a2"}, + {file = "simplejson-3.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:06662392e4913dc8846d6a71a6d5de86db5fba244831abe1dd741d62a4136764"}, + {file = "simplejson-3.19.3-py3-none-any.whl", hash = "sha256:49cc4c7b940d43bd12bf87ec63f28cbc4964fc4e12c031cc8cd01650f43eb94e"}, + {file = "simplejson-3.19.3.tar.gz", hash = "sha256:8e086896c36210ab6050f2f9f095a5f1e03c83fa0e7f296d6cba425411364680"}, +] + [[package]] name = "six" version = "1.17.0" @@ -2128,6 +2677,32 @@ anyio = ">=3.4.0,<5" [package.extras] full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] +[[package]] +name = "titiler-core" +version = "0.21.1" +description = "A modern dynamic tile server built on top of FastAPI and Rasterio/GDAL." +optional = false +python-versions = ">=3.9" +files = [ + {file = "titiler_core-0.21.1-py3-none-any.whl", hash = "sha256:4453a3ca2b8db659a4e18a615c1f0eaedaf376b24f5c46d4d55e61e9de1b802f"}, + {file = "titiler_core-0.21.1.tar.gz", hash = "sha256:713c7a638365529ee346f7ad2bb1532242cce6de158ad8aae5247463ec251b35"}, +] + +[package.dependencies] +fastapi = ">=0.108.0" +geojson-pydantic = ">=1.1.2,<2.0" +jinja2 = ">=2.11.2,<4.0.0" +morecantile = "*" +numpy = "*" +pydantic = ">=2.0,<3.0" +rasterio = "*" +rio-tiler = ">=7.0.1,<8.0" +simplejson = "*" +typing_extensions = ">=4.6.1" + +[package.extras] +test = ["httpx", "pytest", "pytest-asyncio", "pytest-cov"] + [[package]] name = "typing-extensions" version = "4.12.2" @@ -2362,4 +2937,4 @@ propcache = ">=0.2.0" [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "d7531e5eec47daf64a116c37233c464006886b92a3860673fcf7eff93a5c9e6f" +content-hash = "6e294d6c24addbe6095184d70745745dfcbb1f1532059ef1e35c02fe1b5a3b06" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 6779cff..eb1a3ff 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -24,6 +24,7 @@ uvicorn = "^0.32.0" pyyaml = "^6.0.2" elasticsearch = {extras = ["async"], version = "^8.16.0"} markdown-it-py = "^3.0.0" +titiler-core = "^0.21.1" [build-system] requires = ["poetry-core"] diff --git a/frontend/src/components/DocumentPanel.vue b/frontend/src/components/DocumentPanel.vue index 9834dd0..0fabff6 100644 --- a/frontend/src/components/DocumentPanel.vue +++ b/frontend/src/components/DocumentPanel.vue @@ -98,6 +98,27 @@
+
+
+
+
+ {{ $t('address') }} +
+
+ +
+
+
+
+
@@ -167,7 +188,7 @@ function init() { return searchService.getDocument(rel, fields); }), ).then((docs) => { - relationSummaries.value.concat(docs); + relationSummaries.value = relationSummaries.value.concat(docs); }); }); } diff --git a/frontend/src/components/MapResults.vue b/frontend/src/components/MapResults.vue index ff9f073..05a492e 100644 --- a/frontend/src/components/MapResults.vue +++ b/frontend/src/components/MapResults.vue @@ -6,17 +6,19 @@ :height="'600px'" class="q-pr-md" @map:click="onFeature" + @map:box="onBoundingBox" />
- +
+ {{ $t('no_results') }} +
+ -
- {{ $t('no_results') }} -
@@ -57,6 +53,7 @@ import MapView from 'src/components/MapView.vue'; import TagsBadges from 'src/components/TagsBadges.vue'; import { Document } from 'src/models'; import { getImageUrls } from 'src/utils/files'; +import { Feature } from 'geojson'; const router = useRouter(); const searchService = useSearchService(); @@ -67,7 +64,12 @@ function onDocument(row: Document) { router.push({ name: 'doc', params: { id: `${row.entity_type}:${row.id}` } }); } -function onFeature(feature) { +function onFeature(feature: Feature) { console.log(feature); } + +function onBoundingBox(bounds: [[number, number], [number, number]]) { + searchService.bbox = bounds; + searchService.search_entities(); +} diff --git a/frontend/src/components/MapView.vue b/frontend/src/components/MapView.vue index 3b30b62..abdde02 100644 --- a/frontend/src/components/MapView.vue +++ b/frontend/src/components/MapView.vue @@ -1,5 +1,10 @@