[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71J66H9X5JQEB5RVMMEXHWK":3,"skill-same:01M71J66H9X5JQEB5RVMMEXHWK":140},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M71J66H9X5JQEB5RVMMEXHWK","geomaster",null,"Comprehensive geospatial science skill covering remote sensing, GIS, spatial analysis, machine learning for earth observation, and 30+ scientific domains. Supports satellite imagery processing (Sentinel, Landsat, MODIS, SAR, hyperspectral), vector and raster data operations, spatial statistics, point cloud processing, network analysis, cloud-native workflows (STAC, COG, Planetary Computer), and 8 programming languages (Python, R, Julia, JavaScript, C++, Java, Go, Rust) with 500+ code examples. Use for remote sensing workflows, GIS analysis, spatial ML, Earth observation data processing, terrain analysis, hydrological modeling, marine spatial analysis, atmospheric science, and any geospatial computation task.","iDorgham\u002FWorkspace-Factory","iDorgham","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F136521493?v=4","01M6CNGBDAHE4ARW3YJEF4X2FD","Dorgham","01M71E8H3CXZ7DJX59MTM9JEB2",1,"MIT","https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[5,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"Julia","remote","native","processing","scientific","spatial statistics","domains","modeling","statistics","go","computer","analysis","sentinel","data","network","vector","code","workflows","rust","2026-11-10 10:12:30",false,"---\r\nname: geomaster\r\ndescription: Comprehensive geospatial science skill covering remote sensing, GIS, spatial analysis, machine learning for earth observation, and 30+ scientific domains. Supports satellite imagery processing (Sentinel, Landsat, MODIS, SAR, hyperspectral), vector and raster data operations, spatial statistics, point cloud processing, network analysis, cloud-native workflows (STAC, COG, Planetary Computer), and 8 programming languages (Python, R, Julia, JavaScript, C++, Java, Go, Rust) with 500+ code examples. Use for remote sensing workflows, GIS analysis, spatial ML, Earth observation data processing, terrain analysis, hydrological modeling, marine spatial analysis, atmospheric science, and any geospatial computation task.\r\nlicense: MIT License\r\nmetadata:\r\n    skill-author: K-Dense Inc.\r\n---\r\n\r\n# GeoMaster\r\n\r\nComprehensive geospatial science skill covering GIS, remote sensing, spatial analysis, and ML for Earth observation across 70+ topics with 500+ code examples in 8 programming languages.\r\n\r\n## Installation\r\n\r\n```bash\r\n# Core Python stack (conda recommended)\r\nconda install -c conda-forge gdal rasterio fiona shapely pyproj geopandas\r\n\r\n# Remote sensing & ML\r\nuv pip install rsgislib torchgeo earthengine-api\r\nuv pip install scikit-learn xgboost torch-geometric\r\n\r\n# Network & visualization\r\nuv pip install osmnx networkx folium keplergl\r\nuv pip install cartopy contextily mapclassify\r\n\r\n# Big data & cloud\r\nuv pip install xarray rioxarray dask-geopandas\r\nuv pip install pystac-client planetary-computer\r\n\r\n# Point clouds\r\nuv pip install laspy pylas open3d pdal\r\n\r\n# Databases\r\nconda install -c conda-forge postgis spatialite\r\n```\r\n\r\n## Quick Start\r\n\r\n### NDVI from Sentinel-2\r\n\r\n```python\r\nimport rasterio\r\nimport numpy as np\r\n\r\nwith rasterio.open('sentinel2.tif') as src:\r\n    red = src.read(4).astype(float)   # B04\r\n    nir = src.read(8).astype(float)   # B08\r\n    ndvi = (nir - red) \u002F (nir + red + 1e-8)\r\n    ndvi = np.nan_to_num(ndvi, nan=0)\r\n\r\n    profile = src.profile\r\n    profile.update(count=1, dtype=rasterio.float32)\r\n\r\n    with rasterio.open('ndvi.tif', 'w', **profile) as dst:\r\n        dst.write(ndvi.astype(rasterio.float32), 1)\r\n```\r\n\r\n### Spatial Analysis with GeoPandas\r\n\r\n```python\r\nimport geopandas as gpd\r\n\r\n# Load and ensure same CRS\r\nzones = gpd.read_file('zones.geojson')\r\npoints = gpd.read_file('points.geojson')\r\n\r\nif zones.crs != points.crs:\r\n    points = points.to_crs(zones.crs)\r\n\r\n# Spatial join and statistics\r\njoined = gpd.sjoin(points, zones, how='inner', predicate='within')\r\nstats = joined.groupby('zone_id').agg({\r\n    'value': ['count', 'mean', 'std', 'min', 'max']\r\n}).round(2)\r\n```\r\n\r\n### Google Earth Engine Time Series\r\n\r\n```python\r\nimport ee\r\nimport pandas as pd\r\n\r\nee.Initialize(project='your-project')\r\nroi = ee.Geometry.Point([-122.4, 37.7]).buffer(10000)\r\n\r\ns2 = (ee.ImageCollection('COPERNICUS\u002FS2_SR_HARMONIZED')\r\n      .filterBounds(roi)\r\n      .filterDate('2020-01-01', '2023-12-31')\r\n      .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20)))\r\n\r\ndef add_ndvi(img):\r\n    return img.addBands(img.normalizedDifference(['B8', 'B4']).rename('NDVI'))\r\n\r\ns2_ndvi = s2.map(add_ndvi)\r\n\r\ndef extract_series(image):\r\n    stats = image.reduceRegion(ee.Reducer.mean(), roi.centroid(), scale=10, maxPixels=1e9)\r\n    return ee.Feature(None, {'date': image.date().format('YYYY-MM-dd'), 'ndvi': stats.get('NDVI')})\r\n\r\nseries = s2_ndvi.map(extract_series).getInfo()\r\ndf = pd.DataFrame([f['properties'] for f in series['features']])\r\ndf['date'] = pd.to_datetime(df['date'])\r\n```\r\n\r\n## Core Concepts\r\n\r\n### Data Types\r\n\r\n| Type | Examples | Libraries |\r\n|------|----------|-----------|\r\n| Vector | Shapefile, GeoJSON, GeoPackage | GeoPandas, Fiona, GDAL |\r\n| Raster | GeoTIFF, NetCDF, COG | Rasterio, Xarray, GDAL |\r\n| Point Cloud | LAS, LAZ | Laspy, PDAL, Open3D |\r\n\r\n### Coordinate Systems\r\n\r\n- **EPSG:4326** (WGS 84) - Geographic, lat\u002Flon, use for storage\r\n- **EPSG:3857** (Web Mercator) - Web maps only (don't use for area\u002Fdistance!)\r\n- **EPSG:326xx\u002F327xx** (UTM) - Metric calculations, \u003C1% distortion per zone\r\n- Use `gdf.estimate_utm_crs()` for automatic UTM detection\r\n\r\n```python\r\n# Always check CRS before operations\r\nassert gdf1.crs == gdf2.crs, \"CRS mismatch!\"\r\n\r\n# For area\u002Fdistance calculations, use projected CRS\r\ngdf_metric = gdf.to_crs(gdf.estimate_utm_crs())\r\narea_sqm = gdf_metric.geometry.area\r\n```\r\n\r\n### OGC Standards\r\n\r\n- **WMS**: Web Map Service - raster maps\r\n- **WFS**: Web Feature Service - vector data\r\n- **WCS**: Web Coverage Service - raster coverage\r\n- **STAC**: Spatiotemporal Asset Catalog - modern metadata\r\n\r\n## Common Operations\r\n\r\n### Spectral Indices\r\n\r\n```python\r\ndef calculate_indices(image_path):\r\n    \"\"\"NDVI, EVI, SAVI, NDWI from Sentinel-2.\"\"\"\r\n    with rasterio.open(image_path) as src:\r\n        B02, B03, B04, B08, B11 = [src.read(i).astype(float) for i in [1,2,3,4,5]]\r\n\r\n    ndvi = (B08 - B04) \u002F (B08 + B04 + 1e-8)\r\n    evi = 2.5 * (B08 - B04) \u002F (B08 + 6*B04 - 7.5*B02 + 1)\r\n    savi = ((B08 - B04) \u002F (B08 + B04 + 0.5)) * 1.5\r\n    ndwi = (B03 - B08) \u002F (B03 + B08 + 1e-8)\r\n\r\n    return {'NDVI': ndvi, 'EVI': evi, 'SAVI': savi, 'NDWI': ndwi}\r\n```\r\n\r\n### Vector Operations\r\n\r\n```python\r\n# Buffer (use projected CRS!)\r\ngdf_proj = gdf.to_crs(gdf.estimate_utm_crs())\r\ngdf['buffer_1km'] = gdf_proj.geometry.buffer(1000)\r\n\r\n# Spatial relationships\r\nintersects = gdf[gdf.geometry.intersects(other_geometry)]\r\ncontains = gdf[gdf.geometry.contains(point_geometry)]\r\n\r\n# Geometric operations\r\ngdf['centroid'] = gdf.geometry.centroid\r\ngdf['simplified'] = gdf.geometry.simplify(tolerance=0.001)\r\n\r\n# Overlay operations\r\nintersection = gpd.overlay(gdf1, gdf2, how='intersection')\r\nunion = gpd.overlay(gdf1, gdf2, how='union')\r\n```\r\n\r\n### Terrain Analysis\r\n\r\n```python\r\ndef terrain_metrics(dem_path):\r\n    \"\"\"Calculate slope, aspect, hillshade from DEM.\"\"\"\r\n    with rasterio.open(dem_path) as src:\r\n        dem = src.read(1)\r\n\r\n    dy, dx = np.gradient(dem)\r\n    slope = np.arctan(np.sqrt(dx**2 + dy**2)) * 180 \u002F np.pi\r\n    aspect = (90 - np.arctan2(-dy, dx) * 180 \u002F np.pi) % 360\r\n\r\n    # Hillshade\r\n    az_rad, alt_rad = np.radians(315), np.radians(45)\r\n    hillshade = (np.sin(alt_rad) * np.sin(np.radians(slope)) +\r\n                 np.cos(alt_rad) * np.cos(np.radians(slope)) *\r\n                 np.cos(np.radians(aspect) - az_rad))\r\n\r\n    return slope, aspect, hillshade\r\n```\r\n\r\n### Network Analysis\r\n\r\n```python\r\nimport osmnx as ox\r\nimport networkx as nx\r\n\r\n# Download and analyze street network\r\nG = ox.graph_from_place('San Francisco, CA', network_type='drive')\r\nG = ox.add_edge_speeds(G).add_edge_travel_times(G)\r\n\r\n# Shortest path\r\norig = ox.distance.nearest_nodes(G, -122.4, 37.7)\r\ndest = ox.distance.nearest_nodes(G, -122.3, 37.8)\r\nroute = nx.shortest_path(G, orig, dest, weight='travel_time')\r\n```\r\n\r\n## Image Classification\r\n\r\n```python\r\nfrom sklearn.ensemble import RandomForestClassifier\r\nimport rasterio\r\nfrom rasterio.features import rasterize\r\n\r\ndef classify_imagery(raster_path, training_gdf, output_path):\r\n    \"\"\"Train RF and classify imagery.\"\"\"\r\n    with rasterio.open(raster_path) as src:\r\n        image = src.read()\r\n        profile = src.profile\r\n        transform = src.transform\r\n\r\n    # Extract training data\r\n    X_train, y_train = [], []\r\n    for _, row in training_gdf.iterrows():\r\n        mask = rasterize([(row.geometry, 1)],\r\n                        out_shape=(profile['height'], profile['width']),\r\n                        transform=transform, fill=0, dtype=np.uint8)\r\n        pixels = image[:, mask > 0].T\r\n        X_train.extend(pixels)\r\n        y_train.extend([row['class_id']] * len(pixels))\r\n\r\n    # Train and predict\r\n    rf = RandomForestClassifier(n_estimators=100, max_depth=20, n_jobs=-1)\r\n    rf.fit(X_train, y_train)\r\n\r\n    prediction = rf.predict(image.reshape(image.shape[0], -1).T)\r\n    prediction = prediction.reshape(profile['height'], profile['width'])\r\n\r\n    profile.update(dtype=rasterio.uint8, count=1)\r\n    with rasterio.open(output_path, 'w', **profile) as dst:\r\n        dst.write(prediction.astype(rasterio.uint8), 1)\r\n\r\n    return rf\r\n```\r\n\r\n## Modern Cloud-Native Workflows\r\n\r\n### STAC + Planetary Computer\r\n\r\n```python\r\nimport pystac_client\r\nimport planetary_computer\r\nimport odc.stac\r\n\r\n# Search Sentinel-2 via STAC\r\ncatalog = pystac_client.Client.open(\r\n    \"https:\u002F\u002Fplanetarycomputer.microsoft.com\u002Fapi\u002Fstac\u002Fv1\",\r\n    modifier=planetary_computer.sign_inplace,\r\n)\r\n\r\nsearch = catalog.search(\r\n    collections=[\"sentinel-2-l2a\"],\r\n    bbox=[-122.5, 37.7, -122.3, 37.9],\r\n    datetime=\"2023-01-01\u002F2023-12-31\",\r\n    query={\"eo:cloud_cover\": {\"lt\": 20}},\r\n)\r\n\r\n# Load as xarray (cloud-native!)\r\ndata = odc.stac.load(\r\n    list(search.get_items())[:5],\r\n    bands=[\"B02\", \"B03\", \"B04\", \"B08\"],\r\n    crs=\"EPSG:32610\",\r\n    resolution=10,\r\n)\r\n\r\n# Calculate NDVI on xarray\r\nndvi = (data.B08 - data.B04) \u002F (data.B08 + data.B04)\r\n```\r\n\r\n### Cloud-Optimized GeoTIFF (COG)\r\n\r\n```python\r\nimport rasterio\r\nfrom rasterio.session import AWSSession\r\n\r\n# Read COG directly from cloud (partial reads)\r\nsession = AWSSession(aws_access_key_id=..., aws_secret_access_key=...)\r\nwith rasterio.open('s3:\u002F\u002Fbucket\u002Fpath.tif', session=session) as src:\r\n    # Read only window of interest\r\n    window = ((1000, 2000), (1000, 2000))\r\n    subset = src.read(1, window=window)\r\n\r\n# Write COG\r\nwith rasterio.open('output.tif', 'w', **profile,\r\n                   tiled=True, blockxsize=256, blockysize=256,\r\n                   compress='DEFLATE', predictor=2) as dst:\r\n    dst.write(data)\r\n\r\n# Validate COG\r\nfrom rio_cogeo.cogeo import cog_validate\r\ncog_validate('output.tif')\r\n```\r\n\r\n## Performance Tips\r\n\r\n```python\r\n# 1. Spatial indexing (10-100x faster queries)\r\ngdf.sindex  # Auto-created by GeoPandas\r\n\r\n# 2. Chunk large rasters\r\nwith rasterio.open('large.tif') as src:\r\n    for i, window in src.block_windows(1):\r\n        block = src.read(1, window=window)\r\n\r\n# 3. Dask for big data\r\nimport dask.array as da\r\ndask_array = da.from_rasterio('large.tif', chunks=(1, 1024, 1024))\r\n\r\n# 4. Use Arrow for I\u002FO\r\ngdf.to_file('output.gpkg', use_arrow=True)\r\n\r\n# 5. GDAL caching\r\nfrom osgeo import gdal\r\ngdal.SetCacheMax(2**30)  # 1GB cache\r\n\r\n# 6. Parallel processing\r\nrf = RandomForestClassifier(n_jobs=-1)  # All cores\r\n```\r\n\r\n## Best Practices\r\n\r\n1. **Always check CRS** before spatial operations\r\n2. **Use projected CRS** for area\u002Fdistance calculations\r\n3. **Validate geometries**: `gdf = gdf[gdf.is_valid]`\r\n4. **Handle missing data**: `gdf['geometry'] = gdf['geometry'].fillna(None)`\r\n5. **Use efficient formats**: GeoPackage > Shapefile, Parquet for large data\r\n6. **Apply cloud masking** to optical imagery\r\n7. **Preserve lineage** for reproducible research\r\n8. **Use appropriate resolution** for your analysis scale\r\n\r\n## Detailed Documentation\r\n\r\n- **[Coordinate Systems](references\u002Fcoordinate-systems.md)** - CRS fundamentals, UTM, transformations\r\n- **[Core Libraries](references\u002Fcore-libraries.md)** - GDAL, Rasterio, GeoPandas, Shapely\r\n- **[Remote Sensing](references\u002Fremote-sensing.md)** - Satellite missions, spectral indices, SAR\r\n- **[Machine Learning](references\u002Fmachine-learning.md)** - Deep learning, CNNs, GNNs for RS\r\n- **[GIS Software](references\u002Fgis-software.md)** - QGIS, ArcGIS, GRASS integration\r\n- **[Scientific Domains](references\u002Fscientific-domains.md)** - Marine, hydrology, agriculture, forestry\r\n- **[Advanced GIS](references\u002Fadvanced-gis.md)** - 3D GIS, spatiotemporal, topology\r\n- **[Big Data](references\u002Fbig-data.md)** - Distributed processing, GPU acceleration\r\n- **[Industry Applications](references\u002Findustry-applications.md)** - Urban planning, disaster management\r\n- **[Programming Languages](references\u002Fprogramming-languages.md)** - Python, R, Julia, JS, C++, Java, Go, Rust\r\n- **[Data Sources](references\u002Fdata-sources.md)** - Satellite catalogs, APIs\r\n- **[Troubleshooting](references\u002Ftroubleshooting.md)** - Common issues, debugging, error reference\r\n- **[Code Examples](references\u002Fcode-examples.md)** - 500+ examples\r\n\r\n---\r\n\r\n**GeoMaster covers everything from basic GIS operations to advanced remote sensing and machine learning.**\r\n","# GeoMaster\r\n\r\nComprehensive geospatial science skill covering GIS, remote sensing, spatial analysis, and ML for Earth observation across 70+ topics with 500+ code examples in 8 programming languages.\r\n\r\n## Installation\r\n\r\n```bash\r\n# Core Python stack (conda recommended)\r\nconda install -c conda-forge gdal rasterio fiona shapely pyproj geopandas\r\n\r\n# Remote sensing & ML\r\nuv pip install rsgislib torchgeo earthengine-api\r\nuv pip install scikit-learn xgboost torch-geometric\r\n\r\n# Network & visualization\r\nuv pip install osmnx networkx folium keplergl\r\nuv pip install cartopy contextily mapclassify\r\n\r\n# Big data & cloud\r\nuv pip install xarray rioxarray dask-geopandas\r\nuv pip install pystac-client planetary-computer\r\n\r\n# Point clouds\r\nuv pip install laspy pylas open3d pdal\r\n\r\n# Databases\r\nconda install -c conda-forge postgis spatialite\r\n```\r\n\r\n## Quick Start\r\n\r\n### NDVI from Sentinel-2\r\n\r\n```python\r\nimport rasterio\r\nimport numpy as np\r\n\r\nwith rasterio.open('sentinel2.tif') as src:\r\n    red = src.read(4).astype(float)   # B04\r\n    nir = src.read(8).astype(float)   # B08\r\n    ndvi = (nir - red) \u002F (nir + red + 1e-8)\r\n    ndvi = np.nan_to_num(ndvi, nan=0)\r\n\r\n    profile = src.profile\r\n    profile.update(count=1, dtype=rasterio.float32)\r\n\r\n    with rasterio.open('ndvi.tif', 'w', **profile) as dst:\r\n        dst.write(ndvi.astype(rasterio.float32), 1)\r\n```\r\n\r\n### Spatial Analysis with GeoPandas\r\n\r\n```python\r\nimport geopandas as gpd\r\n\r\n# Load and ensure same CRS\r\nzones = gpd.read_file('zones.geojson')\r\npoints = gpd.read_file('points.geojson')\r\n\r\nif zones.crs != points.crs:\r\n    points = points.to_crs(zones.crs)\r\n\r\n# Spatial join and statistics\r\njoined = gpd.sjoin(points, zones, how='inner', predicate='within')\r\nstats = joined.groupby('zone_id').agg({\r\n    'value': ['count', 'mean', 'std', 'min', 'max']\r\n}).round(2)\r\n```\r\n\r\n### Google Earth Engine Time Series\r\n\r\n```python\r\nimport ee\r\nimport pandas as pd\r\n\r\nee.Initialize(project='your-project')\r\nroi = ee.Geometry.Point([-122.4, 37.7]).buffer(10000)\r\n\r\ns2 = (ee.ImageCollection('COPERNICUS\u002FS2_SR_HARMONIZED')\r\n      .filterBounds(roi)\r\n      .filterDate('2020-01-01', '2023-12-31')\r\n      .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20)))\r\n\r\ndef add_ndvi(img):\r\n    return img.addBands(img.normalizedDifference(['B8', 'B4']).rename('NDVI'))\r\n\r\ns2_ndvi = s2.map(add_ndvi)\r\n\r\ndef extract_series(image):\r\n    stats = image.reduceRegion(ee.Reducer.mean(), roi.centroid(), scale=10, maxPixels=1e9)\r\n    return ee.Feature(None, {'date': image.date().format('YYYY-MM-dd'), 'ndvi': stats.get('NDVI')})\r\n\r\nseries = s2_ndvi.map(extract_series).getInfo()\r\ndf = pd.DataFrame([f['properties'] for f in series['features']])\r\ndf['date'] = pd.to_datetime(df['date'])\r\n```\r\n\r\n## Core Concepts\r\n\r\n### Data Types\r\n\r\n| Type | Examples | Libraries |\r\n|------|----------|-----------|\r\n| Vector | Shapefile, GeoJSON, GeoPackage | GeoPandas, Fiona, GDAL |\r\n| Raster | GeoTIFF, NetCDF, COG | Rasterio, Xarray, GDAL |\r\n| Point Cloud | LAS, LAZ | Laspy, PDAL, Open3D |\r\n\r\n### Coordinate Systems\r\n\r\n- **EPSG:4326** (WGS 84) - Geographic, lat\u002Flon, use for storage\r\n- **EPSG:3857** (Web Mercator) - Web maps only (don't use for area\u002Fdistance!)\r\n- **EPSG:326xx\u002F327xx** (UTM) - Metric calculations, \u003C1% distortion per zone\r\n- Use `gdf.estimate_utm_crs()` for automatic UTM detection\r\n\r\n```python\r\n# Always check CRS before operations\r\nassert gdf1.crs == gdf2.crs, \"CRS mismatch!\"\r\n\r\n# For area\u002Fdistance calculations, use projected CRS\r\ngdf_metric = gdf.to_crs(gdf.estimate_utm_crs())\r\narea_sqm = gdf_metric.geometry.area\r\n```\r\n\r\n### OGC Standards\r\n\r\n- **WMS**: Web Map Service - raster maps\r\n- **WFS**: Web Feature Service - vector data\r\n- **WCS**: Web Coverage Service - raster coverage\r\n- **STAC**: Spatiotemporal Asset Catalog - modern metadata\r\n\r\n## Common Operations\r\n\r\n### Spectral Indices\r\n\r\n```python\r\ndef calculate_indices(image_path):\r\n    \"\"\"NDVI, EVI, SAVI, NDWI from Sentinel-2.\"\"\"\r\n    with rasterio.open(image_path) as src:\r\n        B02, B03, B04, B08, B11 = [src.read(i).astype(float) for i in [1,2,3,4,5]]\r\n\r\n    ndvi = (B08 - B04) \u002F (B08 + B04 + 1e-8)\r\n    evi = 2.5 * (B08 - B04) \u002F (B08 + 6*B04 - 7.5*B02 + 1)\r\n    savi = ((B08 - B04) \u002F (B08 + B04 + 0.5)) * 1.5\r\n    ndwi = (B03 - B08) \u002F (B03 + B08 + 1e-8)\r\n\r\n    return {'NDVI': ndvi, 'EVI': evi, 'SAVI': savi, 'NDWI': ndwi}\r\n```\r\n\r\n### Vector Operations\r\n\r\n```python\r\n# Buffer (use projected CRS!)\r\ngdf_proj = gdf.to_crs(gdf.estimate_utm_crs())\r\ngdf['buffer_1km'] = gdf_proj.geometry.buffer(1000)\r\n\r\n# Spatial relationships\r\nintersects = gdf[gdf.geometry.intersects(other_geometry)]\r\ncontains = gdf[gdf.geometry.contains(point_geometry)]\r\n\r\n# Geometric operations\r\ngdf['centroid'] = gdf.geometry.centroid\r\ngdf['simplified'] = gdf.geometry.simplify(tolerance=0.001)\r\n\r\n# Overlay operations\r\nintersection = gpd.overlay(gdf1, gdf2, how='intersection')\r\nunion = gpd.overlay(gdf1, gdf2, how='union')\r\n```\r\n\r\n### Terrain Analysis\r\n\r\n```python\r\ndef terrain_metrics(dem_path):\r\n    \"\"\"Calculate slope, aspect, hillshade from DEM.\"\"\"\r\n    with rasterio.open(dem_path) as src:\r\n        dem = src.read(1)\r\n\r\n    dy, dx = np.gradient(dem)\r\n    slope = np.arctan(np.sqrt(dx**2 + dy**2)) * 180 \u002F np.pi\r\n    aspect = (90 - np.arctan2(-dy, dx) * 180 \u002F np.pi) % 360\r\n\r\n    # Hillshade\r\n    az_rad, alt_rad = np.radians(315), np.radians(45)\r\n    hillshade = (np.sin(alt_rad) * np.sin(np.radians(slope)) +\r\n                 np.cos(alt_rad) * np.cos(np.radians(slope)) *\r\n                 np.cos(np.radians(aspect) - az_rad))\r\n\r\n    return slope, aspect, hillshade\r\n```\r\n\r\n### Network Analysis\r\n\r\n```python\r\nimport osmnx as ox\r\nimport networkx as nx\r\n\r\n# Download and analyze street network\r\nG = ox.graph_from_place('San Francisco, CA', network_type='drive')\r\nG = ox.add_edge_speeds(G).add_edge_travel_times(G)\r\n\r\n# Shortest path\r\norig = ox.distance.nearest_nodes(G, -122.4, 37.7)\r\ndest = ox.distance.nearest_nodes(G, -122.3, 37.8)\r\nroute = nx.shortest_path(G, orig, dest, weight='travel_time')\r\n```\r\n\r\n## Image Classification\r\n\r\n```python\r\nfrom sklearn.ensemble import RandomForestClassifier\r\nimport rasterio\r\nfrom rasterio.features import rasterize\r\n\r\ndef classify_imagery(raster_path, training_gdf, output_path):\r\n    \"\"\"Train RF and classify imagery.\"\"\"\r\n    with rasterio.open(raster_path) as src:\r\n        image = src.read()\r\n        profile = src.profile\r\n        transform = src.transform\r\n\r\n    # Extract training data\r\n    X_train, y_train = [], []\r\n    for _, row in training_gdf.iterrows():\r\n        mask = rasterize([(row.geometry, 1)],\r\n                        out_shape=(profile['height'], profile['width']),\r\n                        transform=transform, fill=0, dtype=np.uint8)\r\n        pixels = image[:, mask > 0].T\r\n        X_train.extend(pixels)\r\n        y_train.extend([row['class_id']] * len(pixels))\r\n\r\n    # Train and predict\r\n    rf = RandomForestClassifier(n_estimators=100, max_depth=20, n_jobs=-1)\r\n    rf.fit(X_train, y_train)\r\n\r\n    prediction = rf.predict(image.reshape(image.shape[0], -1).T)\r\n    prediction = prediction.reshape(profile['height'], profile['width'])\r\n\r\n    profile.update(dtype=rasterio.uint8, count=1)\r\n    with rasterio.open(output_path, 'w', **profile) as dst:\r\n        dst.write(prediction.astype(rasterio.uint8), 1)\r\n\r\n    return rf\r\n```\r\n\r\n## Modern Cloud-Native Workflows\r\n\r\n### STAC + Planetary Computer\r\n\r\n```python\r\nimport pystac_client\r\nimport planetary_computer\r\nimport odc.stac\r\n\r\n# Search Sentinel-2 via STAC\r\ncatalog = pystac_client.Client.open(\r\n    \"https:\u002F\u002Fplanetarycomputer.microsoft.com\u002Fapi\u002Fstac\u002Fv1\",\r\n    modifier=planetary_computer.sign_inplace,\r\n)\r\n\r\nsearch = catalog.search(\r\n    collections=[\"sentinel-2-l2a\"],\r\n    bbox=[-122.5, 37.7, -122.3, 37.9],\r\n    datetime=\"2023-01-01\u002F2023-12-31\",\r\n    query={\"eo:cloud_cover\": {\"lt\": 20}},\r\n)\r\n\r\n# Load as xarray (cloud-native!)\r\ndata = odc.stac.load(\r\n    list(search.get_items())[:5],\r\n    bands=[\"B02\", \"B03\", \"B04\", \"B08\"],\r\n    crs=\"EPSG:32610\",\r\n    resolution=10,\r\n)\r\n\r\n# Calculate NDVI on xarray\r\nndvi = (data.B08 - data.B04) \u002F (data.B08 + data.B04)\r\n```\r\n\r\n### Cloud-Optimized GeoTIFF (COG)\r\n\r\n```python\r\nimport rasterio\r\nfrom rasterio.session import AWSSession\r\n\r\n# Read COG directly from cloud (partial reads)\r\nsession = AWSSession(aws_access_key_id=..., aws_secret_access_key=...)\r\nwith rasterio.open('s3:\u002F\u002Fbucket\u002Fpath.tif', session=session) as src:\r\n    # Read only window of interest\r\n    window = ((1000, 2000), (1000, 2000))\r\n    subset = src.read(1, window=window)\r\n\r\n# Write COG\r\nwith rasterio.open('output.tif', 'w', **profile,\r\n                   tiled=True, blockxsize=256, blockysize=256,\r\n                   compress='DEFLATE', predictor=2) as dst:\r\n    dst.write(data)\r\n\r\n# Validate COG\r\nfrom rio_cogeo.cogeo import cog_validate\r\ncog_validate('output.tif')\r\n```\r\n\r\n## Performance Tips\r\n\r\n```python\r\n# 1. Spatial indexing (10-100x faster queries)\r\ngdf.sindex  # Auto-created by GeoPandas\r\n\r\n# 2. Chunk large rasters\r\nwith rasterio.open('large.tif') as src:\r\n    for i, window in src.block_windows(1):\r\n        block = src.read(1, window=window)\r\n\r\n# 3. Dask for big data\r\nimport dask.array as da\r\ndask_array = da.from_rasterio('large.tif', chunks=(1, 1024, 1024))\r\n\r\n# 4. Use Arrow for I\u002FO\r\ngdf.to_file('output.gpkg', use_arrow=True)\r\n\r\n# 5. GDAL caching\r\nfrom osgeo import gdal\r\ngdal.SetCacheMax(2**30)  # 1GB cache\r\n\r\n# 6. Parallel processing\r\nrf = RandomForestClassifier(n_jobs=-1)  # All cores\r\n```\r\n\r\n## Best Practices\r\n\r\n1. **Always check CRS** before spatial operations\r\n2. **Use projected CRS** for area\u002Fdistance calculations\r\n3. **Validate geometries**: `gdf = gdf[gdf.is_valid]`\r\n4. **Handle missing data**: `gdf['geometry'] = gdf['geometry'].fillna(None)`\r\n5. **Use efficient formats**: GeoPackage > Shapefile, Parquet for large data\r\n6. **Apply cloud masking** to optical imagery\r\n7. **Preserve lineage** for reproducible research\r\n8. **Use appropriate resolution** for your analysis scale\r\n\r\n## Detailed Documentation\r\n\r\n- **[Coordinate Systems](references\u002Fcoordinate-systems.md)** - CRS fundamentals, UTM, transformations\r\n- **[Core Libraries](references\u002Fcore-libraries.md)** - GDAL, Rasterio, GeoPandas, Shapely\r\n- **[Remote Sensing](references\u002Fremote-sensing.md)** - Satellite missions, spectral indices, SAR\r\n- **[Machine Learning](references\u002Fmachine-learning.md)** - Deep learning, CNNs, GNNs for RS\r\n- **[GIS Software](references\u002Fgis-software.md)** - QGIS, ArcGIS, GRASS integration\r\n- **[Scientific Domains](references\u002Fscientific-domains.md)** - Marine, hydrology, agriculture, forestry\r\n- **[Advanced GIS](references\u002Fadvanced-gis.md)** - 3D GIS, spatiotemporal, topology\r\n- **[Big Data](references\u002Fbig-data.md)** - Distributed processing, GPU acceleration\r\n- **[Industry Applications](references\u002Findustry-applications.md)** - Urban planning, disaster management\r\n- **[Programming Languages](references\u002Fprogramming-languages.md)** - Python, R, Julia, JS, C++, Java, Go, Rust\r\n- **[Data Sources](references\u002Fdata-sources.md)** - Satellite catalogs, APIs\r\n- **[Troubleshooting](references\u002Ftroubleshooting.md)** - Common issues, debugging, error reference\r\n- **[Code Examples](references\u002Fcode-examples.md)** - 500+ examples\r\n\r\n---\r\n\r\n**GeoMaster covers everything from basic GIS operations to advanced remote sensing and machine learning.**\r\n",{"name":5,"license":48,"metadata":49,"description":7},"MIT License",{"skill-author":50},"K-Dense Inc.","master","c2e410e11df4d80d885e0ecf0583ef3c926df736","factory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster",0,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory","https:\u002F\u002Fgithub.com\u002FiDorgham","Dorgham.me","hey I'm Dorgham \r\nI code, I create, and AI codes back. \r\nMaybe we can give AI the chance!! now we begin. 🚀🤖\r\n... . . . git commit -m \"Hello, Future\" ","2026-05-04 18:39:09",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add iDorgham\u002FWorkspace-Factory --skill geomaster",{"tool":66,"command":67},"bunx","bunx skills add iDorgham\u002FWorkspace-Factory --skill geomaster",{"tool":69,"command":70},"pnpm","pnpm dlx skills add iDorgham\u002FWorkspace-Factory --skill geomaster","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002FSKILL.md",true,[74,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136],{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"_AIWF_IMPORT.json","REFERENCE","参考文档",347,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002F_AIWF_IMPORT.json",{"path":81,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":82,"sourceHtmlUrl":83},"README.md",3323,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002FREADME.md",{"path":85,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":86,"sourceHtmlUrl":87},"references\u002Fadvanced-gis.md",11121,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002Freferences\u002Fadvanced-gis.md",{"path":89,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":90,"sourceHtmlUrl":91},"references\u002Fbig-data.md",8818,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002Freferences\u002Fbig-data.md",{"path":93,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Fcode-examples.md",13023,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002Freferences\u002Fcode-examples.md",{"path":97,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Fcoordinate-systems.md",8893,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002Freferences\u002Fcoordinate-systems.md",{"path":101,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":102,"sourceHtmlUrl":103},"references\u002Fcore-libraries.md",6866,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002Freferences\u002Fcore-libraries.md",{"path":105,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":106,"sourceHtmlUrl":107},"references\u002Fdata-sources.md",9331,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002Freferences\u002Fdata-sources.md",{"path":109,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":110,"sourceHtmlUrl":111},"references\u002Fgis-software.md",9284,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002Freferences\u002Fgis-software.md",{"path":113,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":114,"sourceHtmlUrl":115},"references\u002Findustry-applications.md",13491,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002Freferences\u002Findustry-applications.md",{"path":117,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":118,"sourceHtmlUrl":119},"references\u002Fmachine-learning.md",13245,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002Freferences\u002Fmachine-learning.md",{"path":121,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":122,"sourceHtmlUrl":123},"references\u002Fprogramming-languages.md",11417,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002Freferences\u002Fprogramming-languages.md",{"path":125,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":126,"sourceHtmlUrl":127},"references\u002Fremote-sensing.md",10474,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002Freferences\u002Fremote-sensing.md",{"path":129,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":130,"sourceHtmlUrl":131},"references\u002Fscientific-domains.md",11027,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002Freferences\u002Fscientific-domains.md",{"path":133,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":134,"sourceHtmlUrl":135},"references\u002Fspecialized-topics.md",11114,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002Freferences\u002Fspecialized-topics.md",{"path":137,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":138,"sourceHtmlUrl":139},"references\u002Ftroubleshooting.md",11219,"https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fgithub_imports\u002Fgeomaster\u002Freferences\u002Ftroubleshooting.md",[141,174,196,216,236,259],{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":152,"publishedAt":173},"01M71P8WVBMB2X3D24R0YT0B0E","vercel-react-view-transitions","Guide for implementing smooth, native-feeling animations using React's View Transition API (`\u003CViewTransition>` component, `addTransitionType`, and CSS view transition pseudo-elements). Use this skill whenever the user wants to add page transitions, animate route changes, create shared element animations, animate enter\u002Fexit of components, animate list reorder, implement directional (forward\u002Fback) navigation animations, or integrate view transitions in Next.js. Also use when the user mentions view transitions, `startViewTransition`, `ViewTransition`, transition types, or asks about animating between UI states in React without third-party animation libraries.","https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fofficial_vercel_labs_react_view_transitions\u002Fskill.md",[147],{"categoryNo":148,"categoryName":149,"taxonomyType":150,"taxonomyTypeDesc":151},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172],"react","vercel react view transitions","view","react view transitions","vercel","transitions","shared","back","Animation","css","types","states","element","implementing","when","components","api","route","create","libraries","2026-11-10 13:02:02",{"skillNo":175,"name":176,"nameZh":6,"description":177,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":178,"categories":179,"keywords":181,"publishedAt":173},"01M71P8TDGHZ289TSAC5VTG2EW","vercel-react-native-skills","React Native and Expo best practices for building performant mobile apps. Use when building React Native components, optimizing list performance, implementing animations, or working with native modules. Triggers on tasks involving React Native, Expo, mobile performance, or native platform APIs.","https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fofficial_vercel_labs_react_native_skills\u002Fskill.md",[180],{"categoryNo":148,"categoryName":149,"taxonomyType":150,"taxonomyTypeDesc":151},[153,182,26,157,183,184,185,186,166,187,167,188,168,189,190,191,192,193,194,195],"react native","vercel react native skills","react native skills","modules","performance","apps","tasks","mobile","expo","list","mobile performance","platform","animations","for",{"skillNo":197,"name":198,"nameZh":6,"description":199,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":200,"categories":201,"keywords":203,"publishedAt":173},"01M71P8QK4JF5BYRGYDDGPZQG9","vercel-react-best-practices","React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React\u002FNext.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.","https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fofficial_vercel_labs_react_best_practices\u002Fskill.md",[202],{"categoryNo":148,"categoryName":149,"taxonomyType":150,"taxonomyTypeDesc":151},[153,204,205,157,206,186,207,167,40,188,168,208,209,210,211,37,212,213,214,215],"react best practices","vercel react best practices","best practices","writing","data fetching","react components","next","refactoring","patterns","Optimization","guidelines","triggers",{"skillNo":217,"name":218,"nameZh":6,"description":219,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":220,"categories":221,"keywords":223,"publishedAt":173},"01M71P8HVEA70K5N6ZVJCG2ED3","vercel-composition-patterns","React composition patterns that scale. Use when refactoring components with boolean prop proliferation, building flexible component libraries, or designing reusable APIs. Triggers on tasks involving compound components, render props, context providers, or component architecture. Includes React 19 API changes.","https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fofficial_vercel_labs_composition_patterns\u002Fskill.md",[222],{"categoryNo":148,"categoryName":149,"taxonomyType":150,"taxonomyTypeDesc":151},[224,157,225,212,226,227,228,229,215,230,231,232,167,233,188,168,234,235,169,153],"Composition","composition patterns","vercel composition patterns","react composition patterns","react 19","render","boolean","component architecture","use","reusable","architecture","react composition",{"skillNo":237,"name":238,"nameZh":6,"description":239,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":240,"categories":241,"keywords":245,"publishedAt":173},"01M71P60XXKKP222ZFJRG7R373","supabase-postgres-best-practices","Postgres performance optimization and best practices from Supabase. Use this skill when writing, reviewing, or optimizing Postgres queries, schema designs, or database configurations.","https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fofficial_supabase_supabase_postgres_best_practices\u002Fskill.md",[242],{"categoryNo":243,"categoryName":244,"taxonomyType":150,"taxonomyTypeDesc":151},"01JBSEEDCAT000000000000010","后端与接口",[246,247,248,249,206,250,251,252,195,213,186,253,254,207,255,232,256,257,258,167],"postgres best practices","supabase","postgres","supabase postgres best practices","categories","postgres performance","advanced","correct","schema","impact","Rules","critical","database",{"skillNo":260,"name":261,"nameZh":6,"description":262,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":263,"categories":264,"keywords":266,"publishedAt":282},"01M71P2ZCEJD0PKC458YTP1FJW","portable-text-serialization","Render and serialize Portable Text to React, Svelte, Vue, Astro, HTML, Markdown, and plain text. Use when implementing Portable Text rendering in any frontend framework, building custom serializers for non-standard block types, converting Portable Text to HTML strings server-side, converting Portable Text to Markdown, extracting plain text from Portable Text, or troubleshooting rendering issues with marks, blocks, lists, or custom types.","https:\u002F\u002Fgithub.com\u002FiDorgham\u002FWorkspace-Factory\u002Fblob\u002Fmaster\u002Ffactory\u002Flibrary\u002Fskills\u002Fofficial_sanity_io_portable_text_serialization\u002Fskill.md",[265],{"categoryNo":148,"categoryName":149,"taxonomyType":150,"taxonomyTypeDesc":151},[267,268,269,270,271,163,272,229,273,166,274,275,167,153,276,277,278,279,280,281],"text","portable text serialization","portable","serialization","extracting","strings","issues","frontend","svelte","sanity","astro","server","markdown","rendering","vue","2026-11-10 10:56:23"]