LinkToolAddin/client/tool/ArcGisPro.cs

109 lines
4.4 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.Threading.Tasks;
using ArcGIS.Core.Data;
using ArcGIS.Core.Data.Raster;
using ArcGIS.Core.Geometry;
using ArcGIS.Desktop.Framework.Threading.Tasks;
using LinkToolAddin.server;
using ModelContextProtocol.Server;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace LinkToolAddin.client.tool;
public class ArcGisPro
{
[McpServerTool, Description("可以通过调用ArcGIS Pro的地理处理工具实现一些数据处理功能。")]
public static async Task<JsonRpcResultEntity> ArcGisProTool(string toolName, List<string> toolParams)
{
// Call the ArcGIS Pro method and get the result
var result = await server.CallArcGISPro.CallArcGISProTool(toolName, toolParams);
// Serialize the result back to a JSON string
return result;
}
[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;
}
}