[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M72E70GS5GPHA0WMBSPN3JD4":3,"skill-same:01M72E70GS5GPHA0WMBSPN3JD4":111},{"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":27,"commitSha":28,"skillDirectory":29,"forksCount":30,"repositoryHtmlUrl":31,"repositoryHomepageUrl":6,"ownerHtmlUrl":32,"ownerBlogUrl":6,"ownerDescription":33,"updatedAt":34,"install":35,"resources":48},"01M72E70GS5GPHA0WMBSPN3JD4","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.","Minions-Land\u002FScience-Discovery","Minions-Land","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F272697820?v=4","01M729FA9HA1NB3692B59MRBJC","Minions Land","01M729FAA6GEV2ZR1CNDZ8WZPJ",5,"MIT","https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002FSKILL.md",[],[],"2026-11-10 18:39:20",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":24,"metadata":25,"description":7},"MIT License",{"skill-author":26},"K-Dense Inc.","main","aa7a019e00fa39031d9b30bf5b1becb094af4d0a","scientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster",0,"https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery","https:\u002F\u002Fgithub.com\u002FMinions-Land","Ming‘s Artificial Intelligence Group","2026-11-01 00:00:09",{"source":8,"skillName":5,"commands":36,"prompt":46,"zipAvailable":47},[37,40,43],{"tool":38,"command":39},"npx","npx skills add Minions-Land\u002FScience-Discovery --skill geomaster",{"tool":41,"command":42},"bunx","bunx skills add Minions-Land\u002FScience-Discovery --skill geomaster",{"tool":44,"command":45},"pnpm","pnpm dlx skills add Minions-Land\u002FScience-Discovery --skill geomaster","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002FSKILL.md",true,[49,55,59,63,67,71,75,79,83,87,91,95,99,103,107],{"path":50,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":53,"sourceHtmlUrl":54},"README.md","REFERENCE","参考文档",3323,"https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002FREADME.md",{"path":56,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":57,"sourceHtmlUrl":58},"references\u002Fadvanced-gis.md",11121,"https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002Freferences\u002Fadvanced-gis.md",{"path":60,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":61,"sourceHtmlUrl":62},"references\u002Fbig-data.md",8818,"https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002Freferences\u002Fbig-data.md",{"path":64,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":65,"sourceHtmlUrl":66},"references\u002Fcode-examples.md",13023,"https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002Freferences\u002Fcode-examples.md",{"path":68,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":69,"sourceHtmlUrl":70},"references\u002Fcoordinate-systems.md",8893,"https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002Freferences\u002Fcoordinate-systems.md",{"path":72,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":73,"sourceHtmlUrl":74},"references\u002Fcore-libraries.md",6866,"https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002Freferences\u002Fcore-libraries.md",{"path":76,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":77,"sourceHtmlUrl":78},"references\u002Fdata-sources.md",9331,"https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002Freferences\u002Fdata-sources.md",{"path":80,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":81,"sourceHtmlUrl":82},"references\u002Fgis-software.md",9284,"https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002Freferences\u002Fgis-software.md",{"path":84,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":85,"sourceHtmlUrl":86},"references\u002Findustry-applications.md",13491,"https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002Freferences\u002Findustry-applications.md",{"path":88,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":89,"sourceHtmlUrl":90},"references\u002Fmachine-learning.md",13245,"https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002Freferences\u002Fmachine-learning.md",{"path":92,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":93,"sourceHtmlUrl":94},"references\u002Fprogramming-languages.md",11417,"https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002Freferences\u002Fprogramming-languages.md",{"path":96,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":97,"sourceHtmlUrl":98},"references\u002Fremote-sensing.md",10474,"https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002Freferences\u002Fremote-sensing.md",{"path":100,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":101,"sourceHtmlUrl":102},"references\u002Fscientific-domains.md",11027,"https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002Freferences\u002Fscientific-domains.md",{"path":104,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":105,"sourceHtmlUrl":106},"references\u002Fspecialized-topics.md",11114,"https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002Freferences\u002Fspecialized-topics.md",{"path":108,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":109,"sourceHtmlUrl":110},"references\u002Ftroubleshooting.md",11219,"https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fgeomaster\u002Freferences\u002Ftroubleshooting.md",[112,119,126,133,140,147],{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":118,"publishedAt":19},"01M72EN1WZSQM1NTDKSR1EH1JT","zarr-python","Chunked N-D arrays for cloud storage. Compressed arrays, parallel I\u002FO, S3\u002FGCS integration, NumPy\u002FDask\u002FXarray compatible, for large-scale scientific computing pipelines.","https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fzarr-python\u002FSKILL.md",[],[],{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":19},"01M72EMPMQPWWZKEWCK808J840","what-if-oracle","Run structured What-If scenario analysis with multi-branch possibility exploration. Use this skill when the user asks speculative questions like \"what if...\", \"what would happen if...\", \"what are the possibilities\", \"explore scenarios\", \"scenario analysis\", \"possibility space\", \"what could go wrong\", \"best case \u002F worst case\", \"risk analysis\", \"contingency planning\", \"strategic options\", or any question about uncertain futures. Also trigger when the user faces a fork-in-the-road decision, wants to stress-test an idea, or needs to think through consequences before committing.","https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fwhat-if-oracle\u002FSKILL.md",[],[],{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":19},"01M72EMHDRH8EV0X6Q69S1TVNT","venue-templates","Access comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.","https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fvenue-templates\u002FSKILL.md",[],[],{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":139,"publishedAt":19},"01M72EMDR9SMKTSBKSG3NEERKG","vaex","Use this skill for processing and analyzing large tabular datasets (billions of rows) that exceed available RAM. Vaex excels at out-of-core DataFrame operations, lazy evaluation, fast aggregations, efficient visualization of big data, and machine learning on large datasets. Apply when users need to work with large CSV\u002FHDF5\u002FArrow\u002FParquet files, perform fast statistics on massive datasets, create visualizations of big data, or build ML pipelines that do not fit in memory.","https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fvaex\u002FSKILL.md",[],[],{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":146,"publishedAt":19},"01M72EMAH9QAPF3V3XK0M0QHFS","usfiscaldata","Query the U.S. Treasury Fiscal Data API for federal financial data including national debt, government spending, revenue, interest rates, exchange rates, and savings bonds. Access 54 datasets and 182 data tables with no API key required. Use when working with U.S. federal fiscal data, national debt tracking (Debt to the Penny), Daily Treasury Statements, Monthly Treasury Statements, Treasury securities auctions, interest rates on Treasury securities, foreign exchange rates, savings bonds, or any U.S. government financial statistics.","https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Fusfiscaldata\u002FSKILL.md",[],[],{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":19},"01M72EM1HYA6GN3K7K29TK2J63","treatment-plans","Generate concise (3-4 page), focused medical treatment plans in LaTeX\u002FPDF format for all clinical specialties. Supports general medical treatment, rehabilitation therapy, mental health care, chronic disease management, perioperative care, and pain management. Includes SMART goal frameworks, evidence-based interventions with minimal text citations, regulatory compliance (HIPAA), and professional formatting. Prioritizes brevity and clinical actionability.","https:\u002F\u002Fgithub.com\u002FMinions-Land\u002FScience-Discovery\u002Fblob\u002Fmain\u002Fscientific-agent-skills-main\u002Fscientific-skills\u002Ftreatment-plans\u002FSKILL.md",[],[]]