IDL学习:语法基础-对象、哈希表

        本博客将介绍IDL语法基础中的对象哈希表创建及相关的操作发法。哈希表、链表都可以看做对象,包含了add、reserve、Sort等方法。记录自己的学习+整理+理解 。

1. 对象 

        对象是数据(属性)和程序(方法)封装在一起的实体。对象的功能操作或接收到外界信息后的处理操作成为方法(来自《IDL程序设计——数据可视化分析与ENVI二次开发》)。举个栗子,例如计算计算计算圆的相关性质,可以是计算圆的直径、面积、周长……        

1.1 创建对象

        可以利用Obj_New()函数、ObjArr()函数来创建对象,语法如下:

Result = OBJ_NEW( [ObjectClassName [, Arg1...Argn]] )

Result = OBJARR( D1[, ..., D8] )

        ObjectClassName是指IDL提供的对象名字,IDL提供的对象形如IDLxxYYYY,xx表示类的类型,YYYY表示类的名称。例如IDLgrImage表示类为图形(gr是graphics的缩写)中的图像(Image)对象;IDLgrPDF表示类为图形(gr是graphics的缩写)中的PDF对象;IDLgrView表示类为图形(gr是graphics的缩写)中的视图(view)对象。IDL中提供对象可以分为5类:

  1.  Analysis Object Classes                        分析对象类                         简称:an
  2.  File Format Object Classes                   文件格式对象类                  简称:ff
  3.  Graphics Object Classes                       图形对象类                         简称:gr
  4.  Network Object Classes                        网络对象类                          简称:net
  5.  Miscellaneous Object Classes               其他项目类别                     简称:_、db、com等

        对象查看地址:帮助文档中 Routines (alphabetical) > Object Classes

 例子:新建一个IDLgr

>>oImage = Obj_new('IDLGRIMAGE')
>>help,oIMAGE
OIMAGE          OBJREF    = <ObjHeapVar1(IDLGRIMAGE)>

IDL8.0之后版本,也可以直接吧对象当做函数使用,直接创建新的对象,格式如下:

Result = ObjClassName([Arg1...Argn])

ObjClassName表示对象的名称,例如IDLgrPDF、IDLgrImage……

>>oImage1 = Idlgrimage()
>>help,oImage1
OIMAGE1         OBJREF    = <ObjHeapVar4(IDLGRIMAGE)>

注: Arg1...Argn表示参数、属性,也可以通过对象设置属性的方法设置对象属性Setproperty。反之,获取对象属性,可以利用Getproperty

>>oImage1 = Idlgrimage(Name='Hulz')    ; 新建Idlgrimage的对象oImage1,Name属性值为Hulz
>>oImage1.Getproperty,Name = Name
>>Name
Hulz
>>oImage1.Setproperty,Name = 'XMU'     ; 设置对象变量oImage1,Name属性值为XMU
>>Name
XMU

         注:对象创建后,可以利用Obj_Valid()进行验证,

Result = OBJ_VALID( [Arg] [, /CAST] [, COUNT=variable] [, /GET_HEAP_IDENTIFIER] )

        常配合 IF (OBJ_VALID(obj)) THEN …一起使用。

1.2 调用对象

        调用对象本质就是调用所包含的方法,对象的方法是有两大类组成,过程Produre和函数function。我的上一个博客中所讲的链表以及前面的博客中将的IDLffshape,也是一个对象,其中该对象的方法如博客中的2.2小结所示,有List::addlist::Count……这些方法都是针对链表list的操作方法。

        在以下示例中,读取 states.shp Shapefile 中的所有实体,然后调用 DestroyEntity 方法来清理所有指针(代码来自官方示例):


