gearys_c
Calculate spatial autocorrelation using Global Geary's C statistic to identify patterns in geographic data distributions.
Instructions
Compute Global Geary's C Autocorrelation Statistic.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| shapefile_path | Yes | ||
| dependent_var | No | LAND_USE | |
| target_crs | No | EPSG:4326 | |
| distance_threshold | No |
Implementation Reference
- src/gis_mcp/pysal_functions.py:163-186 (handler)Primary handler function for the 'gearys_c' MCP tool. Loads shapefile data using helper, computes Geary's C statistic with esda.Geary on row-standardized distance weights, handles errors and returns results with preview.@gis_mcp.tool() def gearys_c(shapefile_path: str, dependent_var: str = "LAND_USE", target_crs: str = "EPSG:4326", distance_threshold: float = 100000) -> Dict[str, Any]: """Compute Global Geary's C Autocorrelation Statistic.""" gdf, y, w, (threshold, unit), err = pysal_load_data(shapefile_path, dependent_var, target_crs, distance_threshold) if err: return {"status": "error", "message": err} import esda stat = esda.Geary(y, w) preview = gdf[['geometry', dependent_var]].head(5).assign( geometry=lambda df: df.geometry.apply(lambda g: g.wkt) ).to_dict(orient="records") return { "status": "success", "message": f"Geary's C completed successfully (threshold: {threshold} {unit})", "result": { "C": float(stat.C), "gearys_c": float(stat.C), # Also include as gearys_c for test compatibility "p_value": float(stat.p_sim), "z_score": float(stat.z_sim), "data_preview": preview } }
- Helper function shared by 'gearys_c' and other PySAL tools for loading GeoDataFrame, validating inputs, reprojecting, creating row-standardized distance-band spatial weights (libpysal), and handling isolated observations (islands).def pysal_load_data(shapefile_path: str, dependent_var: str, target_crs: str, distance_threshold: float): """Common loader and weight creation for esda statistics.""" if not os.path.exists(shapefile_path): return None, None, None, None, f"Shapefile not found: {shapefile_path}" gdf = gpd.read_file(shapefile_path) if dependent_var not in gdf.columns: return None, None, None, None, f"Dependent variable '{dependent_var}' not found in shapefile columns" gdf = gdf.to_crs(target_crs) effective_threshold = distance_threshold unit = "meters" if target_crs.upper() == "EPSG:4326": effective_threshold = distance_threshold / 111000 unit = "degrees" y = gdf[dependent_var].values.astype(np.float64) import libpysal w = libpysal.weights.DistanceBand.from_dataframe(gdf, threshold=effective_threshold, binary=False) w.transform = 'r' for island in w.islands: w.weights[island] = [0] * len(w.weights[island]) w.cardinalities[island] = 0 return gdf, y, w, (effective_threshold, unit), None
- src/gis_mcp/pysal_functions.py:13-28 (registration)MCP resource endpoint listing available ESDA (PySAL) operations, including 'gearys_c', discoverable by clients.@gis_mcp.resource("gis://operations/esda") def get_spatial_operations() -> Dict[str, List[str]]: """List available spatial analysis operations. This is for esda library. They are using pysal library.""" return { "operations": [ "getis_ord_g", "morans_i", "gearys_c", "gamma_statistic", "moran_local", "getis_ord_g_local", "join_counts", "join_counts_local", "adbscan" ] }
- src/gis_mcp/mcp.py:5-5 (registration)Creation of the FastMCP server instance 'gis_mcp' used by @gis_mcp.tool() decorators to register tools like 'gearys_c'.gis_mcp = FastMCP("GIS MCP")
- src/gis_mcp/main.py:71-72 (registration)Import of pysal_functions module in main.py, which triggers execution of @gis_mcp.tool() decorators and registers the 'gearys_c' tool.pysal_functions, )