Files
fn_registry/python/functions/geo/point_in_polygons_bbox.py
egutierrez faac610745 feat: extraccion masiva footprint_aurgi (41 funcs + 4 types + stack Docker geo)
Extrae al registry funciones del proyecto interno footprint_aurgi:
- core (6): slugify_ascii, normalize_for_join, cp_provincia_es, infer_provincia_from_cp, safe_read_csv_fallback, csv_to_parquet_duckdb
- geo puras (7): haversine_km, point_in_ring, point_in_polygon, point_in_polygons_bbox, polygon_bbox, extent_with_padding, distance_bucket
- geo I/O (4): load_geojson_polygons, load_boundary_gdf, add_basemap_osm, add_basemap_with_timeout
- valhalla client (4): valhalla_route, valhalla_isochrone, valhalla_isochrones_async, valhalla_matrix_1_to_n
- datascience stats (7): trimmed_mean, geometric_mean, detect_distribution_type, best_central_tendency, summary_stats, kde_density_levels, alpha_shape_concave_hull
- datascience fuzzy (3): fuzzy_merge_adaptive (rapidfuzz), words_to_dataset, remove_words_from_column
- datascience viz (2): plot_kde_2d, plot_heatmap_log
- infra (4): compress_pdf_ghostscript, render_table_page_pdfpages, add_header_logo, osm2pgsql_ingest
- pipelines (4): setup_geo_stack_docker, compute_centers_reachability, generate_isochrones_by_zone, count_points_per_zone
- types geo (4): LonLat, BBox, IsochroneRequest, Centro

Incluye:
- apps/footprint_geo_stack/ (PostGIS + Martin + Valhalla via docker-compose)
- 131/132 tests pasan (1 skip esperado: osm2pgsql en PATH)
- Issue tracker dev/issues/0052-footprint-aurgi-extraction.md
- Atribucion uniforme: source_repo internal:footprint_aurgi, source_license internal-aurgi
- Build con 9 agentes en paralelo (8 wave 1 + 1 wave 2 pipelines)

Tambien commitea trabajo previo no commiteado: aggregate_extraction_results, chunk_with_overlap, clean_pdf_text, merge_entity_aliases, extract_graph_gliner2, extract_relations_mrebel, extract_triples_spacy_es, gliner2/mrebel/marianmt/rebel/spacy_es load_model, parse_rebel_output, translate_es_to_en, issue 0050/0051.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 23:35:22 +02:00

32 lines
1.2 KiB
Python

"""Comprobacion de punto contra una lista de poligonos con prefiltraje por bbox."""
from python.functions.geo.point_in_polygon import point_in_polygon
def point_in_polygons_bbox(
lon: float,
lat: float,
polygons: list[list[list[tuple[float, float]]]],
bboxes: list[tuple[float, float, float, float]],
) -> bool:
"""Determina si el punto (lon, lat) esta dentro de CUALQUIER poligono de la lista.
Aplica un prefiltraje por bounding box antes de ejecutar el ray casting completo,
lo que mejora el rendimiento cuando hay muchos poligonos.
Args:
lon: longitud del punto en grados.
lat: latitud del punto en grados.
polygons: lista de poligonos, cada uno como lista de anillos (exterior + holes).
bboxes: lista de bboxes precalculados (minx, miny, maxx, maxy) para cada poligono.
Returns:
True si el punto esta dentro de al menos uno de los poligonos.
"""
for polygon, (minx, miny, maxx, maxy) in zip(polygons, bboxes):
if lon < minx or lon > maxx or lat < miny or lat > maxy:
continue
if point_in_polygon(lon, lat, polygon):
return True
return False