PRO Ex_shapefile; 代码来自官方示例程序; 打开示例目录中的 states Shapefilemyshape=Obj_new('IDLffShape', Filepath('states.shp', $SUBDIR=['examples', 'data'])); 获取实体的数量,以便我们可以解析它们。myshape.Getproperty, N_ENTITIES=num_ent; 阅读所有实体。 Shapefile 中的实体数组从索引零 (0) 开始。FOR x=0, (num_ent-1) DO BEGIN; Read the entity x; ent = myshape.Getentity(x)ent = myshape->Getentity(x); 清理指针; myshape.Destroyentity, entmyshape->Destroyentity, entENDFOR; 关闭 Shapefile.Obj_destroy, myshape
END

        下面一段为读取Shape文件存放的数据

FUNCTION Read_shape_disp,Files;COMPILE_OPT idl2; 选取shape文件Tmp = Strpos(File_basename(Files),'.shp')Shp_Files = Files(Where(Tmp > 0)); Shape文件个数N_Files = N_elements(Shp_Files)attr_values = !null       ; 空矩阵,存放数据FOR index = 0L, N_Files-1 DO BEGIN;读取shp文件的信息oshp=Obj_new('IDLffShape',Shp_Files(index))IF ~Obj_valid(oshp) THEN Return,0oshp->Getproperty,n_entities=n_ent,$ ;记录个数Attribute_info=attr_info,$ ;属性信息,结构体, name为属性名ATTRIBUTE_NAMES = attr_names, $n_attributes=n_attr,$ ;属性个数Entity_type=ent_type  ;记录类型;循环中,读取每条shp记录FOR i = 0, n_ent-1 DO BEGINent = oshp->Getentity(i, /ATTRIBUTES) ;第i条记录,获取数据attr_values = [attr_values, (*(ent.ATTRIBUTES)).(0)]ENDFORENDFORValue_Ave = Mean(attr_values,/Nan)        ; 计算均值Return,Value_Ave 
END

 1.3 对象常用函数        

        为了更方便使用对象,官方还给出了几个对象常用函数,常见的函数有:Obj_Class()、Obj_HasMethod()、Obj_IsA()。

1.3.1 Obj_Class()

        Obj_Class()函数是用来获取对象的基类或继承类的名称。

>>oshp=Obj_new('IDLffShape')
% Loaded DLM: SHAPEFILE.
>>oshp2 = obj_Class(oshp)
>>help,oshp
OSHP            OBJREF    = <ObjHeapVar8(IDLFFSHAPE)>
>>help,oshp2
OSHP2           STRING    = 'IDLFFSHAPE'

1.3.2 Obj_HasMethod()

        Obj_HasMethod()函数是用来判断对象是否具备某个方法,具备该方法则输出1,反之为0

>>oshp=Obj_new('IDLffShape')
>>print,Obj_hasmethod(oshp,'Getentity')1
>>print,Obj_hasmethod(oshp,'AAAAA');胡编的方法AAAAA0

1.3.3 Obj_IsA()

        Obj_IsA()函数是用来对象是否是某个类的实例,是,则输出1,反之为0.

>>oshp=Obj_new('IDLffShape')
>>print,Obj_IsA(oSHP,'IDLffShape')1
>>print,Obj_IsA(oSHP,'IDLgrImage')0

1.4 销毁对象

        利用OBJ_DESTROY过程销毁对象,语法如下:

​OBJ_DESTROY, ObjRef [, Arg1, …, Argn]

        若销毁所有现有的指针堆变量使用命令: OBJ_DESTROY, OBJ_VALID()

2. 哈希表

         哈希表是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。(来源于:百度百科)

        注:哈希表可以视为一个官方设定的最基础的对象,从角度上,学习哈希表、链表,更容易理解它们复杂的操作方法。

>>A = Obj_new('HASH')
>>A
{
}
>>help,A
A               HASH  <ID=12  NELEMENTS=0>      
>>B = Hash()
>>help,B
B               HASH  <ID=23  NELEMENTS=0>

         其中,两种方法获取的哈希表是一样的,ID是系统分配的,任何变量都不一致

2.1 创建哈希表

        可以利用函数Hash()创建哈希表(可以理解为创建哈希表的对象)。

语法如下:

Result = Hash( Key1, Value1, Key2, Value2, ... KEYN, Valuen, /EXTRACT, /FOLD_CASE, /NO_COPY )

