情景再现

现需要将Excel表信息批量赋值(不是挂接)到Shp文件的属性表,两张表的字段、记录数一模一样,至于为什么会出现这样的问题,咱也不敢问,只有想个法子把它搞定!

原始的Excel信息表共57列,总共3万多条记录,包含了正确的记录数据,如下:

目标的ArcGIS属性表也是57列(不是Table表,是要素类的属性表),记录中的信息不正确,如下:

好在它们的FID字段可以一一对应,现在需要根据Excel属性表把ArcGIS属性表填充正确。

常规思路

最容易想到的方法是,用属性表连接Excel表,然后利用字段计算器,分别进行计算。

由于记录有3万多条,平均一个字段计算要8分钟,这也得花一天时间啊,如果没有其实方法,且不用管"白猫""黑猫",能解决就行。

编程思维

从上面的方法,我们会很快发现一个问题:50多个字段的计算都是重复一个步骤,在某个字段上右键,点击"字段计算器"弹出窗口,选择相应的字段,点击确定。这个过程简单而无味,是否有让电脑自动重复这个操作,解放我们的双手?答案是肯定的,通过简单的编程来实现重复的操作,对于本场景最佳编程方式是使用强大的Python脚本。对于新手来说也莫怕,编程并不可怕,可怕的是你遇到这种问题不会编程。下面来试一下:

简单解释一下:

第一步,导入arcpy,这是ESRI给我造好的"轮子",引入它后可以做所有地理处理的功能;

第二步,直接调用字段计算的方法,方法名称是:arcpy.CalculateField_management,其后面的括号带四个参数,分别是计算的图层名称(即表名称)、计算的字段(即在哪个字段上右键调出字段计算器)、计算表达式(就是选择的赋值字段)、Python版本(固定值);

第三步,回车执行,糟糕,报错了。不要紧,仔细分析一下,看是语法问题,还是数据问题,重写一句再执行就对了。

有了成功的开始,是不是增加信心。我们不可能手动输入50多句话,也很难写的,得再想个法子来解放双手(再次编程思维)。强大的Excel上场了:用公式写好一行,直接向下拖动(或双击右下角),呵呵,这个我最擅长了。

将这些正确语法的Python语句放在窗口中执行,连续两次回车才是执行哦!

接下来就慢慢等,虽然不需要反复操作,但时间也要花很久。

收工。

---------回--------家---------吃---------饭--------

Too young to simple!第二行就报错了

怎么办?有三种方案:

方案一:辞职转行了,处理数据真是心累!

方案二:把问题返回给用户,让他们改好带拿过来!(你以为他们会听你的吗?你以为他们能准备无误地改得好吗?)

方案三:百度、谷歌,查一下原因,写一个能容错的脚本,学习一下ArcPy处理地理数据。

编程能力

接下来,才是展示真正的技术的时候了。在连接好Excel表后,不使用字段计算器工具和脚本,而且是通过遍历的方式赋值。

连接可保证行数相同。

连接后将数据导出后,将

下面这段代码主要考虑三个问题:

(1)同名字赋值,如将Name_1的值赋给Name;

(2)缺失字段不赋值,如果不存在Name_1字段,则Name的值不重处理;

(3)忽略值与类型逻辑不一致的情况,如Count字段的值不能为空,默认为0,而Count_1的值为NULL.

代码如下,不过多解释,因为这不是本文重点。

import arcpy,os

input_table=arcpy.GetParameterAsText(0)

input_result=arcpy.GetCount_management(input_table)
input_count= int(input_result.getOutput(0))
arcpy.AddMessage("input count:"+ str(input_count))
oidFieldName=arcpy.Describe(input_table).OIDFieldName
allfields = arcpy.ListFields(input_table)
lstFields=[]
for field in allfields:
lstFields.append(field.name)
arcpy.AddMessage(lstFields) # foreach all row and all field
cursor = arcpy.UpdateCursor(input_table)
for row in cursor:
fields = arcpy.ListFields(input_table)
oid=int(row.getValue(oidFieldName))
if oid>1:
arcpy.AddMessage(oid)
for field in fields:
if field.required or field.name[-2:]=='_1':
print('')
else:
targetField=field.name+'_1'
if targetField in lstFields:
newValue=row.getValue(targetField)
try:
row.setValue(field.name,newValue)
#arcpy.AddMessage(field.name+":"+ str(newValue))
except:
#arcpy.AddMessage(field.name+":except....")
pass
else:
print('')
#arcpy.AddMessage(targetField+":is not exist")
cursor.updateRow(row)

  

慢慢等结果了:

小结

1、要学会有编程(或程序)的思维去解决问题,提高工作效率;

2、编程解决问题是一种能力,是慢慢学习积累的过程,没有一本速成的书;

3、实际生产过程中的数据往往不是理想的,有各种各样的"陷阱"。

补充:

个别网友认为我小题大作了,由于原始数据不传于上传,所以我也不再反驳:

