如何将Excel表批量赋值到ArcGIS属性表

情景再现

现需要将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、实际生产过程中的数据往往不是理想的,有各种各样的"陷阱"。

原文地址:https://www.cnblogs.com/liweis/p/11518998.html

时间: 2024-10-24 20:44:41

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

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

一个商城的商品属性存放在属性表(attribute)里 ,每个商品对应的属性在goods_attr里 goods_attr与(attribute)想关联,商品表里有商品数量的字段goods_number为什么有这个货品表呢? 因为 某件商品有多种属性的时候,那这个商品就成为了货品,也就是说不同属性的相同商品应该也存在差异,所以当设置商品属性的attr_type=1(表示单选属性)的时候,在 前台include/lib_comment.php 函数sort_goods_attr_id_array将

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

SqlServer表和excel数据批量复制方法 一.SqlServer表数据复制到excel方法: 1.新建查询,用sql语句把表数据读出来 2.然后,选择数据,右键"复制"(如果需要表字段名称,则点击连同标题复制) 3.在excel中直接粘贴就好了. 二.excel复制到SqlServer表数据方法1: 1.打开excel复制数据. 2.用编辑状态打开sql表 3.右键点击表最下面一行左侧的序号,选择粘贴(注意:excel的列一定要和sql表的列对应) 4.如果有自增,不要复制自增

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

原文地址: ArcGIS问题:属性表的编辑与修改 - Silent Dawn的日志 - 网易博客 http://gisman.blog.163.com/blog/static/34493388200942785434949/   属性表的编辑 1. 属性表的编辑与修改 属性表的ID的添加和删除须在stop editing 状态下,在修改或添加具体属性时要在start editing 状态下,修改添加完成后save edits. 2.属性表数据的恢复.删除.复制或粘贴 失误删除要素后,打开备份的原

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

#[JVM虚拟机](8)--深入理解Class中--方法.属性表集合 之前有关class文件已经写了两篇博客: 1.[JVM虚拟机](5)---深入理解JVM-Class中常量池 2.[JVM虚拟机](6)---深入理解Class中访问标志.类索引.父类索引.接口索引 3.[JVM虚拟机](7)---深入理解Class中-属性集合 那么这篇博客主要讲有关 方法表集合 相关的理解和代码示例. 方法表集合: 告知该方法是什么修饰符修饰?是否有方法值?返回类型是什么?方法名称,方法参数,还有就是方法内

怎样使用CPropertyPage类和CPropertySheet类创建属性表

CPropertyPage类是属性页类,相当于每一个类就是一个对话框.它继承自CDialog类. CPropertySheet类是属性表类,它有多个属性页.它继承自CWnd类 创建属性表步骤如下: 这里简单的以只有两个属性页的属性表为例子. 1.创建一个主对话框. 如图: 2.在资源中创建一个菜单 如图: 3.给菜单添加事件处理程序 如图: 4.在主对话框属性中添加菜单 如图: 5.添加两个对话框作为属性页 如图: 需要注意的是,对话框外框最好设置为thin(MSDN说的),不过我测试的时候感觉

MFC属性表单的创建

一个属性表单由一个或多个属性页组成.它有效地解决了大量信息无法在一个对话框上显示这一问题. 1.创建属性页 为了创建属性表单,首先需要创建属性页,后者对应的MFC类是CPropertyPage,该类生成的对象代表了属性表单中一个单独的属性页. 在资源编译器下添加3个属性页资源,并修改这三个属性页资源的ID及标题(Caption属性),属性页的标题就是最终在属性页上显示的选项卡的名称.有三种类型的属性页,如图: 说明:如果知道了属性页资源与对话框资源之间的属性区别,也可以在程序中先增加一个普通对话

ArcGIS批量拆分属性表中某一字段

如何在ArcGIS中将一个字段下有特征的需要分开的内容分别批量赋值给其他两个字段 观察发现可以通过中间的逗号分为前后两个部分,然后替换掉每个部分中多余的内容,即可得到结果分开可以通过Python的截取字符串方法得到,注意python的格式代码如下://根据逗号分开前后两部分,分别赋值给两列//ww列def spl(f):  str1=u','  pos=f.index(str1)  return f[0:pos] //yy列def spl(f):  str1=u','  pos=f.index(

【游戏开发】Excel表格批量转换成lua的转表工具

一.简介 在上篇博客<[游戏开发]Excel表格批量转换成CSV的小工具> 中,我们介绍了如何将策划提供的Excel表格转换为轻便的CSV文件供开发人员使用.实际在Unity开发中,很多游戏都是使用Lua语言进行开发的.如果要用Lua直接读取CSV文件的话,又要写个对应的CSV解析类,不方便的同时还会影响一些加载速度,牺牲游戏性能.因此我们可以直接将Excel表格转换为lua文件,这样就可以高效.方便地在Lua中使用策划配置的数据了.在本篇博客中,马三将会和大家一起,用C#语言实现一个Exce

ArcGIS批量导出栅格影像的属性表

需要将多幅TIF影像中的属性表导出后参与运算. 1. 打开 ArcMap 或者 ArcCatalog 2. 在文件夹中新建文件地理数据库. 3. 导入栅格.     4. 打开Python窗口,修改代码,输入进行计算. 以下代码将各文件的属性表分别导出为.csv文件.合并为一个.csv 文件在第二段代码. # coding:utf-8 #功能:批量导出栅格文件的属性表. #使用步骤 1:在相应文件夹下新建"文件地理数据库",并将需要导出属性表的栅格文件"导入"到该数