个人学习笔记,仅供学习交流。

参考书籍:《ArcGIS从0到1》

模型构建器基础知识和入门

  模型是将一系列地理处理工具串联在一起的工作流,上一个工具的输出作为下一个工具的输入。模型构建器是一个用来创建、编辑和管理模型的应用程序。

  黄色圆角矩形表示工具,椭圆表示变量(大部分是数据),连接工具连接数据和工具。

面(线)节点坐标转Excel模型

  如何将面(线)节点坐标转成Excel呢?操作流程应该是:

工作流

  1. 先从面(线)中提取出节点(要素折点转点)
  2. 给节点添加X,Y坐标(添加XY坐标)
  3. 节点表转换成Excel(表转Excel)

模型

  模型的作用便是将工作流的三个步骤合成一个!首先创建一个工具箱,然后创建一个模型。

  打开地理处理结果,将三个步骤分别拖进模型里。

  根据输入输出用连接工具将三个工具串联起来。多没被串起来的,多的部分用选择工具选中后删除。

  单击视图中的自动布局,让模型变得美观些,然后设置输入输出参数,并为模型修改名字(右键属性更改名称,而不是重命名更改模型的标签)

  不想在模型输入时已有值,编辑模型,删去输入值和输出值即可。这时整个模型会变成白色的。

模型发布和共享

  模型表面上是创建好了,但是要发布和共享还要考虑一个问题,那就是中间数据的问题,中间数据如何储存呢,如果在别的机子上找不到你设置的输出路径,那这个模型出bug了。

  常见的有两种解决方案。

方案一:托管在默认数据库里,每台机子都会有默认数据库,中间变量创建好再删除,默认数据库只是起到了保管的作用.

方案二:放在内存池里,把中间数据类似于临时变量,放在内存池里会是模型的访问速度更快。

工具箱版本转换

行内模型变量使用

  为了获得更多的运算,我们应该经常使用常量而不是变量,所以在模型中我们可以创建一个变量,然后用%…%的格式来引用这个变量,从而获得更多的运算,这就是行内模型变量的用途。

前提条件设置

  前提条件类似于编程语言中的ifelse语句,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 arcpy
from arcpy import env
import os

import sys
###############
##################################

fc= 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
# ---------------------------------------------------------------------------
# 1.py
# (generated by ArcGIS/ModelBuilder)
# Usage: 矢量图批量切割
# 原始数据 是图层,可以多选
# 切割工具是是接幅表 或则行政
# 字段是输出mdb名称
# 输出路径
# ---------------------------------------------------------------------------
# Create Geoprocessing Object
import sys, os, string
import arcpy
from arcpy import env
defaultencoding = '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"#不能c:\要c:\\或则 c:/


rows = arcpy.SearchCursor(clipshp)
#arcpy.AddMessage(u"5=执行到这里")
row = rows.next()
#arcpy.AddMessage(u"6=执行到这里")
while row:
#arcpy.AddMessage(u"7=执行到这里")
fieldvalue =""+ str(row.getValue(fieldname))
#arcpy.AddMessage(u"值fieldvalue="+fieldvalue)
if p>0: #mdb
Expression="["+fieldname +"]="
else:
Expression="\""+fieldname +"\"="
#arcpy.AddMessage(u"表达式Expression1="+Expression)
if ftype=="String":
Expression=Expression+"'"+fieldvalue+"'"
else:
Expression=Expression+fieldvalue

#arcpy.AddMessage(u"Expression2="+Expression)
arcpy.Select_analysis(clipshp, jfb_Select,Expression)
#arcpy.AddMessage(u"6=clipshp"+clipshp)
out_mdb=""
#arcpy.AddMessage("======================================================out_mdb"+out_mdb)
if mdbbool=="true":
out_mdb=outworkspace + "\\"+fieldvalue+".mdb" #os.path.basename(dataset)
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))
#arcpy.AddMessage("88888888888888888888888888888888888888")
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:
#If an error set output boolean parameter "Error" to True.
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 sys
#############
#################################
import arcpy
import string

try:
workspace =arcpy.GetParameterAsText(0) #'C:\Users\Administrator\Desktop\\cc'

outdb =arcpy.GetParameterAsText(1) #'C:\Users\Administrator\Desktop\\lutian.mdb'
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,types
import arcpy
from arcpy import env


arcpy.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" #不能c:\要c:\\或则c:/


for row in rows:

try:
b=1
value=row.getValue(fieldname)
#gp.AddMessage("value="+value)
if (type(value) is types.IntType):
fieldvalue = str(value)
b=2
elif (type(value) is types.StringType): #是否string类型
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:
#If an error set output boolean parameter "Error" to True.
arcpy.AddError(str(ErrorDesc))
if arcpy.Exists(jfb_Select):
arcpy.Delete_management(jfb_Select)