[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7CDTT97EXYAPB6NW97AXP2T":3,"skill-same:01M7CDTT97EXYAPB6NW97AXP2T":56},{"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":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":28,"commitSha":29,"skillDirectory":30,"forksCount":31,"repositoryHtmlUrl":32,"repositoryHomepageUrl":6,"ownerHtmlUrl":33,"ownerBlogUrl":6,"ownerDescription":34,"updatedAt":35,"install":36,"resources":49},"01M7CDTT97EXYAPB6NW97AXP2T","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.","om-scogo\u002Fskillsh-scraper","om-scogo","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F160466840?v=4","01M79AWB6DFVCQ7RK70CS34B96","Om Achrekar","01M79AWB6ZM9SKR8KDH1WSSM22",0,"MIT","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fk-dense-ai-scientific-agent-skills\u002Fgeomaster\u002FSkill.md",[],[],"2026-11-15 14:19:17",false,"---\nname: geomaster\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.\nlicense: MIT License\nmetadata: {\"version\": \"1.0\", \"skill-author\": \"K-Dense Inc.\"}\n---\n\n# GeoMaster\n\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.\n\n## Installation\n\n```bash\n# Core Python stack (conda recommended)\nconda install -c conda-forge gdal rasterio fiona shapely pyproj geopandas\n\n# Remote sensing & ML\nuv pip install rsgislib torchgeo earthengine-api\nuv pip install scikit-learn xgboost torch-geometric\n\n# Network & visualization\nuv pip install osmnx networkx folium keplergl\nuv pip install cartopy contextily mapclassify\n\n# Big data & cloud\nuv pip install xarray rioxarray dask-geopandas\nuv pip install pystac-client planetary-computer\n\n# Point clouds\nuv pip install laspy pylas open3d pdal\n\n# Databases\nconda install -c conda-forge postgis spatialite\n```\n\n## Quick Start\n\n### NDVI from Sentinel-2\n\n```python\nimport rasterio\nimport numpy as np\n\nwith rasterio.open('sentinel2.tif') as src:\n    red = src.read(4).astype(float)   # B04\n    nir = src.read(8).astype(float)   # B08\n    ndvi = (nir - red) \u002F (nir + red + 1e-8)\n    ndvi = np.nan_to_num(ndvi, nan=0)\n\n    profile = src.profile\n    profile.update(count=1, dtype=rasterio.float32)\n\n    with rasterio.open('ndvi.tif', 'w', **profile) as dst:\n        dst.write(ndvi.astype(rasterio.float32), 1)\n```\n\n### Spatial Analysis with GeoPandas\n\n```python\nimport geopandas as gpd\n\n# Load and ensure same CRS\nzones = gpd.read_file('zones.geojson')\npoints = gpd.read_file('points.geojson')\n\nif zones.crs != points.crs:\n    points = points.to_crs(zones.crs)\n\n# Spatial join and statistics\njoined = gpd.sjoin(points, zones, how='inner', predicate='within')\nstats = joined.groupby('zone_id').agg({\n    'value': ['count', 'mean', 'std', 'min', 'max']\n}).round(2)\n```\n\n### Google Earth Engine Time Series\n\n```python\nimport ee\nimport pandas as pd\n\nee.Initialize(project='your-project')\nroi = ee.Geometry.Point([-122.4, 37.7]).buffer(10000)\n\ns2 = (ee.ImageCollection('COPERNICUS\u002FS2_SR_HARMONIZED')\n      .filterBounds(roi)\n      .filterDate('2020-01-01', '2023-12-31')\n      .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20)))\n\ndef add_ndvi(img):\n    return img.addBands(img.normalizedDifference(['B8', 'B4']).rename('NDVI'))\n\ns2_ndvi = s2.map(add_ndvi)\n\ndef extract_series(image):\n    stats = image.reduceRegion(ee.Reducer.mean(), roi.centroid(), scale=10, maxPixels=1e9)\n    return ee.Feature(None, {'date': image.date().format('YYYY-MM-dd'), 'ndvi': stats.get('NDVI')})\n\nseries = s2_ndvi.map(extract_series).getInfo()\ndf = pd.DataFrame([f['properties'] for f in series['features']])\ndf['date'] = pd.to_datetime(df['date'])\n```\n\n## Core Concepts\n\n### Data Types\n\n| Type | Examples | Libraries |\n|------|----------|-----------|\n| Vector | Shapefile, GeoJSON, GeoPackage | GeoPandas, Fiona, GDAL |\n| Raster | GeoTIFF, NetCDF, COG | Rasterio, Xarray, GDAL |\n| Point Cloud | LAS, LAZ | Laspy, PDAL, Open3D |\n\n### Coordinate Systems\n\n- **EPSG:4326** (WGS 84) - Geographic, lat\u002Flon, use for storage\n- **EPSG:3857** (Web Mercator) - Web maps only (don't use for area\u002Fdistance!)\n- **EPSG:326xx\u002F327xx** (UTM) - Metric calculations, \u003C1% distortion per zone\n- Use `gdf.estimate_utm_crs()` for automatic UTM detection\n\n```python\n# Always check CRS before operations\nassert gdf1.crs == gdf2.crs, \"CRS mismatch!\"\n\n# For area\u002Fdistance calculations, use projected CRS\ngdf_metric = gdf.to_crs(gdf.estimate_utm_crs())\narea_sqm = gdf_metric.geometry.area\n```\n\n### OGC Standards\n\n- **WMS**: Web Map Service - raster maps\n- **WFS**: Web Feature Service - vector data\n- **WCS**: Web Coverage Service - raster coverage\n- **STAC**: Spatiotemporal Asset Catalog - modern metadata\n\n## Common Operations\n\n### Spectral Indices\n\n```python\ndef calculate_indices(image_path):\n    \"\"\"NDVI, EVI, SAVI, NDWI from Sentinel-2.\"\"\"\n    with rasterio.open(image_path) as src:\n        B02, B03, B04, B08, B11 = [src.read(i).astype(float) for i in [1,2,3,4,5]]\n\n    ndvi = (B08 - B04) \u002F (B08 + B04 + 1e-8)\n    evi = 2.5 * (B08 - B04) \u002F (B08 + 6*B04 - 7.5*B02 + 1)\n    savi = ((B08 - B04) \u002F (B08 + B04 + 0.5)) * 1.5\n    ndwi = (B03 - B08) \u002F (B03 + B08 + 1e-8)\n\n    return {'NDVI': ndvi, 'EVI': evi, 'SAVI': savi, 'NDWI': ndwi}\n```\n\n### Vector Operations\n\n```python\n# Buffer (use projected CRS!)\ngdf_proj = gdf.to_crs(gdf.estimate_utm_crs())\ngdf['buffer_1km'] = gdf_proj.geometry.buffer(1000)\n\n# Spatial relationships\nintersects = gdf[gdf.geometry.intersects(other_geometry)]\ncontains = gdf[gdf.geometry.contains(point_geometry)]\n\n# Geometric operations\ngdf['centroid'] = gdf.geometry.centroid\ngdf['simplified'] = gdf.geometry.simplify(tolerance=0.001)\n\n# Overlay operations\nintersection = gpd.overlay(gdf1, gdf2, how='intersection')\nunion = gpd.overlay(gdf1, gdf2, how='union')\n```\n\n### Terrain Analysis\n\n```python\ndef terrain_metrics(dem_path):\n    \"\"\"Calculate slope, aspect, hillshade from DEM.\"\"\"\n    with rasterio.open(dem_path) as src:\n        dem = src.read(1)\n\n    dy, dx = np.gradient(dem)\n    slope = np.arctan(np.sqrt(dx**2 + dy**2)) * 180 \u002F np.pi\n    aspect = (90 - np.arctan2(-dy, dx) * 180 \u002F np.pi) % 360\n\n    # Hillshade\n    az_rad, alt_rad = np.radians(315), np.radians(45)\n    hillshade = (np.sin(alt_rad) * np.sin(np.radians(slope)) +\n                 np.cos(alt_rad) * np.cos(np.radians(slope)) *\n                 np.cos(np.radians(aspect) - az_rad))\n\n    return slope, aspect, hillshade\n```\n\n### Network Analysis\n\n```python\nimport osmnx as ox\nimport networkx as nx\n\n# Download and analyze street network\nG = ox.graph_from_place('San Francisco, CA', network_type='drive')\nG = ox.add_edge_speeds(G).add_edge_travel_times(G)\n\n# Shortest path\norig = ox.distance.nearest_nodes(G, -122.4, 37.7)\ndest = ox.distance.nearest_nodes(G, -122.3, 37.8)\nroute = nx.shortest_path(G, orig, dest, weight='travel_time')\n```\n\n## Image Classification\n\n```python\nfrom sklearn.ensemble import RandomForestClassifier\nimport rasterio\nfrom rasterio.features import rasterize\n\ndef classify_imagery(raster_path, training_gdf, output_path):\n    \"\"\"Train RF and classify imagery.\"\"\"\n    with rasterio.open(raster_path) as src:\n        image = src.read()\n        profile = src.profile\n        transform = src.transform\n\n    # Extract training data\n    X_train, y_train = [], []\n    for _, row in training_gdf.iterrows():\n        mask = rasterize([(row.geometry, 1)],\n                        out_shape=(profile['height'], profile['width']),\n                        transform=transform, fill=0, dtype=np.uint8)\n        pixels = image[:, mask > 0].T\n        X_train.extend(pixels)\n        y_train.extend([row['class_id']] * len(pixels))\n\n    # Train and predict\n    rf = RandomForestClassifier(n_estimators=100, max_depth=20, n_jobs=-1)\n    rf.fit(X_train, y_train)\n\n    prediction = rf.predict(image.reshape(image.shape[0], -1).T)\n    prediction = prediction.reshape(profile['height'], profile['width'])\n\n    profile.update(dtype=rasterio.uint8, count=1)\n    with rasterio.open(output_path, 'w', **profile) as dst:\n        dst.write(prediction.astype(rasterio.uint8), 1)\n\n    return rf\n```\n\n## Modern Cloud-Native Workflows\n\n### STAC + Planetary Computer\n\n```python\nimport pystac_client\nimport planetary_computer\nimport odc.stac\n\n# Search Sentinel-2 via STAC\ncatalog = pystac_client.Client.open(\n    \"https:\u002F\u002Fplanetarycomputer.microsoft.com\u002Fapi\u002Fstac\u002Fv1\",\n    modifier=planetary_computer.sign_inplace,\n)\n\nsearch = catalog.search(\n    collections=[\"sentinel-2-l2a\"],\n    bbox=[-122.5, 37.7, -122.3, 37.9],\n    datetime=\"2023-01-01\u002F2023-12-31\",\n    query={\"eo:cloud_cover\": {\"lt\": 20}},\n)\n\n# Load as xarray (cloud-native!)\ndata = odc.stac.load(\n    list(search.get_items())[:5],\n    bands=[\"B02\", \"B03\", \"B04\", \"B08\"],\n    crs=\"EPSG:32610\",\n    resolution=10,\n)\n\n# Calculate NDVI on xarray\nndvi = (data.B08 - data.B04) \u002F (data.B08 + data.B04)\n```\n\n### Cloud-Optimized GeoTIFF (COG)\n\n```python\nimport rasterio\nfrom rasterio.session import AWSSession\n\n# Read COG directly from cloud (partial reads)\nsession = AWSSession(aws_access_key_id=..., aws_secret_access_key=...)\nwith rasterio.open('s3:\u002F\u002Fbucket\u002Fpath.tif', session=session) as src:\n    # Read only window of interest\n    window = ((1000, 2000), (1000, 2000))\n    subset = src.read(1, window=window)\n\n# Write COG\nwith rasterio.open('output.tif', 'w', **profile,\n                   tiled=True, blockxsize=256, blockysize=256,\n                   compress='DEFLATE', predictor=2) as dst:\n    dst.write(data)\n\n# Validate COG\nfrom rio_cogeo.cogeo import cog_validate\ncog_validate('output.tif')\n```\n\n## Performance Tips\n\n```python\n# 1. Spatial indexing (10-100x faster queries)\ngdf.sindex  # Auto-created by GeoPandas\n\n# 2. Chunk large rasters\nwith rasterio.open('large.tif') as src:\n    for i, window in src.block_windows(1):\n        block = src.read(1, window=window)\n\n# 3. Dask for big data\nimport dask.array as da\ndask_array = da.from_rasterio('large.tif', chunks=(1, 1024, 1024))\n\n# 4. Use Arrow for I\u002FO\ngdf.to_file('output.gpkg', use_arrow=True)\n\n# 5. GDAL caching\nfrom osgeo import gdal\ngdal.SetCacheMax(2**30)  # 1GB cache\n\n# 6. Parallel processing\nrf = RandomForestClassifier(n_jobs=-1)  # All cores\n```\n\n## Best Practices\n\n1. **Always check CRS** before spatial operations\n2. **Use projected CRS** for area\u002Fdistance calculations\n3. **Validate geometries**: `gdf = gdf[gdf.is_valid]`\n4. **Handle missing data**: `gdf['geometry'] = gdf['geometry'].fillna(None)`\n5. **Use efficient formats**: GeoPackage > Shapefile, Parquet for large data\n6. **Apply cloud masking** to optical imagery\n7. **Preserve lineage** for reproducible research\n8. **Use appropriate resolution** for your analysis scale\n\n## Detailed Documentation\n\n- **[Coordinate Systems](references\u002Fcoordinate-systems.md)** - CRS fundamentals, UTM, transformations\n- **[Core Libraries](references\u002Fcore-libraries.md)** - GDAL, Rasterio, GeoPandas, Shapely\n- **[Remote Sensing](references\u002Fremote-sensing.md)** - Satellite missions, spectral indices, SAR\n- **[Machine Learning](references\u002Fmachine-learning.md)** - Deep learning, CNNs, GNNs for RS\n- **[GIS Software](references\u002Fgis-software.md)** - QGIS, ArcGIS, GRASS integration\n- **[Scientific Domains](references\u002Fscientific-domains.md)** - Marine, hydrology, agriculture, forestry\n- **[Advanced GIS](references\u002Fadvanced-gis.md)** - 3D GIS, spatiotemporal, topology\n- **[Big Data](references\u002Fbig-data.md)** - Distributed processing, GPU acceleration\n- **[Industry Applications](references\u002Findustry-applications.md)** - Urban planning, disaster management\n- **[Programming Languages](references\u002Fprogramming-languages.md)** - Python, R, Julia, JS, C++, Java, Go, Rust\n- **[Data Sources](references\u002Fdata-sources.md)** - Satellite catalogs, APIs\n- **[Troubleshooting](references\u002Ftroubleshooting.md)** - Common issues, debugging, error reference\n- **[Code Examples](references\u002Fcode-examples.md)** - 500+ examples\n\n---\n\n**GeoMaster covers everything from basic GIS operations to advanced remote sensing and machine learning.**\n","# GeoMaster\n\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.\n\n## Installation\n\n```bash\n# Core Python stack (conda recommended)\nconda install -c conda-forge gdal rasterio fiona shapely pyproj geopandas\n\n# Remote sensing & ML\nuv pip install rsgislib torchgeo earthengine-api\nuv pip install scikit-learn xgboost torch-geometric\n\n# Network & visualization\nuv pip install osmnx networkx folium keplergl\nuv pip install cartopy contextily mapclassify\n\n# Big data & cloud\nuv pip install xarray rioxarray dask-geopandas\nuv pip install pystac-client planetary-computer\n\n# Point clouds\nuv pip install laspy pylas open3d pdal\n\n# Databases\nconda install -c conda-forge postgis spatialite\n```\n\n## Quick Start\n\n### NDVI from Sentinel-2\n\n```python\nimport rasterio\nimport numpy as np\n\nwith rasterio.open('sentinel2.tif') as src:\n    red = src.read(4).astype(float)   # B04\n    nir = src.read(8).astype(float)   # B08\n    ndvi = (nir - red) \u002F (nir + red + 1e-8)\n    ndvi = np.nan_to_num(ndvi, nan=0)\n\n    profile = src.profile\n    profile.update(count=1, dtype=rasterio.float32)\n\n    with rasterio.open('ndvi.tif', 'w', **profile) as dst:\n        dst.write(ndvi.astype(rasterio.float32), 1)\n```\n\n### Spatial Analysis with GeoPandas\n\n```python\nimport geopandas as gpd\n\n# Load and ensure same CRS\nzones = gpd.read_file('zones.geojson')\npoints = gpd.read_file('points.geojson')\n\nif zones.crs != points.crs:\n    points = points.to_crs(zones.crs)\n\n# Spatial join and statistics\njoined = gpd.sjoin(points, zones, how='inner', predicate='within')\nstats = joined.groupby('zone_id').agg({\n    'value': ['count', 'mean', 'std', 'min', 'max']\n}).round(2)\n```\n\n### Google Earth Engine Time Series\n\n```python\nimport ee\nimport pandas as pd\n\nee.Initialize(project='your-project')\nroi = ee.Geometry.Point([-122.4, 37.7]).buffer(10000)\n\ns2 = (ee.ImageCollection('COPERNICUS\u002FS2_SR_HARMONIZED')\n      .filterBounds(roi)\n      .filterDate('2020-01-01', '2023-12-31')\n      .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20)))\n\ndef add_ndvi(img):\n    return img.addBands(img.normalizedDifference(['B8', 'B4']).rename('NDVI'))\n\ns2_ndvi = s2.map(add_ndvi)\n\ndef extract_series(image):\n    stats = image.reduceRegion(ee.Reducer.mean(), roi.centroid(), scale=10, maxPixels=1e9)\n    return ee.Feature(None, {'date': image.date().format('YYYY-MM-dd'), 'ndvi': stats.get('NDVI')})\n\nseries = s2_ndvi.map(extract_series).getInfo()\ndf = pd.DataFrame([f['properties'] for f in series['features']])\ndf['date'] = pd.to_datetime(df['date'])\n```\n\n## Core Concepts\n\n### Data Types\n\n| Type | Examples | Libraries |\n|------|----------|-----------|\n| Vector | Shapefile, GeoJSON, GeoPackage | GeoPandas, Fiona, GDAL |\n| Raster | GeoTIFF, NetCDF, COG | Rasterio, Xarray, GDAL |\n| Point Cloud | LAS, LAZ | Laspy, PDAL, Open3D |\n\n### Coordinate Systems\n\n- **EPSG:4326** (WGS 84) - Geographic, lat\u002Flon, use for storage\n- **EPSG:3857** (Web Mercator) - Web maps only (don't use for area\u002Fdistance!)\n- **EPSG:326xx\u002F327xx** (UTM) - Metric calculations, \u003C1% distortion per zone\n- Use `gdf.estimate_utm_crs()` for automatic UTM detection\n\n```python\n# Always check CRS before operations\nassert gdf1.crs == gdf2.crs, \"CRS mismatch!\"\n\n# For area\u002Fdistance calculations, use projected CRS\ngdf_metric = gdf.to_crs(gdf.estimate_utm_crs())\narea_sqm = gdf_metric.geometry.area\n```\n\n### OGC Standards\n\n- **WMS**: Web Map Service - raster maps\n- **WFS**: Web Feature Service - vector data\n- **WCS**: Web Coverage Service - raster coverage\n- **STAC**: Spatiotemporal Asset Catalog - modern metadata\n\n## Common Operations\n\n### Spectral Indices\n\n```python\ndef calculate_indices(image_path):\n    \"\"\"NDVI, EVI, SAVI, NDWI from Sentinel-2.\"\"\"\n    with rasterio.open(image_path) as src:\n        B02, B03, B04, B08, B11 = [src.read(i).astype(float) for i in [1,2,3,4,5]]\n\n    ndvi = (B08 - B04) \u002F (B08 + B04 + 1e-8)\n    evi = 2.5 * (B08 - B04) \u002F (B08 + 6*B04 - 7.5*B02 + 1)\n    savi = ((B08 - B04) \u002F (B08 + B04 + 0.5)) * 1.5\n    ndwi = (B03 - B08) \u002F (B03 + B08 + 1e-8)\n\n    return {'NDVI': ndvi, 'EVI': evi, 'SAVI': savi, 'NDWI': ndwi}\n```\n\n### Vector Operations\n\n```python\n# Buffer (use projected CRS!)\ngdf_proj = gdf.to_crs(gdf.estimate_utm_crs())\ngdf['buffer_1km'] = gdf_proj.geometry.buffer(1000)\n\n# Spatial relationships\nintersects = gdf[gdf.geometry.intersects(other_geometry)]\ncontains = gdf[gdf.geometry.contains(point_geometry)]\n\n# Geometric operations\ngdf['centroid'] = gdf.geometry.centroid\ngdf['simplified'] = gdf.geometry.simplify(tolerance=0.001)\n\n# Overlay operations\nintersection = gpd.overlay(gdf1, gdf2, how='intersection')\nunion = gpd.overlay(gdf1, gdf2, how='union')\n```\n\n### Terrain Analysis\n\n```python\ndef terrain_metrics(dem_path):\n    \"\"\"Calculate slope, aspect, hillshade from DEM.\"\"\"\n    with rasterio.open(dem_path) as src:\n        dem = src.read(1)\n\n    dy, dx = np.gradient(dem)\n    slope = np.arctan(np.sqrt(dx**2 + dy**2)) * 180 \u002F np.pi\n    aspect = (90 - np.arctan2(-dy, dx) * 180 \u002F np.pi) % 360\n\n    # Hillshade\n    az_rad, alt_rad = np.radians(315), np.radians(45)\n    hillshade = (np.sin(alt_rad) * np.sin(np.radians(slope)) +\n                 np.cos(alt_rad) * np.cos(np.radians(slope)) *\n                 np.cos(np.radians(aspect) - az_rad))\n\n    return slope, aspect, hillshade\n```\n\n### Network Analysis\n\n```python\nimport osmnx as ox\nimport networkx as nx\n\n# Download and analyze street network\nG = ox.graph_from_place('San Francisco, CA', network_type='drive')\nG = ox.add_edge_speeds(G).add_edge_travel_times(G)\n\n# Shortest path\norig = ox.distance.nearest_nodes(G, -122.4, 37.7)\ndest = ox.distance.nearest_nodes(G, -122.3, 37.8)\nroute = nx.shortest_path(G, orig, dest, weight='travel_time')\n```\n\n## Image Classification\n\n```python\nfrom sklearn.ensemble import RandomForestClassifier\nimport rasterio\nfrom rasterio.features import rasterize\n\ndef classify_imagery(raster_path, training_gdf, output_path):\n    \"\"\"Train RF and classify imagery.\"\"\"\n    with rasterio.open(raster_path) as src:\n        image = src.read()\n        profile = src.profile\n        transform = src.transform\n\n    # Extract training data\n    X_train, y_train = [], []\n    for _, row in training_gdf.iterrows():\n        mask = rasterize([(row.geometry, 1)],\n                        out_shape=(profile['height'], profile['width']),\n                        transform=transform, fill=0, dtype=np.uint8)\n        pixels = image[:, mask > 0].T\n        X_train.extend(pixels)\n        y_train.extend([row['class_id']] * len(pixels))\n\n    # Train and predict\n    rf = RandomForestClassifier(n_estimators=100, max_depth=20, n_jobs=-1)\n    rf.fit(X_train, y_train)\n\n    prediction = rf.predict(image.reshape(image.shape[0], -1).T)\n    prediction = prediction.reshape(profile['height'], profile['width'])\n\n    profile.update(dtype=rasterio.uint8, count=1)\n    with rasterio.open(output_path, 'w', **profile) as dst:\n        dst.write(prediction.astype(rasterio.uint8), 1)\n\n    return rf\n```\n\n## Modern Cloud-Native Workflows\n\n### STAC + Planetary Computer\n\n```python\nimport pystac_client\nimport planetary_computer\nimport odc.stac\n\n# Search Sentinel-2 via STAC\ncatalog = pystac_client.Client.open(\n    \"https:\u002F\u002Fplanetarycomputer.microsoft.com\u002Fapi\u002Fstac\u002Fv1\",\n    modifier=planetary_computer.sign_inplace,\n)\n\nsearch = catalog.search(\n    collections=[\"sentinel-2-l2a\"],\n    bbox=[-122.5, 37.7, -122.3, 37.9],\n    datetime=\"2023-01-01\u002F2023-12-31\",\n    query={\"eo:cloud_cover\": {\"lt\": 20}},\n)\n\n# Load as xarray (cloud-native!)\ndata = odc.stac.load(\n    list(search.get_items())[:5],\n    bands=[\"B02\", \"B03\", \"B04\", \"B08\"],\n    crs=\"EPSG:32610\",\n    resolution=10,\n)\n\n# Calculate NDVI on xarray\nndvi = (data.B08 - data.B04) \u002F (data.B08 + data.B04)\n```\n\n### Cloud-Optimized GeoTIFF (COG)\n\n```python\nimport rasterio\nfrom rasterio.session import AWSSession\n\n# Read COG directly from cloud (partial reads)\nsession = AWSSession(aws_access_key_id=..., aws_secret_access_key=...)\nwith rasterio.open('s3:\u002F\u002Fbucket\u002Fpath.tif', session=session) as src:\n    # Read only window of interest\n    window = ((1000, 2000), (1000, 2000))\n    subset = src.read(1, window=window)\n\n# Write COG\nwith rasterio.open('output.tif', 'w', **profile,\n                   tiled=True, blockxsize=256, blockysize=256,\n                   compress='DEFLATE', predictor=2) as dst:\n    dst.write(data)\n\n# Validate COG\nfrom rio_cogeo.cogeo import cog_validate\ncog_validate('output.tif')\n```\n\n## Performance Tips\n\n```python\n# 1. Spatial indexing (10-100x faster queries)\ngdf.sindex  # Auto-created by GeoPandas\n\n# 2. Chunk large rasters\nwith rasterio.open('large.tif') as src:\n    for i, window in src.block_windows(1):\n        block = src.read(1, window=window)\n\n# 3. Dask for big data\nimport dask.array as da\ndask_array = da.from_rasterio('large.tif', chunks=(1, 1024, 1024))\n\n# 4. Use Arrow for I\u002FO\ngdf.to_file('output.gpkg', use_arrow=True)\n\n# 5. GDAL caching\nfrom osgeo import gdal\ngdal.SetCacheMax(2**30)  # 1GB cache\n\n# 6. Parallel processing\nrf = RandomForestClassifier(n_jobs=-1)  # All cores\n```\n\n## Best Practices\n\n1. **Always check CRS** before spatial operations\n2. **Use projected CRS** for area\u002Fdistance calculations\n3. **Validate geometries**: `gdf = gdf[gdf.is_valid]`\n4. **Handle missing data**: `gdf['geometry'] = gdf['geometry'].fillna(None)`\n5. **Use efficient formats**: GeoPackage > Shapefile, Parquet for large data\n6. **Apply cloud masking** to optical imagery\n7. **Preserve lineage** for reproducible research\n8. **Use appropriate resolution** for your analysis scale\n\n## Detailed Documentation\n\n- **[Coordinate Systems](references\u002Fcoordinate-systems.md)** - CRS fundamentals, UTM, transformations\n- **[Core Libraries](references\u002Fcore-libraries.md)** - GDAL, Rasterio, GeoPandas, Shapely\n- **[Remote Sensing](references\u002Fremote-sensing.md)** - Satellite missions, spectral indices, SAR\n- **[Machine Learning](references\u002Fmachine-learning.md)** - Deep learning, CNNs, GNNs for RS\n- **[GIS Software](references\u002Fgis-software.md)** - QGIS, ArcGIS, GRASS integration\n- **[Scientific Domains](references\u002Fscientific-domains.md)** - Marine, hydrology, agriculture, forestry\n- **[Advanced GIS](references\u002Fadvanced-gis.md)** - 3D GIS, spatiotemporal, topology\n- **[Big Data](references\u002Fbig-data.md)** - Distributed processing, GPU acceleration\n- **[Industry Applications](references\u002Findustry-applications.md)** - Urban planning, disaster management\n- **[Programming Languages](references\u002Fprogramming-languages.md)** - Python, R, Julia, JS, C++, Java, Go, Rust\n- **[Data Sources](references\u002Fdata-sources.md)** - Satellite catalogs, APIs\n- **[Troubleshooting](references\u002Ftroubleshooting.md)** - Common issues, debugging, error reference\n- **[Code Examples](references\u002Fcode-examples.md)** - 500+ examples\n\n---\n\n**GeoMaster covers everything from basic GIS operations to advanced remote sensing and machine learning.**\n",{"name":5,"license":24,"metadata":25,"description":7},"MIT License",{"version":26,"skill-author":27},"1.0","K-Dense Inc.","main","8859218955d9504cd18b59e7892100718039d3b4","data\u002Fskills\u002Fk-dense-ai-scientific-agent-skills\u002Fgeomaster",1,"https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper","https:\u002F\u002Fgithub.com\u002Fom-scogo","SDE-1 @ Scogo ","2026-07-18 12:22:46",{"source":8,"skillName":5,"commands":37,"prompt":47,"zipAvailable":48},[38,41,44],{"tool":39,"command":40},"npx","npx skills add om-scogo\u002Fskillsh-scraper --skill geomaster",{"tool":42,"command":43},"bunx","bunx skills add om-scogo\u002Fskillsh-scraper --skill geomaster",{"tool":45,"command":46},"pnpm","pnpm dlx skills add om-scogo\u002Fskillsh-scraper --skill geomaster","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fk-dense-ai-scientific-agent-skills\u002Fgeomaster\u002FSkill.md",true,[50],{"path":51,"resourceType":52,"resourceTypeDesc":53,"sizeBytes":54,"sourceHtmlUrl":55},"metadata.json","REFERENCE","参考文档",490,"https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fk-dense-ai-scientific-agent-skills\u002Fgeomaster\u002Fmetadata.json",[57,64,69,76,81,88],{"skillNo":58,"name":59,"nameZh":6,"description":60,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":61,"categories":62,"keywords":63,"publishedAt":19},"01M7D6MC9FAAEV4CMNYX8W7JTG","arxiv-search","Search arXiv physics, math, and computer science preprints using natural language queries. Powered by Valyu semantic search.","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fyorkeccak-scientific-skills\u002Farxiv-search\u002Fskills\u002Farxiv-search\u002FSKILL.md",[],[],{"skillNo":65,"name":59,"nameZh":6,"description":60,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":68,"publishedAt":19},"01M7D6M85CKKN87TA98VCQV4H7","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fyorkeccak-scientific-skills\u002Farxiv-search\u002FSkill.md",[],[],{"skillNo":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"publishedAt":19},"01M7D4ZTCS4DR3CE4JY06X84T2","working-with-legacy-code","Safely change and test untested codebases using Feathers' \"Working Effectively with Legacy Code\". Use when the user mentions \"legacy code\", \"no tests\", \"untested codebase\", \"how do I test this\", \"seams\", \"characterization tests\", \"golden master\", \"sprout method\", \"afraid to change this code\", \"monster method\", \"dependency breaking\", or \"inherited a messy codebase\". Also trigger when changing code without tests safely, getting a class under test when constructors, statics, or singletons block it, adding features to tangled modules, or planning incremental test coverage for an old codebase. Covers the legacy-code change algorithm, seams, characterization tests, sprout\u002Fwrap, and dependency-breaking techniques. For refactoring code that already has tests, see refactoring-patterns. For day-to-day code quality, see clean-code.","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fwondelai-skills\u002Fworking-with-legacy-code\u002Fworking-with-legacy-code\u002FSKILL.md",[],[],{"skillNo":77,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":19},"01M7D4ZHZKJD2RSNGAF63V14P4","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fwondelai-skills\u002Fworking-with-legacy-code\u002FSkill.md",[],[],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":19},"01M7D4ZB4CJBFW5JE67CPH2QRV","web-typography","Select, pair, and implement typefaces for web projects. Use when the user mentions \"font pairing\", \"which typeface\", \"line height\", \"responsive typography\", \"web font loading\", \"type hierarchy\", \"variable fonts\", \"FOUT\u002FFOIT\", \"typographic scale\", or \"the text is hard to read\". Also trigger when choosing between system fonts and web fonts, optimizing font-loading performance, or designing readable long-form content. Covers readability evaluation, CSS implementation, and performance optimization. For overall UI design systems, see refactoring-ui. For dramatic typographic experiences, see top-design.","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fwondelai-skills\u002Fweb-typography\u002Fweb-typography\u002FSKILL.md",[],[],{"skillNo":89,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":92,"publishedAt":19},"01M7D4Z4MVYVY3NMJ18BNV6WNA","https:\u002F\u002Fgithub.com\u002Fom-scogo\u002Fskillsh-scraper\u002Fblob\u002Fmain\u002Fdata\u002Fskills\u002Fwondelai-skills\u002Fweb-typography\u002FSkill.md",[],[]]