@mytec: 3.8.0a done
This commit is contained in:
@@ -21,6 +21,11 @@ class VegetationArea(BaseModel):
|
||||
geometry: List[Tuple[float, float]] # [(lon, lat), ...]
|
||||
vegetation_type: str # forest, wood, scrub, orchard
|
||||
density: str # dense, sparse, mixed
|
||||
# Bounding box for fast rejection (computed from geometry)
|
||||
min_lat: float = 0.0
|
||||
max_lat: float = 0.0
|
||||
min_lon: float = 0.0
|
||||
max_lon: float = 0.0
|
||||
|
||||
|
||||
class VegetationCache:
|
||||
@@ -127,7 +132,24 @@ class VegetationService:
|
||||
cached = self.cache.get(min_lat, min_lon, max_lat, max_lon)
|
||||
if cached is not None:
|
||||
print(f"[Vegetation] Cache hit for bbox")
|
||||
areas = [VegetationArea(**v) for v in cached]
|
||||
areas = []
|
||||
for v in cached:
|
||||
area = VegetationArea(**v)
|
||||
# Recompute bbox if missing (backward compat with old cache)
|
||||
if area.min_lat == 0.0 and area.max_lat == 0.0 and area.geometry:
|
||||
lons = [p[0] for p in area.geometry]
|
||||
lats = [p[1] for p in area.geometry]
|
||||
area = VegetationArea(
|
||||
id=area.id,
|
||||
geometry=area.geometry,
|
||||
vegetation_type=area.vegetation_type,
|
||||
density=area.density,
|
||||
min_lat=min(lats),
|
||||
max_lat=max(lats),
|
||||
min_lon=min(lons),
|
||||
max_lon=max(lons),
|
||||
)
|
||||
areas.append(area)
|
||||
self._memory_cache[cache_key] = areas
|
||||
return areas
|
||||
|
||||
@@ -205,11 +227,19 @@ class VegetationService:
|
||||
leaf_type = tags.get("leaf_type", "mixed")
|
||||
density = "dense" if leaf_type == "needleleaved" else "mixed"
|
||||
|
||||
# Compute bounding box from geometry (lon, lat tuples)
|
||||
lons = [p[0] for p in geometry]
|
||||
lats = [p[1] for p in geometry]
|
||||
|
||||
areas.append(VegetationArea(
|
||||
id=element["id"],
|
||||
geometry=geometry,
|
||||
vegetation_type=veg_type,
|
||||
density=density
|
||||
density=density,
|
||||
min_lat=min(lats),
|
||||
max_lat=max(lats),
|
||||
min_lon=min(lons),
|
||||
max_lon=max(lons),
|
||||
))
|
||||
|
||||
return areas
|
||||
@@ -260,8 +290,12 @@ class VegetationService:
|
||||
lat: float, lon: float,
|
||||
areas: List[VegetationArea]
|
||||
) -> Optional[VegetationArea]:
|
||||
"""Check if point is in vegetation area"""
|
||||
"""Check if point is in vegetation area (with bbox pre-filter)"""
|
||||
for area in areas:
|
||||
# Quick bbox reject - skips 95%+ of polygons
|
||||
if not (area.min_lat <= lat <= area.max_lat and
|
||||
area.min_lon <= lon <= area.max_lon):
|
||||
continue
|
||||
if self._point_in_polygon(lat, lon, area.geometry):
|
||||
return area
|
||||
return None
|
||||
|
||||
Reference in New Issue
Block a user