diff --git a/public/LULC_Tile_Example/LULC_Tile_Example.py b/public/LULC_Tile_Example/LULC_Tile_Example.py
new file mode 100644
index 00000000..db3625bf
--- /dev/null
+++ b/public/LULC_Tile_Example/LULC_Tile_Example.py
@@ -0,0 +1,70 @@
+@fused.udf
+def udf(bounds: fused.types.Bounds = [-122.499,37.707,-122.381,37.808], year="2022", chip_len:int=256):
+ LULC_IO_COLORS = {
+ 1: (65, 155, 223), # Water
+ 2: (57, 125, 73), # Trees
+ 4: (57, 125, 73), # Flooded vegetation
+ 5: (228, 150, 53), # Crops
+ 7: (196, 40, 27), # Built area
+ 8: (165, 155, 143), # Bare ground
+ 9: (168, 235, 255), # Snow
+ 10: (97, 97, 97), # Clouds
+ 11: (227, 226, 195), # Rangeland
+ }
+ common = fused.load("https://github.com/fusedio/udfs/tree/b7637ee/public/common/")
+ tile = common.get_tiles(bounds, clip=True)
+ zoom = tile.iloc[0].z
+
+ if zoom >= 5:
+ matching_items = bounds_stac_items(
+ tile.geometry[0], table="s3://fused-asset/lulc/io10m/"
+ )
+ mask = matching_items["datetime"].map(lambda x: str(x)[:4] == year)
+ tiff_list = (
+ matching_items[mask]
+ .assets.map(lambda x: s3_to_https(x["supercell"]["href"][:-17] + ".tif"))
+ .values
+ )
+ data = common.mosaic_tiff(
+ tile,
+ tiff_list,
+ output_shape=(chip_len, chip_len),
+ overview_level=min(max(12 - zoom, 0), 4),
+ )
+ data = arr_to_color(data, color_map=LULC_IO_COLORS)
+ print(data.shape)
+ return data, bounds
+ else:
+ print("Please zoom in more.")
+
+
+def s3_to_https(path):
+ arr = path[5:].split("/")
+ out = "https://" + arr[0] + ".s3.amazonaws.com/" + "/".join(arr[1:])
+ return out
+
+
+def arr_to_color(arr, color_map={1: (65, 155, 223), 2: (57, 125, 73)}):
+ import numpy as np
+
+ def map_values(value, band=0):
+ if value in color_map:
+ return color_map[value][band]
+ else:
+ return 0
+
+ mapped_arr = [np.vectorize(lambda x: map_values(x, i))(arr) for i in [0, 1, 2]]
+ return np.asarray(mapped_arr).astype("uint8")
+
+
+def bounds_stac_items(bounds, table):
+ import fused
+ import pandas as pd
+
+ df = fused.get_chunks_metadata(table)
+ df = df[df.intersects(bounds)]
+ List = df[["file_id", "chunk_id"]].values
+ rows_df = pd.concat(
+ [fused.get_chunk_from_table(table, fc[0], fc[1]) for fc in List]
+ )
+ return rows_df[rows_df.intersects(bounds)]
diff --git a/public/LULC_Tile_Example/README.MD b/public/LULC_Tile_Example/README.MD
new file mode 100644
index 00000000..8713df1e
--- /dev/null
+++ b/public/LULC_Tile_Example/README.MD
@@ -0,0 +1,29 @@
+
+
+

