Skip to main content
Glama

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
NameRequiredDescriptionDefault
shapefile1_pathYes
shapefile2_pathYes
output_pathYes

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)}")
  • @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"
            ]
        }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/mahdin75/gis-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server