append_gpd
Combine two shapefiles by vertically concatenating their data into a single output file for unified geospatial analysis.
Instructions
Reads two shapefiles directly, concatenates them vertically.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| shapefile1_path | Yes | ||
| shapefile2_path | Yes | ||
| output_path | Yes |
Implementation Reference
- The append_gpd tool handler function, decorated with @gis_mcp.tool(). It reads two shapefiles into GeoDataFrames, ensures matching CRS by reprojecting if necessary, concatenates them using pd.concat, and saves the result to the specified output path as an ESRI Shapefile.@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)@gis_mcp.resource endpoint listing GeoPandas join operations, explicitly including "append_gpd" as an available tool.@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" ] }