[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6M09NJZ1J57QMKWP2RZ2ER2":3,"skill-same:01M6M09NJZ1J57QMKWP2RZ2ER2":132},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":42,"linkOnly":43,"markdownContent":44,"markdownBody":45,"frontMatter":46,"refName":50,"commitSha":51,"skillDirectory":52,"forksCount":13,"repositoryHtmlUrl":53,"repositoryHomepageUrl":6,"ownerHtmlUrl":54,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":55,"install":56,"resources":69},"01M6M09NJZ1J57QMKWP2RZ2ER2","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.","endman100\u002Fskill-router-nexus","endman100","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F31997019?v=4","01M6KPDX17BYDWW4RRB0TNGGMX","01M6KPDX64Y2QBEWVFG5W5PWPF",0,"MIT","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[5,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],"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,"---\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:\n    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":47,"metadata":48,"description":7},"MIT License",{"skill-author":49},"K-Dense Inc.","main","f19b254e8975d0bfddb394686706106930d7964d","Science\u002Fphysics-quantum-and-simulation\u002Fgeomaster","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus","https:\u002F\u002Fgithub.com\u002Fendman100","2026-11-12 18:13:37",{"source":8,"skillName":5,"commands":57,"prompt":67,"zipAvailable":68},[58,61,64],{"tool":59,"command":60},"npx","npx skills add endman100\u002Fskill-router-nexus --skill geomaster",{"tool":62,"command":63},"bunx","bunx skills add endman100\u002Fskill-router-nexus --skill geomaster",{"tool":65,"command":66},"pnpm","pnpm dlx skills add endman100\u002Fskill-router-nexus --skill geomaster","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002FSKILL.md",true,[70,76,80,84,88,92,96,100,104,108,112,116,120,124,128],{"path":71,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},"README.md","REFERENCE","参考文档",3218,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002FREADME.md",{"path":77,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":78,"sourceHtmlUrl":79},"references\u002Fadvanced-gis.md",10745,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002Freferences\u002Fadvanced-gis.md",{"path":81,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":82,"sourceHtmlUrl":83},"references\u002Fbig-data.md",8455,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002Freferences\u002Fbig-data.md",{"path":85,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":86,"sourceHtmlUrl":87},"references\u002Fcode-examples.md",12492,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002Freferences\u002Fcode-examples.md",{"path":89,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":90,"sourceHtmlUrl":91},"references\u002Fcoordinate-systems.md",8893,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002Freferences\u002Fcoordinate-systems.md",{"path":93,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Fcore-libraries.md",6593,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002Freferences\u002Fcore-libraries.md",{"path":97,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Fdata-sources.md",9001,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002Freferences\u002Fdata-sources.md",{"path":101,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":102,"sourceHtmlUrl":103},"references\u002Fgis-software.md",8915,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002Freferences\u002Fgis-software.md",{"path":105,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":106,"sourceHtmlUrl":107},"references\u002Findustry-applications.md",13071,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002Freferences\u002Findustry-applications.md",{"path":109,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":110,"sourceHtmlUrl":111},"references\u002Fmachine-learning.md",12783,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002Freferences\u002Fmachine-learning.md",{"path":113,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":114,"sourceHtmlUrl":115},"references\u002Fprogramming-languages.md",11024,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002Freferences\u002Fprogramming-languages.md",{"path":117,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":118,"sourceHtmlUrl":119},"references\u002Fremote-sensing.md",10104,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002Freferences\u002Fremote-sensing.md",{"path":121,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":122,"sourceHtmlUrl":123},"references\u002Fscientific-domains.md",10611,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002Freferences\u002Fscientific-domains.md",{"path":125,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":126,"sourceHtmlUrl":127},"references\u002Fspecialized-topics.md",10686,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002Freferences\u002Fspecialized-topics.md",{"path":129,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":130,"sourceHtmlUrl":131},"references\u002Ftroubleshooting.md",11219,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FScience\u002Fphysics-quantum-and-simulation\u002Fgeomaster\u002Freferences\u002Ftroubleshooting.md",[133,155,192,215,224,248],{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":137,"sourceHtmlUrl":138,"categories":139,"keywords":143,"publishedAt":42},"01M6MPCT5BXVER8HQZTW3QE9AS","create-master","基于佛教经典文献，生成特定高僧大德的 AI 教学角色","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FMetaphysics-and-Spirituality\u002FMaster-skill\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FMetaphysics-and-Spirituality\u002FMaster-skill\u002FSKILL.md",[140],{"categoryNo":141,"categoryName":142,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000039","教师与教育",[144,145,146,147,148,149,150,151,152,153,154],"create master","master","create","生成","true","webfetch","edit","write","read","grep","Bash",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":159,"sourceHtmlUrl":160,"categories":161,"keywords":173,"publishedAt":42},"01M6M43AKE95Y64E1JRXEF5QQ3","writing-dna-skill","从至少 20 篇完整文章中蒸馏可复用的写作 DNA，分析语言、文章结构、选题逻辑、素材策略、认知框架和视觉风格，并生成 Writing-DNA.md；按该 DNA 写作时会读取全部蒸馏产物和 5 篇相关原文。用于中英文作者、账号、品牌或出版物的风格分析与一致性写作。 Distill reusable Writing DNA from at least 20 complete articles for Chinese or English authors, publications, brands, and accounts; use for language, structure, topic logic, source strategy, cognitive-frame, and visual-style analysis.","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fwriting-dna-skill\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fwriting-dna-skill\u002FSKILL.md",[162,167,170],{"categoryNo":163,"categoryName":164,"taxonomyType":165,"taxonomyTypeDesc":166},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",{"categoryNo":168,"categoryName":169,"taxonomyType":165,"taxonomyTypeDesc":166},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":171,"categoryName":172,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000036","内容创作者",[174,175,176,177,178,179,180,181,182,183,184,185,186,147,34,187,188,189,190,191],"writing dna skill","DNA","writing","strategy","english","logic","visual","structure","chinese","reusable","use","style","distill","frame","source","for","at","complete",{"skillNo":193,"name":194,"nameZh":6,"description":195,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":196,"sourceHtmlUrl":197,"categories":198,"keywords":201,"publishedAt":42},"01M6M428TTCGQ4ME3KY99VN037","stop-slop","Remove AI writing patterns from prose. Use when drafting, editing, or reviewing text to eliminate predictable AI tells.","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fstop-slop\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fstop-slop\u002FSKILL.md",[199,200],{"categoryNo":163,"categoryName":164,"taxonomyType":165,"taxonomyTypeDesc":166},{"categoryNo":171,"categoryName":172,"taxonomyType":20,"taxonomyTypeDesc":21},[202,203,204,205,206,207,208,209,210,184,211,212,213,189,214,176],"slop","stop slop","stop","drafting","when","drafts","https","patterns","prose","remove","editing","text","content",{"skillNo":216,"name":217,"nameZh":6,"description":218,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":219,"sourceHtmlUrl":220,"categories":221,"keywords":222,"publishedAt":42},"01M6M41X0B7EBX42TK435DMGGR","shuorenhua","检查和清理中英文文本里的 AI 套路，适用于“去 AI 味”“说人话”“自然一点”“别像模板”“先标问题”这类改写和审稿需求；按场景控制力度，同时保留事实、术语、语域和责任主体。","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fshuorenhua\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fshuorenhua\u002FSKILL.md",[],[217,223],"文本",{"skillNo":225,"name":226,"nameZh":6,"description":227,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":228,"sourceHtmlUrl":229,"categories":230,"keywords":231,"publishedAt":42},"01M6M3ZD12WBEW5KXKDM4N6DFG","naming","Name products, SaaS, brands, open source projects, bots, and apps. Use when the user needs to name something, find a brand name, or pick a product name. Metaphor-driven process that produces memorable, meaningful names and avoids AI slop.","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fnaming-main\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fnaming-main\u002FSKILL.md",[],[226,232,233,234,235,236,184,237,152,188,238,239,240,241,154,242,243,244,245,206,246,247,202],"repo","websearch","product name","apps","bots","view","brand","pick","gh","projects","open","saas","open source","product","describe","ai slop",{"skillNo":249,"name":250,"nameZh":6,"description":251,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":252,"sourceHtmlUrl":253,"categories":254,"keywords":256,"publishedAt":42},"01M6M3YVXAFAAWJ7F6JMPFREYE","humanizer-zh","去除文本中的 AI 生成痕迹。适用于编辑或审阅文本，使其听起来更自然、更像人类书写。\n基于维基百科的\"AI 写作特征\"综合指南。检测并修复以下模式：夸大的象征意义、\n宣传性语言、以 -ing 结尾的肤浅分析、模糊的归因、破折号过度使用、三段式法则、\nAI 词汇、否定式排比、过多的连接性短语。","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fhumanizer-zh\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FWriting-and-Content\u002Fhumanizer-zh\u002FSKILL.md",[255],{"categoryNo":163,"categoryName":164,"taxonomyType":165,"taxonomyTypeDesc":166},[257,258,259,152,151,150,176,147,223,260,202,204],"humanizer","zh","humanizer zh","翻译"]