Result = Hash( Keys, Values, /EXTRACT, /FOLD_CASE )

Result = Hash( Keys , /FOLD_CASE )

Result = Hash( Structure, /EXTRACT, /FOLD_CASE, /LOWERCASE)

         创建一个哈希表,存放个人信息:Name、Work、Age、From,这些其实就是哈希表中的Key,其所对应的值就是Value。

>>Me = Hash('Name','胡','Work','搬砖','Age',18,'From','Jiangxi')
>>help,Me
ME              HASH  <ID=1  NELEMENTS=4>
>>Print,Me
Age:       18
Work: 搬砖
Name: 胡
From: Jiangxi
>>Print,Me['From']            ; 查看From关键字
Jiangxi

         哈希表没有Add方法,但可以使用Hash["Key"] = Value

>>Me['Love'] = 'Wife'
>>Print,Me['Love']
Wife

2.2 访问哈希表

     访问方法如下:

hash['Keys'] 

>> ; 该代码承接上一个代码
>>Print,Me['From']
Jiangxi

 注意:此处关键字是区分大小写的,如下所示。

>>Print,Me['Name']
胡
>>Print,Me['name']
% Key does not exist: "name"
% Execution halted at: $MAIN$ 

2.3 哈希表操作方法

2.3.1 Hash::Count 统计

        该方法是统计哈希表中元素(关键字、或有个关键字所对应的元素)的个数

Result = hash.Count( [Value] )

>>Num = Me.Count()
>>Num5
>>Print,N_elements(Me)5

2.3.2 Hash::Filter 过滤

        该方法是过滤选出满足条件的哈希表中的元素,生成新的哈希表,且不改变原有的哈希表。

Result = hash.Filter( Function, Args )

; 本代码来自官方代码
FUNCTION Myfilterfunction, valueReturn, value LE 3 || Min(value MOD [2:Fix(Sqrt(value))])ENDPRO Hash_Test;Use your FUNCTION to Return only the prime numbers In HASH:var = Hash('A', 4, 'B', 5, 'C', 499, 'D', 1000)newvar = var.Filter('myfilterfunction')Print,newvar 
END

输出结果为:

2.3.3 Hash::HasKey 判断关键字

         该方法判断是否有一个关键字key,是则输出1,反之则为0。

Result = hash.HasKey(Keys )

>>Me = Hash('Name','胡','Work','搬砖','Age',18,'From','Jiangxi')
>>Me
{"Age": 18,"Work": "搬砖","Name": "胡","From": "Jiangxi"
}
>>Print,Me.haskey('Work')1
>>Print,Me->haskey('Work')1
>>Print,Me->haskey('A')

2.3.4 Hash::IsEmpty 是否为空

        测试哈希表是否为空、存在。若为空则输出0,若非空,则输出1。

Result = hash.IsEmpty( )

>>Me = Hash('Name','胡','Work','搬砖','Age',18,'From','Jiangxi')
>>Print, Me.Isempty()    ; 存在时0
>>I = Hash()
>>Print, I.Isempty()    ; 空1

2.3.5 Hash::Keys 获取关键字key

        该方法是用来获取哈希表中的关键字key。

Result = hash.Keys( )

>>Print, Me.Keys()
Age
Work
Name
From


2.3.6 Hash::Map 判断

        该方法是用来判断各个关键字所对应的元素是否满足要求(自定义函数、lambda),满足则

Result = hash.Map( Function, Args )

        输出的结果是一个哈希表,其关键字与所需处理的哈希表一样,每个关键字对应的元素只能是0或1。该方法与hash::filter方法一样,不同之处在于hash::filter是筛选满足要求的哈希表关键字(及对应元素),Hash::Map方法是判断是否满足要求,满足则关键字对应的元素为1,反之则为0。

       下面是代码与2.3.2节代码一样,不同之处在于这代码使用hash::map方法。