+
+
+Tags: `mask` `projection` `s3` `tiff` `mosaic` `stac`
+
+
+#### Overview
+Time series of annual global maps of land use and land cover (LULC). It currently has data from 2017-2022. The maps are derived from ESA Sentinel-2 imagery at 10m resolution. Each map is a composite of LULC predictions for 9 classes throughout the year in order to generate a representative snapshot of each year.
+
+This dataset was generated by Impact Observatory, who used billions of human-labeled pixels (curated by the National Geographic Society) to train a deep learning model for land classification. The global map was produced by applying this model to the Sentinel-2 annual scene collections on the Planetary Computer. Each of the maps has an assessed average accuracy of over 75%.
+
+This map uses an updated model from the 10-class model and combines Grass(formerly class 3) and Scrub (formerly class 6) into a single Rangeland class (class 11). The original Esri 2020 Land Cover collection uses 10 classes (Grass and Scrub separate) and an older version of the underlying deep learning model. The Esri 2020 Land Cover map was also produced by Impact Observatory. The map remains available for use in existing applications. New applications should use the updated version of 2020 once it is available in this collection, especially when using data from multiple years of this time series, to ensure consistent classification.
+
+All years are available under a Creative Commons BY-4.0.
+
+#### STAC Collections
+* Microsoft Planetary Computer [link](https://planetarycomputer.microsoft.com/api/stac/v1/collections/io-lulc-9-class)
+
+## Run this in any Jupyter Notebook
+
+```python
+import fused
+
+udf = fused.load("https://github.com/fusedio/udfs/tree/main/public/LULC_Tile_Example")
+arr = fused.run(udf=udf, x=5241, y=12667, z=15)
+arr
+```
diff --git a/public/LULC_Tile_Example/meta.json b/public/LULC_Tile_Example/meta.json
new file mode 100644
index 00000000..2eaf8d51
--- /dev/null
+++ b/public/LULC_Tile_Example/meta.json
@@ -0,0 +1,110 @@
+{
+ "version": "0.0.3",
+ "job_config": {
+ "version": "0.0.3",
+ "name": null,
+ "steps": [
+ {
+ "type": "udf",
+ "udf": {
+ "type": "geopandas_v2",
+ "name": "LULC_Tile_Example",
+ "entrypoint": "udf",
+ "parameters": {},
+ "metadata": {
+ "fused:defaultParameters": [
+ {
+ "parameter": "year",
+ "value": "2022"
+ }
+ ],
+ "fused:datasets": "Land Use Land Cover",
+ "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
+ ],
+ "colors": "SunsetDark",
+ "nullColor": [
+ 184,
+ 184,
+ 184
+ ]
+ },
+ "getFillColor": [
+ 208,
+ 208,
+ 208,
+ 40
+ ]
+ }
+ },
+ "fused:udfType": "raster",
+ "fused:slug": "LULC_Tile_Example",
+ "fused:name": "LULC_Tile_Example",
+ "fused:defaultViewState": {
+ "enable": true,
+ "latitude": 37.757526795056336,
+ "longitude": -122.4399227024157,
+ "zoom": 10.928538980870838,
+ "pitch": 0,
+ "bearing": 0
+ },
+ "fused:assetUrl": "https://fused-magic.s3.us-west-2.amazonaws.com/thumbnails/udfs-staging/LULC_Tile_Example.png",
+ "fused:tags": [
+ {
+ "id": "mask",
+ "label": "mask"
+ },
+ {
+ "id": "projection",
+ "label": "projection"
+ },
+ {
+ "id": "s3",
+ "label": "s3"
+ },
+ {
+ "id": "tiff",
+ "label": "tiff"
+ },
+ {
+ "id": "mosaic",
+ "label": "mosaic"
+ },
+ {
+ "id": "stac",
+ "label": "stac"
+ }
+ ],
+ "fused:description": "#### Overview\nTime series of annual global maps of land use and land cover (LULC). It currently has data from 2017-2022. The maps are derived from ESA Sentinel-2 imagery at 10m resolution. Each map is a composite of LULC predictions for 9 classes throughout the year in order to generate a representative snapshot of each year.\n\nThis dataset was generated by Impact Observatory, who used billions of human-labeled pixels (curated by the National Geographic Society) to train a deep learning model for land classification. The global map was produced by applying this model to the Sentinel-2 annual scene collections on the Planetary Computer. Each of the maps has an assessed average accuracy of over 75%.\n\nThis map uses an updated model from the 10-class model and combines Grass(formerly class 3) and Scrub (formerly class 6) into a single Rangeland class (class 11). The original Esri 2020 Land Cover collection uses 10 classes (Grass and Scrub separate) and an older version of the underlying deep learning model. The Esri 2020 Land Cover map was also produced by Impact Observatory. The map remains available for use in existing applications. New applications should use the updated version of 2020 once it is available in this collection, especially when using data from multiple years of this time series, to ensure consistent classification.\n\nAll years are available under a Creative Commons BY-4.0.\n\n#### STAC Collections\n* Microsoft Planetary Computer [link](https://planetarycomputer.microsoft.com/api/stac/v1/collections/io-lulc-9-class)\n\n## Run this in any Jupyter Notebook\n\n```python\nimport fused\n\nudf = fused.load(\"https://github.com/fusedio/udfs/tree/main/public/LULC_Tile_Example\")\narr = fused.run(udf=udf, x=5241, y=12667, z=15)\narr\n```\n",
+ "fused:explorerPin": "9"
+ },
+ "source": "LULC_Tile_Example.py",
+ "headers": []
+ }
+ }
+ ],
+ "metadata": null
+ }
+}
\ No newline at end of file