在项目中经常会用到缓冲区分析这个功能,首先想用ENGINE的GP工具必须了解GIS里面的相应功能,在利用GIS做缓冲区时,会让操作者输入要建立缓冲区的图层和输出的路径,先知道这是必须的,其他的先不讨论,大概这这个样子,
首先在窗体上有一个Button按钮,点击事件,
private void BufferButtonItem_ItemClick(object sender, ItemClickEventArgs e)
{
Frm3BufferAnalytics frmBuffer = new Frm3BufferAnalytics();
frmBuffer.GetFpList = GetFeatureLayerList();
frmBuffer.ShowDialog();
}
出现如下窗体,
点击上面的“确定”按钮
private void simpleButton1_Click(object sender, EventArgs e)
{
double bufferDistance;
double.TryParse(txtBufferDistance.Text, out bufferDistance);
if (0.0 == bufferDistance)
{
MessageBox.Show("缓冲距离不可为0!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
return;
}
if (pFeatureLayers==null||pFeatureLayers.Count == 0)
{
MessageBox.Show("没有图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
IFeatureLayer layer = GetFeatureLayer((string)comboBoxEdit1.Text);
if (layer == null)
{
return;
}
Geoprocessor gp = new Geoprocessor();
gp.OverwriteOutput = true;
//create a new instance of a buffer tool
ESRI.ArcGIS.AnalysisTools.Buffer buffer = new ESRI.ArcGIS.AnalysisTools.Buffer(layer, this.OutputPath, Convert.ToString(bufferDistance) + " " + (string)comboBoxEdit2.EditValue.ToString());
//ESRI.ArcGIS.AnalysisTools.Buffer buffer = new ESRI.ArcGIS.AnalysisTools.Buffer(layer, this.OutputPath, "100"+" "+"Meters" );
buffer.dissolve_option = "ALL";//这个要设成ALL,否则相交部分不会融合
buffer.line_side = "FULL";//默认是"FULL",最好不要改否则出错
buffer.line_end_type = "ROUND";//默认是"ROUND",最好不要改否则出错
//execute the buffer tool (very easy :-))
IGeoProcessorResult results = null;
try
{
results = (IGeoProcessorResult)gp.Execute(buffer, null);
MessageBox.Show("缓冲区建立成功!");
}
catch (Exception ex)
{
MessageBox.Show("缓冲区建立失败!");
// txtMessages.Text += "Failed to buffer layer: " + layer.Name + "\r\n";
}
}
上个事件里面涉及的方法,这个是获得所选择的图层。
private IFeatureLayer GetFeatureLayer(string selectedItem)
{
IFeatureLayer pFeatureLayer = null;
foreach (IFeatureLayer item in pFeatureLayers)
{
if (item.Name == selectedItem)
{
pFeatureLayer = item;
break;
}
}
return pFeatureLayer;
}
这个方法是最上面主窗体上面的方法
private List<IFeatureLayer> GetFeatureLayerList()
{
List<IFeatureLayer> plist = new List<IFeatureLayer>();
GetLayerHelper pHelper = new GetLayerHelper();
List<ILayer> pLayerList = pHelper.GetFeatureLayerList(this.MapCtl.ActiveView.FocusMap);
foreach (ILayer item in pLayerList)
{
IFeatureLayer pFeatureLayer = item as IFeatureLayer;
plist.Add(pFeatureLayer);
}
return plist;
}
大家想要弄明白可以仔细的观察一下,
在这个窗体里面,定义入下的属性
public partial class Frm3BufferAnalytics : Form
{
List<IFeatureLayer> pFeatureLayers = new List<IFeatureLayer>();
public List<IFeatureLayer> GetFpList
{
set { this.pFeatureLayers = (List<IFeatureLayer>)value; }
get { return this.pFeatureLayers ;}
}
还有一个方法是获得地图上的图层对象,GetFeatureLayerList()
public List<ILayer> GetFeatureLayerList(IMap pMap)
{
List<ILayer> myLayers = new List<ILayer>();
UID layerFilter = new UIDClass();
layerFilter.Value = "{40A9E885-5533-11d0-98BE-00805F7CED21}";
IEnumLayer pEnumLayer = pMap.get_Layers(layerFilter, true);
pEnumLayer.Reset();
ILayer pLayer = pEnumLayer.Next();
while (pLayer != null)
{
myLayers.Add(pLayer);
pLayer = pEnumLayer.Next();
}
return myLayers ;
}
以上就是整个Engine调用GP工具进行缓冲区分析的全部代码。