append_gpd
Merge two shapefiles vertically into one by concatenating their data. Specify input paths for both shapefiles and define the output path for the combined result.
Instructions
Reads two shapefiles directly, concatenates them vertically.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| output_path | Yes | ||
| shapefile1_path | Yes | ||
| shapefile2_path | Yes |
Implementation Reference
- The handler function for the 'append_gpd' tool. It reads two shapefiles into GeoDataFrames, aligns CRS if necessary, concatenates them using pandas.concat, and saves the result as a new shapefile. Decorated with @gis_mcp.tool() for MCP registration.@gis_mcp.tool() def append_gpd(shapefile1_path: str, shapefile2_path: str, output_path: str) -> Dict[str, Any]: """ Reads two shapefiles directly, concatenates them vertically.""" try: # Configure a basic logger for demonstration logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # Step 1: Read the two shapefiles into GeoDataFrames. logger.info(f"Reading {shapefile1_path}...") gdf1 = gpd.read_file(shapefile1_path) logger.info(f"Reading {shapefile2_path}...") gdf2 = gpd.read_file(shapefile2_path) # Step 2: Ensure the Coordinate Reference Systems (CRS) match. if gdf1.crs != gdf2.crs: logger.warning( f"CRS mismatch: GDF1 has '{gdf1.crs}' and GDF2 has '{gdf2.crs}'. " "Reprojecting GDF2." ) gdf2 = gdf2.to_crs(gdf1.crs) # Step 3: Concatenate the two GeoDataFrames. combined_gdf = pd.concat([gdf1, gdf2], ignore_index=True) # Step 4: Save the combined GeoDataFrame to a new shapefile. output_path_resolved = resolve_path(output_path, relative_to_storage=True) output_path_resolved.parent.mkdir(parents=True, exist_ok=True) logger.info(f"Saving combined shapefile to {output_path_resolved}...") combined_gdf.to_file(str(output_path_resolved), driver='ESRI Shapefile') return { "status": "success", "message": f"Shapefiles concatenated successfully into '{output_path_resolved}'.", "info": { "output_path": str(output_path_resolved), "num_features": len(combined_gdf), "crs": str(combined_gdf.crs), "columns": list(combined_gdf.columns) } } except Exception as e: logger.error(f"Error processing shapefiles: {str(e)}") raise ValueError(f"Failed to process shapefiles: {str(e)}")
- src/gis_mcp/geopandas_functions.py:28-39 (registration)Resource listing that registers 'append_gpd' as one of the available GeoPandas join operations under 'gis://geopandas/joins'.@gis_mcp.resource("gis://geopandas/joins") def get_geopandas_joins() -> Dict[str, List[str]]: """List available GeoPandas join operations.""" return { "operations": [ "append_gpd", "merge_gpd", "sjoin_gpd", "sjoin_nearest_gpd", "point_in_polygon" ] }