LinkToolAddin/client/tool/ArcGisPro.cs

149 lines
5.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
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,null,null,null,GPExecuteToolFlags.InheritGPOptions|GPExecuteToolFlags.GPThread);
JsonRpcResultEntity jsonRpcResultEntity;
if (results.IsFailed)
{
log.Error(results.ErrorMessages);
jsonRpcResultEntity = new JsonRpcErrorEntity()
{
Error = new Error()
{
Code = results.ErrorCode.ToString(),
Message = GetMessagesString(results.ErrorMessages)+"\n"+GetMessagesString(results.Messages)
}
};
}else if(results.HasWarnings)
{
log.Warn(results.Messages);
jsonRpcResultEntity = new JsonRpcSuccessEntity
{
Result = GetMessagesString(results.Messages)
};
}
else
{
log.Info("success gp tool");
jsonRpcResultEntity = new JsonRpcSuccessEntity
{
Result = GetMessagesString(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;
}
private static string GetMessagesString(IEnumerable<IGPMessage> messages)
{
StringBuilder messagesStr = new StringBuilder();
foreach (var gpMessage in messages)
{
messagesStr.AppendLine(gpMessage.Text);
}
return messagesStr.ToString();
}
}