Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions community/altaaryan/Airports_visualizer/Airports_visualizer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
@fused.udf()
def udf(
path: str = "s3://fused-sample/demo_data/airports.csv",
bounds: fused.types.Bounds = 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 a color property that reflects
the airport type (large, medium, small, heliport). The Workbench will render
the points on the map using this color.
"""
import geopandas as gpd
import pandas as pd
from shapely.geometry import Point

# Load CSV
df = pd.read_csv(path)

# Build geometry column
geometry = [Point(xy) for xy in zip(df.longitude_deg, df.latitude_deg)]
gdf = gpd.GeoDataFrame(df, geometry=geometry)

# Apply optional filters
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]

# Spatial filter using bounds if provided
if bounds is not None:
from shapely.geometry import box

bbox = box(*bounds)
gdf = gdf[gdf.geometry.intersects(bbox)]

# Keep only requested columns
if use_columns:
keep_cols = list(set(use_columns + ["geometry"]))
gdf = gdf[keep_cols]

# ------------------------------------------------------------------
# Add a colour column based on airport type for map rendering
# ------------------------------------------------------------------
colour_map = {
"large_airport": "#ff0000", # red
"medium_airport": "#ffa500", # orange
"small_airport": "#00ff00", # green
"heliport": "#0000ff", # blue
}
# Use hex colour strings; unknown types get a default grey
gdf["color"] = gdf["type"].map(colour_map).fillna("#808080")

# Debug print of the final GeoDataFrame schema
print(gdf.T)

# Return the GeoDataFrame; Workbench will display it on the map,
# using the 'color' property for point styling.
return gdf
5 changes: 5 additions & 0 deletions community/altaaryan/Airports_visualizer/README.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<!--fused:preview-->
<p align="center"><img src="https://fused-magic.s3.amazonaws.com/thumbnails/preview/fusedlabs/fusedudfs/Airports_visualizer/3e212a38-5524-48b1-84fc-c7753648e365" width="600" alt="UDF preview image"></p>

<!--fused:readme-->
Read a CSV or TSV file.
72 changes: 72 additions & 0 deletions community/altaaryan/Airports_visualizer/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
{
"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
},
"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
],
"steps": 20,
"colors": "OrYel",
"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]"
}
},
"source": "Airports_visualizer.py",
"headers": []
}
}
],
"metadata": null
}
}