FUNCTION Myfilterfunction, valueReturn, value LE 3 || Min(value MOD [2:Fix(Sqrt(value))])ENDPRO Hash_Test;Use your FUNCTION to Return only the prime numbers In HASH:var = Hash('A', 4, 'B', 5, 'C', 499, 'D', 1000)newvar = var.map('myfilterfunction')       ; hash::map方法,判断关键字对应的元素是否满足要求Print,'newvar结果:'Print,newvarhelp,'newvar的类型:',newvar 
END

结果显示输出的结果是一个哈希表,其关键字key和原哈希表一致:

2.3.7 Hash::Reduce 累积

         该方法通过用户定义的函数或 Lambda 函数累积传递每个数据值,并返回单个标量结果。

Result = hash.Reduce( Function, Args, VALUE=value)

FUNCTION myreducefunction, accumvalue, valueReturn, accumvalue + valueENDPRO Hash_test;Use your FUNCTION on a Hash OF key-value PAIRS:var = Hash('Name','胡','Work','搬砖','Age','18','From','Jiangxi')newvar = var.Reduce('myreducefunction')Print, newvar
END

 注:“累积”的顺序是按照key的字母排序,而不是实际的排序。

2.3.8 Hash::Remove 删除

 该方式是移除Hash中的元素,并可选择返回移除的值。

Result = hash.Remove( [, Keys] [, /ALL] )

hash.Remove [, Keys] [, /ALL]

>>Me = Hash('Name','胡','Work','搬砖','Age','18','From','Jiangxi')
>>Me.Remove,['Work','Age']
>>Me
{"Name": "胡","From": "Jiangxi"
}
>>


2.3.9 Hash::ToStruct 转化为结构体

        该方法是将哈希表转化为结构体。

Result=hash.ToStruct( [, MISSING=value][, /NO_COPY] [, /RECURSIVE] [, SKIPPED=variable] )

>>Me = Hash('Name','胡','Work','搬砖','Age','18','From','Jiangxi')
>>I = Me.tostruct()
>>help,I
** Structure <3d58e550>, 4 tags, length=64, data length=64, refs=1:AGE             STRING    '18'WORK            STRING    '搬砖'NAME            STRING    '胡'FROM            STRING    'Jiangxi'

2.3.10 Hash::Values 

        该方法返回一个包含哈希中所有值的 LIST。只要没有从哈希中添加或删除任何项目,hash.keys 和 hash.Values() 中的键/值对的顺序就保证保持相同。

Result = hash.Values( )

>>Me = Hash('Name','胡','Work','搬砖','Age','18','From','Jiangxi')
>>list = Me.Values()
>>help,list
LIST            LIST  <ID=34  NELEMENTS=4>
>>print,list
18
搬砖
胡
Jiangxi
>>


2.3.11 Hash::Where 

        该方法返回包含某个 value.hash 的所有键的 list。

Result = hash.Where( Value [, COMPLEMENT=variable] [, COUNT=variable] [, NCOMPLEMENT=variable] )

2.4 销毁哈希表

        可以使用Obj_destroy,Hash 来销毁哈希表

>>Me = Hash('Name','胡','Work','搬砖','Age','18','From','Jiangxi')
>>ME
{"Age": "18","Work": "搬砖","Name": "胡","From": "Jiangxi"
}
>>Obj_destroy,Me
>>Me
<ObjHeapVar1>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hdfs中8031是什么端口号_在宿主机如何访问docker中hadoop的hdfs:ip:9000啊, 端口映射出来啊...

本人有一个3节点hadoop, 启动了3个docker容器, 众所周知, docker容器内服务的端口是可以映射到宿主机的端口的, 我采用-P将容器的所有端口映射到主机端口, 命令如下:docker run -it -v /Users/yc/hadoop/docker:/test -P -h h1 --name h1 sequenceiq/hadoop-docker /etc/bootst…

linux nginx安启动_linux下nginx编译安装启动

1、在指定目录解压包命令&#xff1a;tar -zxvf nginx-1.10.3.tar.gz解压后&#xff0c;在nginx-1.10.3同级目录下&#xff0c;创建nginx目录(编译安装目录)2、编译安装nginx是需要编译安装&#xff0c;在nginx-1.10.3目录下执行命令命令&#xff1a; ./configure --prefix/usr…

