目录

arcpy根据数据库标准创建数据库模板

arcpy根据数据库标准创建数据库模板

根据数据库标准创建数据库模板

arcpy创建数据库

最近做生态保护红线评估优化调整工作,前两天部里下发了数据库标准,100多个图层,简直要命了。为了保证创建的数据库的准确性,那就用代码来试一试解决问题,正好好好学学python。

下图是国家要求的数据库:

https://i-blog.csdnimg.cn/blog_migrate/f700cb3b19736f0301264a7262149967.png

https://i-blog.csdnimg.cn/blog_migrate/66737396389163015d7812f75e59f539.png

下发下来的还是这种扫描的歪歪扭扭的pdf扫描件,找人把它处理成了电子表格。表格分为两部分,一个总表,描述数据库的要素集,图层名,类型,索引表;另一个就是各个索引表,存放在一个文件夹里,索引表里存储的就是各个图层的索引表。

https://i-blog.csdnimg.cn/blog_migrate/0af134ddc8878526ccc7f4a1c61111d8.png

https://i-blog.csdnimg.cn/blog_migrate/b29f2f98a484b8c0b2ee78c91536e7e5.png

https://i-blog.csdnimg.cn/blog_migrate/eec07f0f809a43886fba720a6242231c.png

思路

我的思路是,读取layers表,根据创建数据集,然后创建图层,赋值图层别名,找到对应的索引表,根据表添加字段。

2023年7月12日更新:增加了可以添加注记图层和表格的功能

读表

读取表格要跳过第一行,这可难倒我了。我原本想的是做个if判断 “约束条件”在List当中,就跳过这一行。结果遇到了个难题,可能是编码的问题,读取的值“约束条件”和我做判断时手输的“约束条件”两个值不相等!!试了转字符,转编码都没解决。咨询了单位的编程大佬巍哥,帮我整了一个定义读取文本的函数,用range(1, len(layerInfos))帮我解决可这个问题。

创建数据库

剩下的我觉得也没啥新奇的思路,都是简单的逻辑,一直往下写就行了。话不多说,直接贴代码。2023年7月12日更新

############
import arcpy
import os
import sys
reload(sys)
sys.setdefaultencoding('utf8')

def readGbkTxtAsList(txtPath, encoding="gbk"):
ret = []
with open(txtPath) as f:
while True:
line = f.readline().decode(encoding)
if line is not None and line.**contains**(","):
arr = line.replace("\n", "").split(",")
ret.append(arr)
else:
break
return ret

Input_layers = arcpy.GetParameterAsText(0)
Input_bgwjfolder = arcpy.GetParameterAsText(1)
CoordinateSystem = arcpy.GetParameterAsText(2)
Output_folder = arcpy.GetParameterAsText(3)
XY_FenBianLv = arcpy.GetParameterAsText(4)
XY_RongCha = arcpy.GetParameterAsText(5)
Empty_Annotation = arcpy.GetParameterAsText(6)
VarZDCD = arcpy.GetParameterAsText(7)

arcpy.env.XYResolution = XY_FenBianLv
arcpy.env.XYTolerance = XY_RongCha
arcpy.env.outputCoordinateSystem = CoordinateSystem

Shuchu = r"shujuku.gdb"
arcpy.CreateFileGDB_management(Output_folder, Shuchu)
ShuchuFullname = os.path.join(Output_folder, Shuchu)
arcpy.AddMessage("创建数据库:" + ShuchuFullname)

layerInfos = readGbkTxtAsList(Input_layers)
for i in range(1, len(layerInfos)):
(yssjjmc, tczwmc, tcywmc, jhtz, sxbsy) = layerInfos[i]
arcpy.AddMessage("\n\n")
arcpy.AddMessage(yssjjmc + "--" + tczwmc + "--" + tcywmc + "--" + jhtz + "--" + sxbsy)
if yssjjmc == "无":
yssjjlj = ShuchuFullname
else:
yssjjlj = os.path.join(ShuchuFullname, yssjjmc)
if arcpy.Exists(yssjjlj):
pass
else:
arcpy.CreateFeatureDataset_management(ShuchuFullname, yssjjmc)
tcmcFullname = os.path.join(yssjjlj, tcywmc)
if jhtz == "Annotation":
arcpy.DefineProjection_management(Empty_Annotation, CoordinateSystem)
arcpy.CopyFeatures_management(Empty_Annotation, tcmcFullname)
elif jhtz == "Table":
arcpy.CreateTable_management(yssjjlj, tcywmc)
else:
arcpy.CreateFeatureclass_management(yssjjlj, tcywmc, jhtz)
arcpy.AlterAliasName(tcmcFullname, tczwmc) # 修改图层别名
arcpy.AddMessage("创建图层: " + tczwmc)
bgmc = sxbsy + u".csv"
f1 = os.path.join(Input_bgwjfolder, bgmc)
f2 = readGbkTxtAsList(f1)
arcpy.AddMessage("读取属性表: " + sxbsy + "的信息")
for i in range(1, len(f2)):
(xh, zdmc, zddm, zdlx, zdcd, sxws, zy, sxystj, bz) = f2[i]
if zdlx == "Char":
zdlx = "TEXT"
elif zdlx == "Float":
zdlx = "DOUBLE"
elif zdlx == "Int":
zdlx = "LONG"
elif zdlx == "Date":
zdlx = "DATE"
else:
zdlx = "TEXT"
zdcd = VarZDCD
arcpy.AddMessage("添加字段 " + zdmc)
if sxystj == "M":
if zdlx == "DOUBLE":
arcpy.AddField_management(tcmcFullname, zddm, zdlx, "", "", "", zdmc, "NON_NULLABLE")
elif zdlx == "LONG":
arcpy.AddField_management(tcmcFullname, zddm, zdlx, "", "", "", zdmc, "NON_NULLABLE")
elif zdlx == "DATE":
arcpy.AddField_management(tcmcFullname, zddm, zdlx, "", "", "", zdmc, "NON_NULLABLE")
else:
arcpy.AddField_management(tcmcFullname, zddm, zdlx, "", "", zdcd, zdmc, "NON_NULLABLE")
else:
arcpy.AddField_management(tcmcFullname, zddm, zdlx, "", "", zdcd, zdmc)

结论

小白初学 python,发现 python 确实容易上手,易于理解,加上 arcpy 的帮助文档已经很详细了,在这种情况下,一天半的时间敲出这么个 60 多行,我觉得也能接受,毕竟新手上路,来日方长。其实写代码的时候也会反思道、到其他工作,做事需要认真仔细,举一反三,这样也可以避免很多问题。

界面

请注意看工具说明

https://i-blog.csdnimg.cn/blog_migrate/717a5927c7cbaea456d198b3593644b1.png#pic_center

链接