From eb46409ee789cd45fd3bae2eed1177fa9fda1222 Mon Sep 17 00:00:00 2001 From: "aaryan@fused.io" Date: Wed, 30 Jul 2025 09:29:28 +0000 Subject: [PATCH] push to community --- .../Airports_visualizer.py | 40 ++++++++++ .../aaryan/Airports_visualizer/README.MD | 5 ++ .../aaryan/Airports_visualizer/meta.json | 74 +++++++++++++++++++ 3 files changed, 119 insertions(+) create mode 100644 community/aaryan/Airports_visualizer/Airports_visualizer.py create mode 100644 community/aaryan/Airports_visualizer/README.MD create mode 100644 community/aaryan/Airports_visualizer/meta.json diff --git a/community/aaryan/Airports_visualizer/Airports_visualizer.py b/community/aaryan/Airports_visualizer/Airports_visualizer.py new file mode 100644 index 00000000..f1a2cd62 --- /dev/null +++ b/community/aaryan/Airports_visualizer/Airports_visualizer.py @@ -0,0 +1,40 @@ +@fused.udf +def udf( + path: str = 's3://fused-users/fused/aaryan/airports.csv', + bounds: fused.types.TileGDF = None, + airport_type: str = None, + continent: str = None, + min_elevation: float = None, + scheduled_service: str = None, + use_columns: list = None +): + """ + Returns airport data as a GeoDataFrame with visualization parameters. + """ + import geopandas as gpd + import pandas as pd + from shapely.geometry import Point + + df = pd.read_csv(path) + + geometry = [Point(xy) for xy in zip(df.longitude_deg, df.latitude_deg)] + gdf = gpd.GeoDataFrame(df, geometry=geometry) + + if airport_type: + gdf = gdf[gdf.type == airport_type] + if continent: + gdf = gdf[gdf.continent == continent] + if min_elevation: + gdf = gdf[gdf.elevation_ft >= min_elevation] + if scheduled_service: + gdf = gdf[gdf.scheduled_service == scheduled_service] + + if bounds is not None: + gdf = gdf[gdf.geometry.intersects(bounds.geometry.iloc[0])] + + # Select columns + if use_columns: + keep_cols = list(set(use_columns + ['geometry'])) + gdf = gdf[keep_cols] + + return gdf diff --git a/community/aaryan/Airports_visualizer/README.MD b/community/aaryan/Airports_visualizer/README.MD new file mode 100644 index 00000000..7f402c90 --- /dev/null +++ b/community/aaryan/Airports_visualizer/README.MD @@ -0,0 +1,5 @@ + +

UDF preview image

+ + +Read a CSV or TSV file. diff --git a/community/aaryan/Airports_visualizer/meta.json b/community/aaryan/Airports_visualizer/meta.json new file mode 100644 index 00000000..59d75984 --- /dev/null +++ b/community/aaryan/Airports_visualizer/meta.json @@ -0,0 +1,74 @@ +{ + "version": "0.0.3", + "job_config": { + "version": "0.0.3", + "name": null, + "steps": [ + { + "type": "udf", + "udf": { + "type": "geopandas_v2", + "name": "Airports_visualizer", + "entrypoint": "udf", + "parameters": {}, + "metadata": { + "fused:vizConfig": { + "tileLayer": { + "@@type": "TileLayer", + "minZoom": 0, + "maxZoom": 19, + "tileSize": 256, + "pickable": true + }, + "rasterLayer": { + "@@type": "BitmapLayer", + "pickable": true + }, + "vectorLayer": { + "@@type": "GeoJsonLayer", + "stroked": true, + "filled": false, + "pickable": true, + "lineWidthMinPixels": 1, + "pointRadiusMinPixels": 1, + "getLineColor": { + "@@function": "colorContinuous", + "attr": "value", + "domain": [ + 0, + 10 + ], + "colors": "Teal", + "nullColor": [ + 184, + 184, + 184 + ] + }, + "getFillColor": [ + 208, + 208, + 208, + 40 + ] + } + }, + "fused:udfType": "auto", + "fused:slug": "Airports_visualizer", + "fused:name": "Airports_visualizer", + "fused:defaultParameters": [], + "fused:mcp": { + "description": "Read a CSV or TSV file.\n", + "parameters": "[\n {\n \"name\": \"foo\",\n \"type\": \"string\"\n },\n {\n \"name\": \"string-param\",\n \"type\": \"string\"\n }\n]" + }, + "fused:assetUrl": "https://fused-magic.s3.amazonaws.com/thumbnails/preview/fusedlabs/fusedudfs/Airports_visualizer/3e212a38-5524-48b1-84fc-c7753648e365", + "fused:description": "Read a CSV or TSV file.\n" + }, + "source": "Airports_visualizer.py", + "headers": [] + } + } + ], + "metadata": null + } +} \ No newline at end of file