138 lines
5.5 KiB
C#
138 lines
5.5 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel;
|
||
using System.Linq;
|
||
using System.Threading.Tasks;
|
||
using ArcGIS.Core.Data;
|
||
using ArcGIS.Core.Data.Raster;
|
||
using ArcGIS.Core.Geometry;
|
||
using ArcGIS.Desktop.Core.Geoprocessing;
|
||
using ArcGIS.Desktop.Framework.Threading.Tasks;
|
||
using LinkToolAddin.server;
|
||
using LinkToolAddin.ui.dockpane;
|
||
using log4net;
|
||
using ModelContextProtocol.Server;
|
||
using Newtonsoft.Json;
|
||
using Newtonsoft.Json.Linq;
|
||
|
||
namespace LinkToolAddin.client.tool;
|
||
|
||
public class ArcGisPro
|
||
{
|
||
private static ILog log = LogManager.GetLogger(typeof(ArcGisPro));
|
||
[McpServerTool, Description("可以通过调用ArcGIS Pro的地理处理工具实现一些数据处理功能,传入参数必须严格遵循ArcGIS Pro调用工具的标准调用名和参数要求知识库。")]
|
||
public static async Task<JsonRpcResultEntity> ArcGisProTool(string toolName, List<string> toolParams)
|
||
{
|
||
IGPResult results = await Geoprocessing.ExecuteToolAsync(toolName, toolParams);
|
||
JsonRpcResultEntity jsonRpcResultEntity;
|
||
if (results.IsFailed)
|
||
{
|
||
log.Error(results.ErrorMessages);
|
||
jsonRpcResultEntity = new JsonRpcErrorEntity()
|
||
{
|
||
Error = new Error()
|
||
{
|
||
Code = results.ErrorCode,
|
||
Message = JsonConvert.SerializeObject(results.ErrorMessages)
|
||
}
|
||
};
|
||
}else if(results.HasWarnings)
|
||
{
|
||
log.Warn(results.Messages);
|
||
jsonRpcResultEntity = new JsonRpcSuccessEntity
|
||
{
|
||
Result = JsonConvert.SerializeObject(results.Messages)
|
||
};
|
||
}
|
||
else
|
||
{
|
||
log.Info("success gp tool");
|
||
jsonRpcResultEntity = new JsonRpcSuccessEntity
|
||
{
|
||
Result = JsonConvert.SerializeObject(results.Messages)
|
||
};
|
||
}
|
||
return jsonRpcResultEntity;
|
||
}
|
||
|
||
[McpServerTool, Description("查看指定数据的坐标系、范围、几何类型、是否有Z坐标和M坐标,获取字段列表等")]
|
||
public static async Task<JsonRpcResultEntity> DataProperty(string datasetPath,string dataName)
|
||
{
|
||
JsonRpcResultEntity result = new JsonRpcResultEntity();
|
||
await QueuedTask.Run(() =>
|
||
{
|
||
try
|
||
{
|
||
using Geodatabase gdb = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(datasetPath)));
|
||
FeatureClass featureClass = gdb.OpenDataset<FeatureClass>(dataName);
|
||
FeatureClassDefinition featureClassDefinition = featureClass.GetDefinition();
|
||
SpatialReference spatialReference = featureClassDefinition.GetSpatialReference();
|
||
GeometryType geometryType = featureClassDefinition.GetShapeType();
|
||
result = new JsonRpcSuccessEntity()
|
||
{
|
||
Id = 1,
|
||
Result = JsonConvert.SerializeObject(new Dictionary<string, object>()
|
||
{
|
||
{"spatialReference", spatialReference.Name+"(WKID:"+spatialReference.Wkid+")"},
|
||
{"dataName", dataName},
|
||
{"geometryType", geometryType.ToString()},
|
||
{"hasZValue", featureClassDefinition.HasZ()},
|
||
{"hasMValue", featureClassDefinition.HasM()},
|
||
{"fields",featureClassDefinition.GetFields()}
|
||
})
|
||
};
|
||
return result;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
result = new JsonRpcErrorEntity()
|
||
{
|
||
Error = new Error()
|
||
{
|
||
Message = ex.Message
|
||
},
|
||
Id = 1
|
||
};
|
||
return result;
|
||
}
|
||
});
|
||
return result;
|
||
}
|
||
|
||
[McpServerTool, Description("列出gdb数据库中的所有数据名称")]
|
||
public static async Task<JsonRpcResultEntity> ListData(string gdbPath)
|
||
{
|
||
var datasets = new List<string>();
|
||
await QueuedTask.Run(() =>
|
||
{
|
||
using (Geodatabase gdb = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(gdbPath))))
|
||
{
|
||
// 获取所有要素类(Feature Classes)
|
||
var featureClasses = gdb.GetDefinitions<FeatureClassDefinition>();
|
||
foreach (var fc in featureClasses)
|
||
datasets.Add($"要素类: {fc.GetName()}");
|
||
|
||
// 获取所有表格(Tables)
|
||
var tables = gdb.GetDefinitions<TableDefinition>();
|
||
foreach (var table in tables)
|
||
datasets.Add($"表格: {table.GetName()}");
|
||
|
||
// 获取所有要素数据集(Feature Datasets)
|
||
var featureDatasets = gdb.GetDefinitions<FeatureDatasetDefinition>();
|
||
foreach (var fd in featureDatasets)
|
||
datasets.Add($"要素数据集: {fd.GetName()}");
|
||
|
||
// 获取所有栅格数据集(Raster Datasets)
|
||
var rasterDatasets = gdb.GetDefinitions<RasterDatasetDefinition>();
|
||
foreach (var raster in rasterDatasets)
|
||
datasets.Add($"栅格数据: {raster.GetName()}");
|
||
}
|
||
});
|
||
JsonRpcResultEntity result = new JsonRpcSuccessEntity()
|
||
{
|
||
Id = 1,
|
||
Result = JsonConvert.SerializeObject(datasets)
|
||
};
|
||
return result;
|
||
}
|
||
} |