上个月使用python调用arcgis工具箱完成了火点txt文件转shp文件的小功能, 感觉很不错, 写下这篇博客希望对大家有所帮助。
1.环境介绍:
系统: win8.1(64位)
arcgis:desktop10.2
2.ARCGIS 工具箱简单介绍:
工具英文名称 | 工具中文名称 |
3D Analyst toolbox | 三维分析工具箱 |
Data Reviewer toolbox | 绘图工具箱 |
Conversion toolbox | 转换工具箱 |
Data Management toolbox | 数据管理工具箱 |
Data Reviewer toolbox | 数据检查工具箱 |
Geostatistical Analyst | 地统计分析 |
Spatial Analyst toolbox | 空间分析工具箱 |
Spatial Statistics toolbox | 空间统计工具箱 |
详细帮助页面可以参考 : http://help.arcgis.com/zh-cn/arcgisdesktop/10.0/help/index.html#/na/00r90000001n000000/
3.使用python代码完成arcgis工具箱的调用
3.1.在介绍这个调用之前,先学习一个简单的python程序
import sysdef hello(name): print "hello " + name +"!"if "__main__" == __name__: #get count of parameter nLen = len(sys.argv) #print parametes for i in range(0, nLen): print ("argv %d:%s"%(i, sys.argv[i])) #call method hello hello(sys.argv[1])
这个python程序的功能很简单的, 就是接收一个name, 打印hello name!。 我们需要将这个文本保存到本地,修改名字为hello.py,主要扩展名为.py 。 这个hello.py就是python程序的源码文件了。接着打开命令行(win +r) 输入 d:\Python27\ArcGIS10.2\python.exe e:\test\hello.py zhaojiedi 回车就完成了程序的调用。d:\Python27\ArcGIS10.2\python.exe 是你python程序的所在位置,用于解释后面的python程序文件,e:\test\hello.py是你编写的python文件位置,zhaojiedi 这个就是你要传递给python程序的参数。这里是一个参数的, 如果多个参数, 参数中间空格分隔即可。
下面是我调用的输出结果
argv 0:E:\test\hello.pyargv 1:zhaojiedihello zhaojiedi!
通过以上的简单小程序,就可以完成python程序接收外部参数,完成指定的功能啦。
3.2.接下来使用c#调用下这个python文件。(当然可以使用其他语言调用了,这里使用c#语言演示下,其他语言同理)
void TestPython(string name) { string pythonExe = @"d:\Python27\ArcGIS10.2\python.exe"; string pythonFile = @"e:\test\hello.py"; string outMessage = ""; //创建一个进程 Process process = new Process(); //设置进程的exe文件 process.StartInfo.FileName =pythonExe; //设置启动参数 process.StartInfo.Arguments = string.Format(" {0} {1}", pythonFile, "zhaojiedi"); //设置窗口风格 process.StartInfo.WindowStyle = ProcessWindowStyle.Normal; process.StartInfo.CreateNoWindow = false; //是否使用shell ,这个是false的时候才可以将下面的重定向参数设置为true process.StartInfo.UseShellExecute = false; //设置重定向 process.StartInfo.RedirectStandardError = true; process.StartInfo.RedirectStandardInput = true; process.StartInfo.RedirectStandardOutput = true; //初始化退出码 exitCode = -1; try { process.Start(); //获取重定向的结果信息。 outMessage = process.StandardOutput.ReadToEnd(); process.WaitForExit(); exitCode = process.ExitCode; } catch (Exception ex) { //todo log } //在终端打印结果信息。 Console.WriteLine(outMessage); //todo 判断退出码 }
3.3. 有了上面的基础, 接下来就可以我们的正题啦, 了解arcgis工具, 并使用python调用。
这里提供一个样例 , 就是通过python程序完成txt文本文件的点转矢量shp文件。
在arcgis中我们可以使用工具箱的Data management Tools | Layer and Table Views | Make XY EventLayer 这个工具 添加txt文本文件,如下图:
data.txt 内容如下(中间制表符分割)
101.2 35.1 0.3121.2 43.2 0.8101.5 40.2 0.96110.5 35.6 0.4
点击OK 我们就可以将txt文件中经纬度转成要素(还不是矢量文件呢)。 点击ToolHelp(上图中的按钮) 获取工具帮助信息,弹出如下帮助信息。
copy 这段代码。
在打开arcgis 工具箱 Convert Tools | ToShapeFile | Feature Class To ShapeFile ,点击ToolHelp 获取工具帮助信息,copy调用样例。
修改copy的代码如下
#made by zhaojiedi1992#import modelimport osimport os.pathimport arcpyimport sysif "__main__" == __name__: nLen = len(sys.argv) for i in range(0, nLen): print ("argv %d:%s\n"%(i, sys.argv[i])) print "===parm ready============ Start ................" #get parameter txtFile = sys.argv[1] curDir = os.path.split(txtFile)[0]; filename = os.path.split(txtFile)[1]; arcpy.env.workspace = curDir lonField = "Field1" latField = "Field2" featureLayer = filename.replace(".txt",""); sharpFile = txtFile.replace(".txt",".shp") if os.path.exists(sharpFile): os.remove(sharpFile) print "txtFile" + ":\t" + txtFile print "curDir" + ":\t" + curDir print "filename" + ":\t" + filename print "featureLayer" + ":\t" + featureLayer #step1 Creates an XY layer try: # Make the XY event layer... arcpy.MakeXYEventLayer_management(txtFile, lonField, latField, featureLayer) except: # If an error occurred print the message to the screen print arcpy.GetMessages() #step2 feature to sharpfile arcpy.FeatureClassToShapefile_conversion([featureLayer], curDir) print "===========================end============================================\n"
保存这个python代码为txtToShp.py,打开命令行就可以调用了d:\Python27\ArcGIS10.2\python.exe e:\test\txtToShp.py e:\test\data.txt, 当然可以使用3.2中的方法创建一个进程去调用python.exe解析python程序完成调用。
把结果的data.shp文件加载到arcgis中如下图:
看完我的这个文章是不是感觉,arcgis 工具箱手工点击实现的功能都可以通过python程序调用了呢。