如何将Excel表批量赋值到ArcGIS属性表的更多相关文章

  1. ecshop 属性表(attribute)商品属性表(goods_attr)货品表(prduct) 商品数量的联系

    ecshop 属性表(attribute)商品属性表(goods_attr)货品表(prduct) 商品数量的联系 一个商城的商品属性存放在属性表(attribute)里 ,每个商品对应的属性在goo ...

  2. ArcGis 属性表.dbf文件使用Excel打开中文乱码的解决方法

    2019年4月 拓展: ArcGis——好好的属性表,咋就乱码了呢? 2019年3月27日补充: 在ArcMap10.3+(根据官网描述应该是,作者测试使用10.5,可行)以后的版本,可以使用ArcT ...

  3. Arcgis属性表出现乱码

    解决方案一:导入符号化字体: 在C:\Windows\Fonts文件夹下放入.TTF格式的字体库(此时加入农村二调_0.TTF和TDT10142007.ttf),便可使符号化的乱码显示正常. 解决方案 ...

  4. ArcGis——好好的属性表,咋就乱码了呢?

    我就瞎说一下,反正你也不懂. ——见到许多ArcGis属性表乱码的问题,也见过各种哭笑不得的解说 目录 第一节 字符编码那些事儿→字符编码简述 第二节 都是编码惹的祸→ArcGis属性表出错原因 第三 ...

  5. SqlServer表和excel数据批量复制方法

    SqlServer表和excel数据批量复制方法 一.SqlServer表数据复制到excel方法: 1.新建查询,用sql语句把表数据读出来 2.然后,选择数据,右键“复制”(如果需要表字段名称,则 ...

  6. ArcGIS学习记录—属性表的编辑与修改

    原文地址: ArcGIS问题:属性表的编辑与修改 - Silent Dawn的日志 - 网易博客 http://gisman.blog.163.com/blog/static/344933882009 ...

  7. AE属性表操作

    转自chanyinhelv原文AE属性表操作 实现的操作包括:1.打开属性表:2.编辑属性表:3.增加属性列:4.数据排序:5.字段计算…… 嗯,实现的功能目前就这些吧,后续还会继续跟进,还望大家多多 ...

  8. 【JVM虚拟机】(8)--深入理解Class中--方法、属性表集合

    #[JVM虚拟机](8)--深入理解Class中--方法.属性表集合 之前有关class文件已经写了两篇博客: 1.[JVM虚拟机](5)---深入理解JVM-Class中常量池 2.[JVM虚拟机] ...

  9. MFC中属性表单和向导对话框的使用

    每次在使用MFC创建一个框架时,需要一步步选择自己的程序的外观,基本功能等选项,最后MFC会生成一个基本的程序框架,这个就是向导对话框:而属性表单则是另外一种对话框,表单上有多个属性页,每点击某一页, ...

随机推荐

  1. Java学习笔记-Java文件操作流

     day03 输入输出流:读入写出  节点流:   有明确的来源和去向   往往对字节操作 节点流又叫低级流.字节流   处理流:  没有明确的来源和去向  往往对低级流或其他高级流进行操作,不能独立 ...

  2. This system is not registered with ULN

    [root@DBDATA yum.repos.d]# yum makecacheLoaded plugins: aliases, changelog, downloadonly, fastestmir ...

  3. InnoDB On-Disk Structures(三)--Tablespaces (转载)

    转载.节选于 https://dev.mysql.com/doc/refman/8.0/en/innodb-tablespace.html This section covers topics rel ...

  4. Codeforces Round #604(Div. 2,

    // https://codeforces.com/contest/1265/problem/D /* 感觉像是遍历的思维构造题 有思路就很好做的 可以把该题想象成过山车或者山峰...... */ # ...

  5. IT兄弟连 HTML5教程 HTML5文字版面和编辑标签 小结及试题

    小结 HTML标签包含结构标签和基础标签,基础标签是在页面制作最常使用的一些标签.基础标签包含标题标签(<h1>~<h6>).换行标签(<br>).段落标签(< ...

  6. SpringBoot2.0 基础案例(17):自定义启动页,项目打包和指定运行环境

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.打包简介 springboot的打包方式有很多种.可以打war ...

  7. C++ 词汇表

    C++词汇表 A abort()                       特殊函数 如果一个函数抛出异常,但在通往异常函数的调用链中找不到与之匹配的catch,则该程序通常以此函数调用终止 abs ...

  8. JPA连接Mysql数据库时提示:Table 'jpa.sequence' dosen't exisit

    场景 在使用JPA连接Mysql数据库进行数据持久化时提示: Table 'jpa.sequence' dosen't exist 注: 博客主页: https://blog.csdn.net/bad ...

  9. C#基本语法<二>_线程

    线程 多线程和异步函数 当异步线程在工作完成时如何通知调用线程 当异步线程出现异常的时候该如何处理 异步线程工作的进度如何实时的通知调用线程 如何在调用线程中取消正在工作的异步线程,并进行回滚操作 异 ...

  10. jQuery从零开始(三)-----ajax

    jq当中的ajax技术 $.ajax $.get() $.post() $.load() $.ajax({ url:'请求文件的地址', type:'请求文件使用的方法', data:'向请求的api ...