linux怎样自制库_如何制作自己的LINUX系统?

创建工作目录使用busybox生成根文件系统中的bin等目录创建服务启动脚本与inittab文件与fstab文件创建根文件系统的init脚本(initrc使用linuxrc&#xff0c;而initramfs使用init脚本&#xff0c;所以先删除busybox为initrc生成的默认的linuxrc文件&#xff0c;rm-rf$LINUX/linux…

茶苑机器人怎么看出来_小儿脑瘫怎么看出来?出现4个异常,该早点去看医生...

小儿脑瘫表现出来的症状是多种多样的&#xff0c;一般儿童三个月就能够展现出来&#xff0c;家长应该多观察孩子的一些异常情况&#xff0c;及时去医院做诊断&#xff0c;做到防患于未然。小儿脑瘫的表现有哪些&#xff1f;1、运动发育明显落后正常的儿童3个月能抬头&#xff0…

itil 容量管理流程_探索ITIL和DevOps的边界

其实在今天的运维领域&#xff0c;ITIL和DevOps之间的冲突还是蛮明显的&#xff0c;有些是表现在产品上&#xff0c;有些是表现在思维/理念上。ITIL在产品上以流程为核心目标的设计&#xff0c;很难满足自动化的要求&#xff0c;DevOps极力推崇工具/平台/自服务文化&#xff1b…

本博客IDL 学习目录

本博客非技术博客&#xff0c;而是总结我在学习IDL、编写IDL代码方面的博客&#xff0c;旨在方便各位可以通过我这篇博客直接选感兴趣的部分。本博客将会持续更新&#xff0c;不断补充…… IDL 学习 1. IDL 文本编码、代码补全快捷方式、IDL doc、格式器、行号显示设置 2. ID…

python中一个汉字是几个字节_数据库中汉字是几个字节

不依赖微软的库和WindowsAPI&#xff0c;没能试验成功&#xff01;######问题已解决&#xff0c;谢谢。######看这篇文章&#xff0c;讲的很清楚(&#xff1a;)这是从其他地方拷贝过来的) UNICODE环境设置 在安装Visual Studio时&#xff0c;在选择VC时需要加入unicode选项&…

Matlab 中@ 的用法

Matlab 中的用法主要有&#xff1a;函数句柄、函数表达式、调用父类以及类文件夹。 前两种有很多介绍&#xff0c;后两种涉及类&#xff0c;介绍的人很少。前2个例子&#xff0c;参考了其它博客&#xff0c;总感觉用法都写的不全&#xff0c;所以在此基础上&#xff0c;补充了3…

金蝶k3单据编码规则_金蝶K3存货跌价案例教程

目录案例介绍 后台设置 计提存货跌价准备显示计提表计提凭证模板设置计提凭证生成手工结转跌价准备案例介绍关于存货跌价准备&#xff0c;企业会计准则第1号存货相关规定如下&#xff1a;第十五条 资产负债表日&#xff0c;存货应当按照成本与可变现净值孰低计量。存货成本高于…

maven 关联源码插件_繁琐的任务简单化,Maven的插件机制

Maven的生命周期与Maven插件是项目绑定的&#xff0c;生命周期可以理解为项目构建步骤的集合&#xff0c;它定义了各个构建环节的执行顺序&#xff0c;有了这个顺序&#xff0c;Maven 就可以自动化的执行构建命令。Maven 的核心程序中定义了抽象的生命周期&#xff0c;生命周期…

php配置email支持_配置以及实现mail()函数

配置sendmail.ini文件error_logfileerror.log; create debug log as debug.log (defaults to same directory as sendmail.exe); uncomment to enable debuggingdebug_logfiledebug.log; if your smtp server requires authentication, modify the following two linesauth_use…

树莓派控制电机转速_怎样用树莓派控制直流电机的方向和速度

步骤1&#xff1a;DC的控制方向通过RPi电机使用RPi控制直流电机我们的下一个任务是使用树莓派上的python脚本和GPIO头控制直流电动机&#xff0c;这将在我们的脑海中产生一幅“机器人如何工作”的图景。您可以根据外面的天气来控制房间的风扇(因为您知道rpi会使用传感器)。完成…

双稳态继电器工作原理图_固态继电器只有单一的作用吗?带你了解不一样的固态继电器...

固态继电器简写SSR(Solid State Relay)&#xff0c;是一种全部又分离的固态电子元件(如光耦合器、晶体管、可控硅、电阻、电容、集成电路等)组成的无触点电阻开关&#xff0c;这里请注意&#xff0c;相比较与继电器、接触器&#xff0c;固态继电器是无触点的耦合开关。因此&…

c++switch实现猜拳_C语言实现人机猜拳游戏,非常适合C++小白练习的项目!

学习迷茫遇到问题了吗&#xff1f;现在关注微信公众号&#xff1a;C程序编程 免费获取进阶指导和学习资料&#xff01;本文福利在文末&#xff01;这是一个简单的猜拳游戏&#xff08;剪子包子锤&#xff09;&#xff0c;让你与电脑对决。你出的拳头由你自己决定&#xff0c;电…

bootstraptable获得所有行_2020广汽本田安全中国行·首届道路安全创新大赛成功举办...

两辆汽车分别搭载了代表着婴儿的红心&#xff0c;当两车相撞&#xff0c;被安全座椅包裹的红心安然无恙&#xff0c;而另一颗没有安全措施的红心直接裂开。画面配文"救救孩子"&#xff0c;让人格外揪心。这是来自2020年广汽本田安全中国行首届道路安全创新大赛公益广…

en55032最新标准下载_大型设备塔吊安装维保、安全检查及案例,94页PPT下载!

提示&#xff1a;点击↑上方"建筑安全技术"关注加入领取&#xff1a; 一级建造师课件&#xff1b; 二级建造师课件&#xff1b;注册安全工程师课件&#xff1b;目录&#xff1a;1、 塔吊的安装流程及使用的常规检查2、 塔吊维修保养3、 使用过程中存在的问题4、 …

六年级下册百分数计算题_小学六年级数学期末考,题量较大,出题全面、灵活...

昨天&#xff0c;我们进行了期末考试&#xff0c;因为是八月中旬开学的&#xff0c;所以&#xff0c;期末考试&#xff0c;也进行地比较早。六年级数学上册人教版&#xff0c;此次期末测试&#xff0c;题量是非常大的&#xff0c;大题共有六道&#xff0c;题型呢&#xff0c;主…

媒体转码切片_移动、咪咕携手华为实现5G网络切片应用大型直播

在西班牙巴塞罗那移动通信大会上&#xff0c;华为公司展台用电子屏展示5G技术。新华社资料图近日&#xff0c;第十二届音乐盛典咪咕汇在上海梅赛德斯奔驰文化中心开幕。周杰伦、张惠妹、G.E.M.邓紫棋等华语乐坛著名歌手悉数亮相。在上海移动、咪咕、华为的合作之下&#xff0c;…

macos可以升级到指定版本吗_iOS14如期而至!重大更新的全新版本,值得升级吗?答案在这...

昨天&#xff0c;苹果相继发布了iOS 14&#xff0c;iPad OS 14&#xff0c;watchOS 7&#xff0c;tvOS14和macOS 10.16。顺便说一下&#xff0c;我们将为您提供最新的iOS14测试体验&#xff0c;让您知道它是否值得升级&#xff0c;这让iPhone6s用户留下了深刻的印象。IOS 14是自…

筒灯智能驱动芯片作用_魅族携8款智能照明新品进军智能家居,剑指行业前三...

原标题&#xff1a;魅族携8款智能照明新品进军智能家居&#xff0c;剑指行业前三不久前&#xff0c;魅族正式对外宣布进军智能家居领域&#xff0c;从开启了手机智能家居智能穿戴的全新“一体两翼”战略&#xff0c;并对外公布全新高端智能家居品牌Lipro&#xff0c;目标在三年…