Arcgis 二次开发 热点分析
背景
大三下上完了arcgis二次开发,真心觉得咱们gis开发这个平台还是太小了,也不那么成熟。主要体现在 1.文档不全,稍有特色的功能比如热点分析就没有文档。2.乱七八糟的接口还有类,还有很多强制转换,都是些什么鬼…开发变成了背书吗?
为了做二次开发的大作业,我就想实现热点分析这个功能,百度和谷歌都查了好久好久,相关的信息非常匮乏,最后我终于做出来了!!朋友们,让我来告诉你们这玩意怎么做吧!
具体操作
1.toolbox试验
如果你在二次开发中,要实现arcmap的arctoolbox中某个功能,请先使用arctoolbox操作一遍,来验证你的输入文件名,输入数据格式,输出数据名,相关licence开启等是否有问题,排除和二次开发代码逻辑无关的因素。如果显示成功,结果无误,就可以进行下一步操作了。
然后找到功能对应的工具大类,比如热点分析的工具大类是空间分析(Spatial Analyst tools),
然后通过工具找到对应的二次开发命名空间的引用,如果你不知道对应的英文名,可以看我这张图。
2.查找接口
开发第一步,找接口!!或者找相关的示例代码!别人的梯子改改不香吗??!!问题来了,如何找接口,文档很庞大(吐槽二次开发文档的搜索),怎么找到你想要的那个接口?分为以下几步:
(1)找出相应工具的英文名,所有工具在这个网址都有,arctoolbox工具相关接口名比如热点分析叫hotspot。
(2)点击visual studio的引用中对应的命名空间,双击就会出现相关文献,(比帮助文档全多了,强烈推荐结合二次开发的帮助文档一起看)
(3)如果文档里面没有相关的示例代码,(没错有时候就会很坑,gis开发就是不友好)。但你已经得到了相关操作的英文名和中文名,请去谷歌或者百度上搜索相关示例代码,(可以搜索: arcgis + 功能名+c#),官网有Java,C#,python的代码,可以借鉴。
在网上查找到 热点分析是SpatialAnalysis大工具下的,而所有SpatialAnalysis大工具都是可以通过 Geoprocessor来处理!如果你对强大的Geoprocessor还不理解,可以看看这篇文章。
3.输入文件路径,特别注意!
虽然我很幸运的找到了涉及调用的工具,但是我在 没有正确的填写 输入输出路径这里卡了一周!事实证明真的坑!
给大家列出3个易错点(都是我猜的坑):
1.路径中default.gdb不需要后缀名(.gdb)
2.输入输出的要素都需要.shp后缀名
3.路径不能太深或者出现空格(最好使用全英文路径,root目录下更好)
给大家我的正确示范:
HotSpots getisOrd = new HotSpots();
getisOrd.Input_Feature_Class = @"D:\data\Vorono.shp"; // input feature class
//getisOrd.Input_Feature_Class = @txtInputPath.Text;
getisOrd.Input_Field = "Cu";
getisOrd.Input_Field = txbField.Text;
getisOrd.Output_Feature_Class = @"D:\data\POPU_Hottt.shp"; // location of output feature class
//getisOrd.Output_Feature_Class = @txtOutputPath.Text;
getisOrd.Conceptualization_of_Spatial_Relationships = "INVERSE_DISTANCE";
getisOrd.Distance_Method = "EUCLIDEAN_DISTANCE";
getisOrd.Standardization = "NONE";
getisOrd.Distance_Band_or_Threshold_Distance = 200;
gp.Execute(getisOrd, null);
//执行地理处理工具
IGeoProcessorResult results = (IGeoProcessorResult)gp.Execute(getisOrd, null);
//添加缓冲区图层到当前地图中
Add2Map(); //这个函数我就不解释了 大家应该都会
4.找出错误原因
提到正确的解法是不完全的,如何debug,自己找出正确解才是最重要的,大家最好使用MessageBox来输出具体的错误信息,visual studio报错程序异常,给出的错误提示真的用处不太够啊!
下面是使用Geoprocessor输出具体错误信息的代码,因为messageBox大小是固定的,所以可能会显示2次messageBox哦!请认真看完全部的错误信息!特别是如果关于路径问题,请参考上面我的路径写法!
try
{
}
catch (Exception ex)
{
string message = "";
for (int i = 0; i < gp.MessageCount; i++)
{
message += gp.GetMessage(i) + " ";
}
MessageBox.Show(message + e.ToString());
}
}
总结
没啥好总结的,接下来我还会写几篇二次开发的实验吧,毕竟这东西我觉得不写出来,以后的学弟学妹还要和我们受一样的苦。
如果如果大家对Arcgis二次开发、深度学习和大厂面试感兴趣的人,也可以加关注我的微信公众号,里面包括Arcgis二次开发、保研分享、大厂面试、机器学习等内容,会持续更新的:)