个人学习笔记,仅供学习交流。
参考书籍:《ArcGIS从0到1》
模型构建器基础知识和入门 模型是将一系列地理处理工具串联在一起的工作流,上一个工具的输出作为下一个工具的输入。模型构建器是一个用来创建、编辑和管理模型的应用程序。
黄色圆角矩形表示工具,椭圆表示变量(大部分是数据),连接工具连接数据和工具。
面(线)节点坐标转Excel模型 如何将面(线)节点坐标转成Excel
呢?操作流程应该是:
工作流
先从面(线)中提取出节点(要素折点转点)
给节点添加X,Y坐标(添加XY坐标)
节点表转换成Excel(表转Excel)
模型 模型的作用便是将工作流的三个步骤合成一个!首先创建一个工具箱,然后创建一个模型。
打开地理处理结果,将三个步骤分别拖进模型里。
根据输入输出用连接
工具将三个工具串联起来。多没被串起来的,多的部分用选择工具选中后删除。
单击视图中的自动布局,让模型变得美观些,然后设置输入输出参数,并为模型修改名字(右键属性更改名称,而不是重命名更改模型的标签)
不想在模型输入时已有值,编辑模型,删去输入值和输出值即可。这时整个模型会变成白色的。
模型发布和共享 模型表面上是创建好了,但是要发布和共享还要考虑一个问题,那就是中间数据的问题,中间数据如何储存呢,如果在别的机子上找不到你设置的输出路径,那这个模型出bug了。
常见的有两种解决方案。
方案一:托管在默认数据库里,每台机子都会有默认数据库,中间变量创建好再删除,默认数据库只是起到了保管的作用.
方案二:放在内存池里,把中间数据类似于临时变量,放在内存池里会是模型的访问速度更快。
工具箱版本转换
行内模型变量使用 为了获得更多的运算,我们应该经常使用常量而不是变量,所以在模型中我们可以创建一个变量,然后用%…%的格式来引用这个变量,从而获得更多的运算,这就是行内模型变量的用途。
前提条件设置 前提条件类似于编程语言中的if
…else
语句,if里面的程序块要想执行,则if括号内的判断条件必须成立,否则程序块不执行。
迭代器使用 迭代类似于编程语言里的循环,通常有for循环,while循环等。
For循环(循环输出DEM小于某个高程的数据)
迭代要素选择(一个图层按属性相同导出)
影像数据批量剪裁模型
迭代数据集(一个数据库所有数据集导出到另一个数据库)
迭代要素类(批量修复几何)
迭代栅格数据(一个文件夹含子文件夹批量定义栅格坐标系)
迭代工作空间(一个文件夹含子文件夹所有mdb数据库执行碎片整理)
模型中仅模型工具介绍
计算值 表中没有相应字段则添加字段,有则不加
收集值 收集值工具专用语收集迭代器的输出值或将一组多值转换为一个输入,手机值得输出可用作合并、追加、镶嵌和像元统计等工具的输入。(类似于将垃圾放在垃圾袋里,等没有垃圾可丢了,就统一丢出去)
解析路径(把一个图层数据源路径名称写入某个字段) 解析路径就是解析数据来源并写入某个字段里。
Python 为什么要学习Python
ArcGIS内置Python,在Esri中推荐的是Python,在字段计算器和标注等地方,ArcGIS中支持VB和Python语言,在ArcGIS Pro中更多的是Python语言,工具箱中基本上每个工具都有Python调用的原码,ArcGIS命令行是Python,Pthon做数据批量处理有有事,但缺点是界面不够灵活。
在工具箱中,很多工具如多环缓冲区、点集转线都使用Python开发的,ArcGIS Python脚本都是开源的,右击编辑即可查看。
Python目前排名很靠前,语言比较简练。
Python是未来发展的趋势。
用Python开发ArcGIS第一个小程序 在ArcGIs中使用Python,可以先写好Python代码,使用记事本写,也可以使用Pycharm等其他软件,再建一个工具箱,在工具箱的右键菜单中添加脚本,跟着向导操作就可以。
ArcGIS Python的其他例子 更新字段值为顺序号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import arcpyfrom arcpy import envimport osimport sysfc= arcpy.GetParameterAsText(0 ) fieldname= arcpy.GetParameterAsText(1 ) k= arcpy.GetParameter(2 ) rows = arcpy.UpdateCursor(fc) i=k for row in rows: row.setValue(fieldname,i) arcpy.AddMessage("No:" +str (i)) rows.updateRow(row) i=i+1 ;
矢量批量剪裁的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 import sys, os, stringimport arcpyfrom arcpy import envdefaultencoding = 'utf-8' if sys.getdefaultencoding() != defaultencoding: reload(sys) sys.setdefaultencoding(defaultencoding) arcpy.env.overwriteOutput = True inworkspace = arcpy.GetParameterAsText(0 ) arcpy.AddMessage("输入数据=" +inworkspace) clipshp = arcpy.GetParameterAsText(1 ) arcpy.AddMessage("裁剪=clipshp" +clipshp) fieldname= arcpy.GetParameterAsText(2 ) arcpy.AddMessage("字段=fieldname" +fieldname) outworkspace = arcpy.GetParameterAsText(3 ) arcpy.AddMessage("输出=" +outworkspace) mdbbool = arcpy.GetParameterAsText(4 ) arcpy.AddMessage("是否mdb=" +mdbbool) desc = arcpy.Describe(clipshp) filepath=desc.CatalogPath p=filepath.find(".mdb" ) ftype="String" for field in desc.fields: if field.Name ==fieldname: ftype=field.Type break arcpy.AddMessage(u"默认地理数据库:" +arcpy.env.scratchWorkspace) jfb_Select=arcpy.env.scratchWorkspace+"\yl999" rows = arcpy.SearchCursor(clipshp) row = rows.next () while row: fieldvalue ="" + str (row.getValue(fieldname)) if p>0 : Expression="[" +fieldname +"]=" else : Expression="\"" +fieldname +"\"=" if ftype=="String" : Expression=Expression+"'" +fieldvalue+"'" else : Expression=Expression+fieldvalue arcpy.Select_analysis(clipshp, jfb_Select,Expression) out_mdb="" if mdbbool=="true" : out_mdb=outworkspace + "\\" +fieldvalue+".mdb" else : out_mdb=outworkspace + "\\" +fieldvalue+".gdb" arcpy.AddMessage(u"out_mdb" +out_mdb) if not arcpy.Exists(out_mdb): if mdbbool=="true" : arcpy.CreatePersonalGDB_management(os.path.dirname(out_mdb),os.path.basename(out_mdb)) else : arcpy.CreateFileGDB_management(os.path.dirname(out_mdb),os.path.basename(out_mdb)) mydatasets= string.split(inworkspace,";" ) for dataset in mydatasets: try : mylayer=os.path.basename(dataset) arcpy.AddMessage(u"clip:" +dataset+" to " +out_mdb+"\\" + mylayer) mylayer=mylayer.replace("(" ,"" ) mylayer=mylayer.replace(")" ,"" ) arcpy.Clip_analysis(dataset, jfb_Select,out_mdb+"\\" + mylayer, "" ) except Exception, ErrorDesc: arcpy.AddError(str (ErrorDesc)) row = rows.next () if arcpy.Exists(jfb_Select): arcpy.Delete_management(jfb_Select)
矢量批量合并
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 import sysimport arcpyimport stringtry : workspace =arcpy.GetParameterAsText(0 ) outdb =arcpy.GetParameterAsText(1 ) arcpy.env.workspace = workspace arcpy.AddMessage("outdb:" +outdb) files = arcpy.ListWorkspaces("" ,"" ) for File in files: arcpy.AddMessage("File:" +File) arcpy.env.workspace = outdb fcs = arcpy.ListFeatureClasses() for fc in fcs: arcpy.AddMessage("fc:" +fc) if arcpy.Exists(File + "\\" + fc): arcpy.Append_management([ File + "\\" + fc], outdb + "\\" + fc,"NO_TEST" ,"" ,"" ) else : arcpy.AddMessage("not exists:" +File + "\\" + fc) fcs = arcpy.ListTables() for fc in fcs: arcpy.AddMessage("fc:" +fc) if arcpy.Exists(File + "\\" + fc): arcpy.Append_management([File + "\\" + fc], outdb + "\\" + fc,"NO_TEST" ,"" ,"" ) else : arcpy.AddMessage("not exists:" +File + "\\" + fc) dss = arcpy.ListDatasets() for ds in dss: arcpy.AddMessage("ds:" +ds) arcpy.env.workspace = outdb+"\\" +ds fcs1 = arcpy.ListFeatureClasses() for fc1 in fcs1: arcpy.AddMessage("fc1:" +fc1) if arcpy.Exists(File + "\\" + ds + "\\" + fc1): arcpy.Append_management([File + "\\" + ds + "\\" + fc1], outdb + "\\" + ds + "\\" + fc1,"NO_TEST" ,"" ,"" ) else : arcpy.AddMessage("not exists:" +File + "\\" + ds + "\\" + fc1) except arcpy.ExecuteError: arcpy.AddWarning(arcpy.GetMessages())
影像批量剪裁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 import sys, os, string,typesimport arcpyfrom arcpy import envarcpy.env.overwriteOutput = True oldraster = arcpy.GetParameterAsText(0 ) arcpy.AddMessage("1oldraster=" +oldraster) clipshp = arcpy.GetParameterAsText(1 ) arcpy.AddMessage("2clipshp=" +clipshp) fieldname= arcpy.GetParameterAsText(2 ) arcpy.AddMessage("3fieldname=" +fieldname) outworkspace= arcpy.GetParameterAsText(3 ) arcpy.AddMessage("4=" +outworkspace) arcpy.CheckOutExtension("spatial" ) rows = arcpy.SearchCursor(clipshp) jfb_Select=outworkspace+"/temp.shp" for row in rows: try : b=1 value=row.getValue(fieldname) if (type (value) is types.IntType): fieldvalue = str (value) b=2 elif (type (value) is types.StringType): fieldvalue = value else : fieldvalue = str (value) arcpy.AddMessage("fieldvalue=" +fieldvalue) if b==2 : Expression="\"" +fieldname +"\" =" +fieldvalue+"" else : Expression="\"" +fieldname +"\" ='" +fieldvalue+"'" arcpy.AddMessage("Expression=" +Expression+",jfb_Select=" +jfb_Select+",clipshp=" +clipshp) arcpy.Select_analysis(clipshp, jfb_Select, Expression) out_raster =outworkspace+"/" +fieldvalue+".tif" arcpy.gp.ExtractByMask_sa(oldraster, jfb_Select, out_raster) except Exception, ErrorDesc: arcpy.AddError(str (ErrorDesc)) if arcpy.Exists(jfb_Select): arcpy.Delete_management(jfb_Select)