IDL学习(对象):IDLffShape

目录

一、描述

二、创建

三、属性

3.1 ATTRIBUTE_INFO

3.2 ATTRIBUTE_NAMES

3.3 DBF_ONLY

3.4 ENTITY_TYPE

3.5 FILENAME

3.6 IS_OPEN

3.7 N_ATTRIBUTES

3.8 N_ENTITIES

3.9 N_RECORDS

3.10 UPDATE

 四、方法:

4.1 IDLffShape::AddAttribute

4.2 IDLffShape::Cleanup

4.3 IDLffShape::Close

4.4 IDLffShape::DestroyEntity

4.5 IDLffShape::GetAttributes

4.6 IDLffShape::GetEntity

4.7 IDLffShape::GetProperty

4.8 IDLffShape::Init

4.9 IDLffShape::Open

4.10 IDLffShape::PutEntity

4.11 IDLffShape::SetAttributes

五、ESRI Shapefiles文件概述

六、属性

七、例子

7.1 读取Shapefiles数据

7.2 新建Shapefile文件

7.3 更新现有的 Shapefile

7.4 绘制更新的 Shapefile



声明:本文是根据官方文档进行整合翻译,用于交流学习。如有侵权,请及时告知,我将立刻删除!

官方文档的地址为:安装路径/IDL85/help/online_help/IDL/idl.htm#cshid=IDLFFSHAPE

一、描述

        IDLffShape 对象包含从 ESRI Shapefile 访问的图形基元的几何、连通性和属性。  请参阅 ESRI Shapefile 概述。

二、创建

        Result = OBJ_NEW(‘IDLffShape’ [, Filename] [, PROPERTY=value])

        Result = Obj->[IDLffShape::]Init([, Filename] [, PROPERTY=value])     (In a lifecycle method only.)

三、属性

        此类的对象具有以下属性。  有关各个属性的详细信息,请参阅 IDLffShape 属性。

3.1 ATTRIBUTE_INFO

       包含每个属性的属性信息的结构数组。  属性信息结构具有以下字段

Field

描述

NAME

包含属性名称的字符串

TYPE

属性的 IDL 类型代码

WIDTH

属性的宽度

PRECISION

属性精度

必须打开该文件才能获取此信息。

3.2 ATTRIBUTE_NAMES

        一个字符串数组,其中包含 Shapefile 对象中每个属性的名称。

3.3 DBF_ONLY

        一个非零正整数值,指示 shapefile 的基础 dBASE 表 (.dbf) 组件是否打开,而所有其他实体相关文件保持关闭。  此属性接受以下两个值:

        -> 等于1 - 打开一个现存的 .dbf 文件,

        -> 大于1 - 创建一个新的 .dbf 文件

        注意:需要 UPDATE 关键字才能打开 .dbf 文件进行更新。

3.4 ENTITY_TYPE

      如果检索此属性,则其值为一个整数,表示 Shapefile 对象中包含的实体的类型代码。  如果值未知,则此方法返回 -1。  有关实体类型代码的更多信息,请参阅实体。

        如果设置此属性,则其值为表示新 Shapefile 的实体类型的整数。  仅在创建新 Shapefile 时使用此设置。  有关实体类型的更多信息,请参阅实体。

3.5 FILENAME

        一个字符串,表示当前 Shapefile 对象中 Shapefile 的完全限定路径名。

        注意:FILENAME 只能通过 IDLffShape::Init 方法的参数来设置。

3.6 IS_OPEN

        一个整数值,表示有关 Shapefile 状态的信息。  可以返回以下值:

0

文件打开失败

1

 以只读的方式打开

3

以更新的模式打开

3.7 N_ATTRIBUTES

        一个长字整数,表示与 Shapefile 对象关联的属性数。  如果属性数未知,则此属性返回 0。

3.8 N_ENTITIES

一个长字整数,表示 Shapefile 对象中包含的实体数。  如果实体数量未知,则此属性返回 0。

 

3.9 N_RECORDS

        一个长字整数,表示 Shapefile 的 dBASE 表 (.dbf) 组件中的记录数。  在正常操作模式下,这个过程是通过获取实体的数量来完成的。  但是,在 DBF_ONLY 模式下,不存在实体文件。

3.10 UPDATE

        一个布尔值,指示文件是否打开以进行写入。  如果此属性设置为 true,则打开文件进行写入。  默认为只读

 四、方法:

4.1 IDLffShape::AddAttribute

IDLffShape::AddAttribute 方法将属性定义添加到 Shapefile。  在将实际属性数据添加到文件之前,需要添加属性定义。  有关属性的更多信息,请参阅属性。

注意:您只能为在任何属性中没有任何现有值的 Shapefile 定义新属性。

4.1.1 语法:

Obj->[IDLffShape::]AddAttribute, Name, Type, Width [, PRECISION=integer]

4.1.2 参数

Name

        设置为包含属性名称的字符串。  名称值限制为 11 个字符。  超过 11 个字符的参数将被截断。

Type

        设置为与将存储在属性中的数据类型相对应的 IDL 类型代码。  有效的类型是:

代码

类型

3

 Longword Integer

5

Double-precision

floating point

7

String

Width

为属性的数据值设置为用户定义的字段宽度。  下表描述了取决于定义的类型的可能值:

Longword Integer

确定可以表示的最大数字的位数。  大于此值的数字将被截断。

Double-precision

floating point

确定总位数,包括小数点和小数点后的位数(请参阅 PRECISION 关键字)。 

无法用此宽度表示的数字将被截断。

String

确定可以存储的字符串的最大长度。  超过此长度的字符串将被截断。

4.1.3 关键字

PRECISION

        将此关键字设置为要包含在小数点后的位数。  默认值为 8。此关键字仅对定义为双精度浮点的字段有效。

4.1.4 例子

        对于 AddAttribute 的示例,查阅:Creating New Shapefiles.

        注意:如果 citys.shp 已在文件中定义的任何实体的属性中包含数据,则此操作将失败。

4.2 IDLffShape::Cleanup

        IDLffShape::Cleanup 过程方法对 Shapefile 对象执行所有清理。  如果对象正在访问的 Shapefile 已打开并且文件已被修改,则如果满足以下条件之一,则将新信息写入文件:

  • 使用 IDLffShape::Open 方法的 UPDATE 关键字以写入权限打开文件
  • 它是一个新创建的文件,以前没有写过。

4.2.1 语法

        Obj->Cleanup

        Obj->[IDLffShape::]Cleanup

        OBJ_DESTROY, Obj

4.3 IDLffShape::Close

        IDLffShape::Close 过程方法关闭一个 Shapefile。  如果文件被修改过,如果不满足以下两个条件,它也会被写入磁盘:

  • 使用 IDLffShape::Open 方法的 UPDATE 关键字以写入权限打开文件
  • 它是一个新创建的文件,以前没有写过。

4.3.1 语法

        Obj->[IDLffShape::]Close

4.4 IDLffShape::DestroyEntity

        IDLffShape::DestroyEntity 过程方法释放与实体结构相关的内存。  有关实体结构的更多信息,请参阅Entities

        注意:如果启用了 Automatic Garbage Collection,则无需使用此方法释放内存。  如果您需要在 shapefile 对象被销毁之前释放系统资源,您可以选择手动销毁您的实体引用。

4.4.1 语法

        Obj->[IDLffShape::]DestroyEntity, Entity

4.4.2 参数

Entity

        要销毁的实体的标量或数组。

4.4.3 例子

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

PRO Ex_shapefile; 打开示例目录中的 states Shapefile。myshape=Obj_new('IDLffShape', Filepath('states.shp', $SUBDIR=['examples', 'data'])); 获取实体的数量,以便我们可以解析它们。myshape->Getproperty, N_ENTITIES=num_ent; 阅读所有entities(实体)。FOR x=1, (num_ent-1) DO BEGIN;读取 entity中的 xent = myshape->Getentity(x);清除指针myshape->Destroyentity, entENDFOR; 关闭 Shapefile.Obj_destroy, myshape
END

4.5 IDLffShape::GetAttributes

IDLffShape::GetAttributes 函数方法从 Shapefile 中检索您指定的实体的属性。

4.5.1 语法

        Result = Obj->[IDLffShape::]GetAttributes([Index] [, /ALL] [, /ATTRIBUTE_STRUCTURE] )

返回值

        返回一个匿名结构数组。  有关结构的更多信息,请参阅 Attributes.。

4.5.2 参数

Index

一个标量或 long 数组,指定要检索其属性的实体,其中 0 是 Shapefile 中的第一个实体。

注意:如果未指定 Index 且未设置 ALL 关键字,则返回第一个实体 (0) 的属性。

4.5.3 关键字

ALL

        设置此关键字以检索 Shapefile 中所有实体的属性。  如果设置此关键字,则不需要 Index 参数。

ATTRIBUTE_STRUCTURE

        设置此关键字以返回一个空属性结构,然后可以将其与 IDLffShape::SetAttributes 方法一起使用以将属性添加到 Shapefile。

-> 在第一个示例中,我们检索与位置 0 处的实体(文件中的第一个实体)关联的属性:

        attr = myShape->getAttributes( 0)

->在下一个示例中,我们检索与实体 10 到 20 关联的属性:

        attr = myShape->getAttributes( 10+indgen(11) )

->在下一个示例中,我们检索实体 1、4、9 和 70 的属性:

        attr = myShape->getAttributes( [1, 4, 9, 70] )

->在下一个示例中,我们检索 Shapefile 的所有属性:

        attr = myShape->getAttributes( /ALL )

4.6 IDLffShape::GetEntity

        IDLffShape::GetEntity 函数方法返回您从 Shapefile 指定的实体。

4.6.1 语法

        Result = Obj->[IDLffShape::]GetEntity([Index] [, /ALL] [, /ATTRIBUTES])

返回值

        返回类型为 {IDL_SHAPE_ENTITY} 的结构数组。  有关结构的更多信息,请参阅 Entities。

        注意:由于不能在 Shapefile 中修改实体,因此每次使用 IDLffShape::GetEntity 方法时都会直接从 Shapefile 中读取实体,即使您已经读取了该实体。  如果您修改此方法返回的给定实体的结构数组,然后在同一实体上使用 IDLffShape::GetEntity,则不会返回修改后的数据,而是返回实际写入文件中的数据。

4.6.2 参数

Index

        一个标量或长数组,指定要检索的实体,其中 0 是 Shapefile 中的第一个实体。  如果设置了 ALL 关键字,则不需要此参数。  如果未指定任何实体且未设置 ALL 关键字,则返回第一个实体 (0)。

4.6.3 关键字

ALL

        设置此关键字以从 Shapefile 中检索所有实体。  如果设置了此关键字,则不需要 Index 参数。

ATTRIBUTES

        设置此关键字以返回实体结构中的属性。  如果未设置,实体结构中的 ATTRIBUTES 标记将为空 IDL 指针。

4.6.4 例子

        在以下示例中,将读取 states.shp Shapefile 中的所有实体:

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 xent = myshape->Getentity(x); 清理指针myshape->Destroyentity, entENDFOR; 关闭 Shapefile.Obj_destroy, myshape
END

4.7 IDLffShape::GetProperty

        IDLffShape::GetProperty 过程方法返回与 Shapefile 对象关联的属性值。  这些属性是:

  • 实体数量
  • 实体的类型
  • 与每个实体关联的属性数
  • 属性的名称
  • 属性的名称、类型、宽度和精度
  • Shapefile 的状态
  • Shapefile 对象的文件名

4.7.1 语法

        Obj->[IDLffShape::]GetProperty [, PROPERTY=variable]

4.7.2 关键字

        IDLffShape 属性下列出的任何属性,在属性表的“获取”列中包含单词“是”,都可以使用此方法检索。  要检索属性的值,请将属性名称指定为关键字集,该关键字集等于将包含属性值的命名变量。

4.7.3 例子

        在以下示例中,将返回实体的数量和实体类型:

PRO entity_info; 打开示例目录中的 states Shapefile.myshape=Obj_new('IDLffShape', Filepath('states.shp', $SUBDIR=['examples', 'data']));获取实体数量和实体类型myshape->Getproperty, N_ENTITIES=num_ent, $ENTITY_TYPE=ent_type; 打印实体的数量和类型Print, 'Number of Entities: ', num_entPrint, 'Entity Type: ', ent_type; 关闭 Shapefile.Obj_destroy, myshape
END

运行结果为:

        Number of Entities:       51

        Entity Type:               5

在下一个示例中,将返回属性 1 的定义:

PRO attribute_info; 打开示例目录中的 states Shapefilemyshape=Obj_new('IDLffShape', Filepath('states.shp', $SUBDIR=['examples', 'data'])); 获取所有属性的信息.myshape->Getproperty, ATTRIBUTE_INFO=attr_info; 打印属性信息.Print, 'Attribute Number: ', '1'Print, 'Attribute Name: ', attr_info[1].NAMEPrint, 'Attribute Type: ', attr_info[1].TYPEPrint, 'Attribute Width: ', attr_info[1].WIDTHPrint, 'Attribute Precision: ', attr_info[1].PRECISION; 关闭 Shapefile.Obj_destroy, myshape
END

运行结果

        Attribute Number:           1

        Attribute Name:    STATE_NAME

        Attribute Type:             7

        Attribute Width:           25

        Attribute Precision:        0

4.8 IDLffShape::Init

        IDLffShape::Init 函数方法初始化或构造一个 Shapefile 对象。

4.8.1 语法

        Result = OBJ_NEW(‘IDLffShape’ [, Filename] [, PROPERTY=value])

        Result = Obj->[IDLffShape::]Init([, Filename] [, PROPERTY=value])     (In a lifecycle method only.)

返回值

        当间接调用此方法时,作为调用 OBJ_NEW 函数的一部分,返回值是对新创建对象的对象引用。

        在子类 Init 方法中直接调用时,如果初始化成功则返回值为 1,否则返回值为 0。

4.8.2 参数

Filename

        包含要打开的 Shapefile (.shp) 的完整路径和文件名的标量字符串。  如果此文件存在,则将其打开。  如果文件不存在,则构造一个新的 Shapefile 对象。  指定此参数时,您不需要使用 IDLffShape::Open 打开现有文件。

        注意:除非设置了 UPDATE 关键字,否则 .shp、.shx 和 .dbx 文件必须存在于同一目录中,您才能打开和访问该文件。

        注意:Filename 参数指定的值用于初始化 IDLffShape 对象的 FILENAME 属性的值

4.8.3 关键字

        IDLffShape 属性下列出的任何属性,在属性表的“Init”列中包含单词“Yes”,都可以在对象创建期间使用此方法进行初始化。  要初始化属性的值,请将属性名称指定为关键字集,该关键字集等于相应的属性值。

4.8.4 例子

        在下面的示例中,我们创建一个新的 Shapefile 对象并打开 examples/data/states.shp 文件:

myshape=OBJ_NEW('IDLffShape', FILEPATH('states.shp', $SUBDIR=['examples', 'data']))

4.9 IDLffShape::Open

        IDLffShape::Open 函数方法打开一个指定的 Shapefile。

4.9.1 语法

        Result = Obj->[IDLffShape::]Open( ‘Filename’ [, /DBF_ONLY] [, ENTITY_TYPE=’value’] [, /UPDATE] )

返回值

        如果可以成功读取文件,则返回 1。  如果无法打开文件,则返回 0。

4.9.2 参数

Filename

        包含要打开的 Shapefile (.shp) 的完整路径和文件名的标量字符串。  请注意,除非设置了 UPDATE 关键字,否则 .shp、.shx 和 .dbx 文件必须存在于同一目录中,您才能打开和访问该文件。

4.9.3 关键字

DBF_ONLY

        如果此关键字设置为正值,则仅打开 shapefile 的基础 dBASE 表 (.dbf) 组件。  所有与实体相关的文件都处于关闭状态。  接受此关键字的两个值:1 - 打开现有的 .dbf 文件,> 1 - 创建新的 .dbf 文件

        需要 UPDATE 关键字才能打开 .dbf 文件进行更新。

ENTITY_TYPE

        将此关键字设置为新 Shapefile 的实体类型。  仅在创建新 Shapefile 时使用此关键字。  有关实体类型的更多信息,请参阅Entities。

UPDATE

        设置此关键字以打开文件以进行写入。  默认为只读。

4.9.4 例子

        在以下示例中,打开文件 examples/data/states.shp 进行读写:

status = myShape->Open(FILEPATH('states.shp', $SUBDIR=['examples', 'data']), /UPDATE)

4.10 IDLffShape::PutEntity

        IDLffShape::PutEntity 过程方法将实体插入到 Shapefile 对象中。  实体必须具有适当的结构。  有关结构的更多信息,请参阅实体。

        注意:新实体的形状类型必须与为 Shapefile 定义的形状类型相同。  如果尚未使用 IDLffShape::Open 或 IDLffShape::Init 方法的 ENTITY_TYPE 关键字为 Shapefile 定义形状类型,则插入到 Shapefile 中的第一个实体定义类型。

        注意:只能将新实体插入到 Shapefile 中。  无法更新现有实体。

4.10.1 语法

        Obj->[IDLffShape::]PutEntity, Data

4.10.2 参数

Data

        标量或实体结构数组。

4.10.3 例子

        在下面的示例中,我们创建一个新的 shapefile,定义一个新实体,然后使用 PutEntity 方法将其插入到新文件中:

PRO ex_shapefile_putentity; 创建新的 shapefile 并将实体类型定义为 Point。mynewshape=Obj_new('IDLffShape', Dialog_pickfile(FILE='shape_entity.shp', /WRITE), $/UPDATE, ENTITY_TYPE=1); 为新实体创建结构。entNew = {IDL_SHAPE_ENTITY}; 定义新实体的值entNew.SHAPE_TYPE = 1entNew.BOUNDS[0] = -104.87270entNew.BOUNDS[1] = 39.768040entNew.BOUNDS[2] = 0.00000000entNew.BOUNDS[3] = 0.00000000entNew.BOUNDS[4] = -104.87270entNew.BOUNDS[5] = 39.768040entNew.BOUNDS[6] = 0.00000000entNew.BOUNDS[7] = 0.00000000; 将新实体添加到新 shapefile。mynewshape->Putentity, entNew; 关闭 shapefilemynewshape->Close; 销毁 shapefile 对象Obj_destroy, mynewshape
END

4.11 IDLffShape::SetAttributes

        IDLffShape::SetAttributes 过程方法设置 Shapefile 对象中指定实体的属性。

4.11.1 语法

        Obj->[IDLffShape::]SetAttributes, Index, Attribute_Num, Value

        Obj->[IDLffShape::]SetAttributes, Index, Attribute_Num, Value

4.11.2 参数

Attribute_Num

        正在设置其值的属性的属性结构中的字段编号。  该值从 0 开始。

Attributes

        属性结构,其字段与属性表中的字段匹配。  如果 Attributes 是一个数组,则设置 Index 中指定的实体,直到 Attributes 数组的大小。  使用此功能,可以为 Shapefile 设置一组实体的所有属性值。

        此 Attribute 结构的类型必须与内部为 Attribute 表生成的类型相匹配。  要获取此结构的副本,请获取实体的属性集或使用 IDLffShape::GetProperty 方法的 ATTRIBUTE_STRUCTURE 关键字获取定义。

Index

        一个标量或整数数组,指定要在其中设置属性的实体。  如果 Index 是标量,则它指定开始写入由 Value 参数给出的属性的起点。  如果 Index 是一个元素数与 Value 相同的数组,则 Index 指定要写入的属性的索引。  写入新属性时,必须按顺序写入属性,从索引 0 开始,没有间隙。  当覆盖现有属性时,可以以任何顺序写入属性。

Value

        如果存在 Attribute_Num,则 Value 是属性内字段的值(或值数组)。  如果该值的类型不正确,则尝试进行类型转换。

        如果 Attribute_Num 不存在,则 Value 是一个 Attribute 结构(或结构数组),其字段与属性表中的字段匹配。  此 Attribute 结构的类型必须与内部为 Attribute 表生成的类型相匹配。  要获取此结构的副本,请获取实体的属性集或使用 IDLffShape::GetProperty 方法的 ATTRIBUTE_STRUCTURE 关键字获取定义。  如果 Value 是一个数组,则设置 Index 中指定的属性。  使用此功能,可以为 Shapefile 设置一组实体的所有属性值。

4.11.3 例子

        有关 SetAttributes 的示例,请参阅 Creating New Shapefiles。  在此示例中,您将创建一个新 shapefile,为新文件定义属性,定义一个新实体,定义一些属性,插入新实体,然后使用 SetAttributes 方法将属性插入到新文件中。

五、ESRI Shapefiles文件概述

        ESRI Shapefile 存储数据集中空间特征的非拓扑几何和属性信息。

        Shapefile 由一个主文件 (.shp)、一个索引文件 (.shx) 和一个 dBASE 表 (.dbf) 组成。  例如,Shapefile“状态”将具有以下文件:

  • states.shp
  • states.shx
  • states.dbf

Shapefile 的命名约定:

        组成 ESRI Shapefile 的所有文件都必须遵守 8.3 文件名约定并且必须小写。  主文件、索引文件和 dBASE 文件都必须具有相同的前缀。  前缀必须以字母数字字符开头,并且可以包含任何字母数字、下划线 (_) 或连字符 (-)。  主文件后缀必须使用 .shp 扩展名,索引文件使用 .shx 扩展名,dBASE 表使用 .dbf 扩展名。

Shapefile 的主要元素:

        Shapefile 由以下元素组成,您可以通过 IDLffShape 类访问这些元素:

  • 实体Entities
  • 属性Attributes

        特征的几何图形存储为包含一组矢量坐标(称为“实体”)的形状。  Shapefile 中的(非空)实体必须全部属于同一类型。  以下是 Shapefile 中实体的可能类型:

Shape 类型

类型编码

Point

1

PolyLine

3

Polygon

5

MultiPoint

8

PointZ

11

PolyLineZ

13

PolygonZ

15

MultiPointZ

28

PointM

21

PolyLineM

23

PolygonM

25

MultiPointM

28

MultiPatch

31

        使用 IDLffShape::GetEntity 方法检索实体时,将返回 IDL 结构。  该结构具有以下字段:

Filed

数据类型

描述

SHAPE_TYPE

Long integer

实体类型。

ISHAPE

Long integer

一个只读字段,包含形状对象中特定实体的索引。 

此值在写入形状文件时自动设置。

BOUNDS

Eight-element, double-precision array

指定实体范围限制的边界框。  这个八元素数组包含以下信息:

Index 0 - X 最小值

Index 1 - Y 最小值

Index 2 - Z 最小值(如果 Z 受类型支持)

Index 3 - 测量最小值(如果实体类型支持度量)

Index 4 - X 最大值

Index 5 - Y 最大值

Index 6 - Z 最大值(如果实体类型支持 Z)

Index 7 - 度量最大值(如果实体类型支持度量)

如果实体是点类型,则bounds数组中包含的值也是实体的值。

N_VERTICES

Long integer

实体中的顶点数。  如果该值为 1 且实体为 POINT 类型(

POINT、POINTM、POINTZ),则顶点指针将设置为 NULL,

实体值将保留在 BOUNDS 字段中。

VERTICES

Pointer to Vertices array

包含实体顶点的 IDL 指针。  此指针包含具有以下格式之一的

双精度数组:

[2, N] - 如果 Z 数据不存在

[3, N] - 如果 Z 数据存在

其中 N 是顶点数。  这些数组格式可以传递给 IDL Object

Graphics 的多边形和折线对象。

如果实体是点类型,则该指针将为空,其值保存在

BOUNDS 数组中。

MEASURE

Pointer to Measure array

如果实体有一个度量值(这取决于实体类型),

这个 IDL 指针将包含一个度量值的向量数组。 

这个向量的长度是 N_VERTICES。

如果实体是 POINTM 类型,则该指针将为空,

其值包含在 BOUNDS 数组中。

N_PARTS

Long integer

如果实体的值被分成几部分,则在部分数组中枚举断点。 

该字段列出了该实体中的部件数。  如果此值为 0,

则实体为一部分,并且 PARTS 指针将为 NULL

PARTS

Pointer to Parts array

一个 IDL 指针,包含指向顶点/度量数组的索引数组。 

这些值代表实体每个部分的开始。  每个实体部分的索引范围

由以下定义:

开始 = Parts[I]

End = Parts[I+1]-1 或数组的结尾

PART_TYPES

Pointer to part types

此 IDL 指针仅对 MultiPatch 类型的实体有效,并定义特定部分

的类型。  如果实体类型不是 MultiPatch,则假定零件类型

为 RING 类型 (SHPP_RING)。

如果实体不是 MultiPatch 类型,则此指针为 NULL。

ATTRIBUTES

Pointer to Attribute array

如果请求了实体的属性,则该字段包含一个 IDL 指针,

该指针包含该实体的属性结构。  有关此结构的更多信息,

请参阅Attribute 。

六、属性

      Shapefile 提供了关联描述文件中包含的每个实体(几何元素)的信息的能力。  这种描述性信息称为属性,由文件中包含的每个几何实体的一组命名数据元素组成。  Shapefile 中包含的每个实体的可用属性集都是相同的,每个实体都有自己的属性值集。

         一个属性由两个组件组成:        

  • 名字
  • 数据值

        名称由一个 11 个字符的字符串组成,用于标识数据值。  数据值不限于任何特定格式。

        使用形状对象可以不同地访问形成属性的两个组件。  要获取特定文件的属性名称,请使用 IDLffShape::GetProperty 方法的 ATTRIBUTE_NAMES 关键字。  这将返回一个字符串数组,其中包含为文件定义的属性的名称。

        要获取实体的属性值,调用 IDLffShape::GetAttributes 方法或设置 IDLffShape::GetEntity 方法的 ATTRIBUTES 关键字。  在每种情况下,指定实体的属性值都作为匿名 IDL 结构返回。  返回结构中字段的数字顺序映射到为文件定义的属性的数字顺序。  返回结构的实际格式为:

  • ATTRIBUTE_0 : VALUE,
  • ATTRIBUTE_1 : VALUE,
  • ATTRIBUTE_2 : VALUE,
  • ...
  • ATTRIBUTE_<N-1> : VALUE

七、例子

        有关以下示例,请参阅以下部分

  • Accessing Shapefiles
  • Creating New Shapefiles
  • Updating Existing Shapefiles

7.1 读取Shapefiles数据

        以下示例显示了如何访问 Shapefile 中的数据。  此示例设置地图以显示 Shapefile 的各个部分,打开 Shapefile,从 Shapefile 中读取实体,然后仅绘制科罗拉多州:

PRO ex_shapefileDevice, RETAIN=2, DECOMPOSED=0!P.background = 255; 定义颜色表r = Bytarr(256) & g = Bytarr(256) & b = Bytarr(256)r[0] = 0 & g[0] = 0 & b[0] = 0 ;定义黑色r[1] = 100 & g[1] = 100 & b[1] = 255 ;定义蓝色r[2] = 0 & g[2] = 255 & b[2] = 0 ;Definition of greenr[3] = 255 & g[3] = 255 & b[3] = 0 ;Definition of yellowr[255] = 255 & g[255] = 255 & b[255] = 255 ;Definition of whiteTvlct, r, g, bblack = 0 & blue = 1 & green = 2 & yellow = 3 & white = 255; 设置地图以在其上绘制 ShapefileMap_set, /orthographic, 45, -120, /ISOTROPIC, $/HORIZON, E_HORIZON={fill:1, color:blue}, $/GRID, COLOR=black, /NOBORDER; 填充边界Map_continents, /FILL_CONTINENTS, COLOR=green; 重叠海岸线数据:Map_continents, /COASTS, COLOR=black; Show national borders:Map_continents, /COUNTRIES, COLOR=black; 在示例目录中打开状态 Shapefilemyshape = Obj_new('IDLffShape', Filepath('states.shp', $SUBDIR=['examples', 'data'])); 获取实体的数量,以便我们可以解析它们myshape->Getproperty, N_ENTITIES=num_ent; 解析实体并仅绘制科罗拉多州FOR x=0L, (num_ent-1) DO BEGIN; 获取实体 x 的属性attr = myshape->Getattributes(x); 查看“Colorado”是否在实体 x 的属性的 ATTRIBUTE_1 中IF attr.attribute_1 EQ 'Colorado' THEN BEGIN; 获取实体ent = myshape->Getentity(x); 绘图实体Polyfill, (*ent.vertices)[0, *], (*ent.vertices)[1, *], $COLOR=yellow; 清理指针myshape->Destroyentity, entENDIFENDFOR; 关闭形状文件Obj_destroy, myshape
END

7.2 新建Shapefile文件

        要创建 Shapefile,您需要创建一个新的 Shapefile 对象,定义实体和属性定义,然后将数据添加到文件中。  例如,以下程序创建一个新的 Shapefile (cities.shp),将实体类型定义为“Point”,定义 2 个属性(CITY_NAME 和 STATE_NAME),然后将实体添加到新文件中:

PRO ex_shapefile_newfile; 创建新的 shapefile 并将实体类型定义为 Pointmynewshape = Obj_new('IDLffShape', Filepath('cities.shp', $SUBDIR=['examples', 'data']), /UPDATE, ENTITY_TYPE=1); 为新的 Shapefile 设置属性定义mynewshape->Addattribute, 'CITY_NAME', 7, 25, PRECISION=0mynewshape->Addattribute, 'STAT_NAME', 7, 25, PRECISION=0; 为新实体创建结构entNew = {IDL_SHAPE_ENTITY}; 定义新实体的值entNew.SHAPE_TYPE = 1entNew.BOUNDS[0] = -104.87270entNew.BOUNDS[1] = 39.768040entNew.BOUNDS[2] = 0.00000000entNew.BOUNDS[3] = 0.00000000entNew.BOUNDS[4] = -104.87270entNew.BOUNDS[5] = 39.768040entNew.BOUNDS[6] = 0.00000000entNew.BOUNDS[7] = 0.00000000entNew.N_VERTICES = 1 ; take out of example, need as workaround; 为新属性创建结构attrNew = mynewshape->Getattributes(/ATTRIBUTE_STRUCTURE); 定义新属性的值attrNew.ATTRIBUTE_0 = 'Denver'attrNew.ATTRIBUTE_1 = 'Colorado'; 将新实体添加到新 shapefilemynewshape->Putentity, entNew; 请注意,因为这是一个新的 shapefile,所以新实体的索引为零。entity_index = 0; 将 Colorado 属性添加到新的 shapefile。mynewshape->Setattributes, entity_index, attrNew; 关闭形状文件Obj_destroy, mynewshape
END

7.3 更新现有的 Shapefile

        您可以使用以下内容修改现有的 Shapefile:

  • 添加新实体
  • 添加新属性(仅适用于在任何属性中没有任何现有值的 Shapefile)
  • 修改现有属性

        注意:您不能修改现有实体。

        例如,以下程序将 Boulder 市的实体和属性添加到前面示例中创建的 citys.shp 文件中:

PRO ex_shapefile_modify; 打开 City.shp 文件myshape = Obj_new('IDLffShape', Filepath('cities.shp', $SUBDIR=['examples', 'data']), /UPDATE); 为新实体创建结构entNew = {IDL_SHAPE_ENTITY}; 定义新实体的值entNew.SHAPE_TYPE = 1entNew.ISHAPE = 200entNew.BOUNDS[0] = -105.25100entNew.BOUNDS[1] = 40.026878entNew.BOUNDS[2] = 0.00000000entNew.BOUNDS[3] = 0.00000000entNew.BOUNDS[4] = -105.25100entNew.BOUNDS[5] = 40.026878entNew.BOUNDS[6] = 0.00000000entNew.BOUNDS[7] = 0.00000000entNew.N_VERTICES = 1 ; 举个例子,需要作为解决方法; 创建新属性创建结构attrNew = myshape->Getattributes(/ATTRIBUTE_STRUCTURE); 定义新属性的值attrNew.ATTRIBUTE_0 = 'Boulder'attrNew.ATTRIBUTE_1 = 'Colorado'; 将新实体添加到新 shapefilemyshape->Putentity, entNew; 确定新实体的从零开始的索引myshape->Getproperty, N_ENTITIES=num_entitiesentity_index = num_entities-1; 将 Colorado 属性添加到新的 shapefilemyshape->Setattributes, entity_index, attrNew; 关闭形状文件Obj_destroy, myshape
END

7.4 绘制更新的 Shapefile

        以下程序绘制了在前面的示例中创建和更新的 city.shp 文件:

PRO plot_citiesDevice, RETAIN=2, DECOMPOSED=0!p.BACKGROUND = 255; 定义颜色表r=Bytarr(256) & g = Bytarr(256) & b = Bytarr(256)r[0] = 0 & g[0] = 0 & b[0]=0 ; 定义黑色r[1] = 100 & g[1] = 100 & b[1] = 255 ; 定义蓝色r[2] = 0 & g[2] = 255 & b[2] = 0 ; 定义绿色r[3] = 255 & g[3] = 255 & b[3] = 0 ;定义黄色r[255] = 255 & g[255] = 255 & b[255] = 255 ; 定义白色Tvlct, r, g, bblack = 0 & blue = 1 & green = 2 & yellow = 3 & white = 255; 设置地图以在其上绘制 ShapefileMap_set, /ORTHO, 39, -104, SCALE=9e6, /ISOTROPIC, $/HORIZON, E_HORIZON={FILL:1, COLOR:green}, COLOR=yellow; 显示状态边界:Map_continents, /USA, COLOR=black; 在示例目录中打开状态 Shapefilemyshape = Obj_new('IDLffShape', Filepath('states.shp', $SUBDIR=['examples', 'data'])); 获取实体的数量,以便我们可以解析它们myshape->Getproperty, N_ENTITIES=num_ent; 解析实体并仅绘制科罗拉多州FOR x=1, (num_ent-1) DO BEGIN; Get the Attributes for entity xattr = myshape->Getattributes(x); 查看“Colorado”是否在实体 x 的属性的 ATTRIBUTE_1 中IF attr.ATTRIBUTE_1 EQ 'Colorado' THEN BEGIN; 获取实体ent = myshape->Getentity(x); 绘图实体Polyfill, (*ent.VERTICES)[0, *], (*ent.VERTICES)[1, *], $COLOR=yellow; 清理指针myshape->Destroyentity, entENDIFENDFOR; 关闭状态 ShapefileObj_destroy, myshape; 打开cities.shpmyshape = Obj_new('IDLffShape', Filepath('cities.shp', $SUBDIR=['examples', 'data'])); 获取实体的数量,以便我们可以解析它们myshape->Getproperty, N_ENTITIES=num_ent; 在科罗拉多州地图上绘制城市FOR x=0, (num_ent-1) DO BEGIN; 获取实体ent = myshape->Getentity(x); 获取城市属性attr = myshape->Getattributes(x); 绘制带有符号的城市以及城市名称Plots, ent.BOUNDS[0], ent.BOUNDS[1], PSYM=5, COLOR=blackXyouts, ent.BOUNDS[0] + 0.3, ent.BOUNDS[1], $attr.Attribute_0, color=black; 清理指针myshape->Destroyentity, entENDFOR; 关闭形状文件Obj_destroy, myshape
END

        翻译不当之处,敬请斧正

 路漫漫其修遠兮,吾將上下而求索

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

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

相关文章

tablueau地图标记圆形_30天30张中国风地图,从青绿山水到秦砖汉瓦

本文来自#30天制图挑战#的GISer November_阿瑜瑜瑜瑜&#xff0c;完成了30幅中国风专辑地图&#xff0c;唯美又有韵味&#xff0c;十分赏心悦目&#xff0c;简直把中国风玩出了花~接下来&#xff0c;快来跟着小编一起细品30幅中国风地图吧~~~ 01day 1千里江山图《千里江山图》是…

语言省考安徽考区_安徽省中小学新任教师公开招聘统一笔试 中学信息技术学科考试大纲...

一、考试性质安徽省中小学新任教师公开招聘考试为全省统一组织的公开性选拔考试&#xff0c;是落实“省考、县管、校用”教师管理体制的基础工作。其目的是吸引有志于从事基础教育事业的优秀人才到中小学任教&#xff0c;进一步规范中小学新任教师公开招聘工作&#xff0c;把好…

IDL学习:语法基础-指针、链表

本博客将介绍IDL语法基础中的指针、链表的创建及相关的用法。记录自己的学习整理理解 。 1. 指针 指针也就是内存地址&#xff0c;是用来存放内存地址的变量&#xff0c;指针可以理解为通讯地址&#xff0c;可以通过通讯地址查询具体的信息&#xff0c;而指针可以查询所指向的…

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

本博客将介绍IDL语法基础中的对象、哈希表的创建及相关的操作发法。哈希表、链表都可以看做对象&#xff0c;包含了add、reserve、Sort等方法。记录自己的学习整理理解 。 1. 对象 对象是数据&#xff08;属性&#xff09;和程序&#xff08;方法&#xff09;封装在一起的实体…

茶苑机器人怎么看出来_小儿脑瘫怎么看出来?出现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…

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;生命周期…

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

固态继电器简写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;目标在三年…

名图空间实测_骗子!20来万的大众SUV号称7.8秒破百,实测后我服了!

很多对汽车知识了解不深的消费者&#xff0c;大多是从别人口中去了解车型&#xff0c;而网络发达的现在充斥这大量的键盘侠&#xff0c;这些键盘侠很多都并没有接触过实车&#xff0c;仅仅是依靠网上的一些数据、等级、定位等等话术来显示自己的知识。 可是数字就不会骗人吗&am…

前端未死,顺势而生

随着人工智能和低代码的崛起&#xff0c;“前端已死”的声音逐渐兴起。前端已死&#xff1f;尊嘟假嘟&#xff1f;快来发表你的看法吧&#xff01; 一、“前端已死”因何而来&#xff1f; 在开始讨论之前&#xff0c;首先要明确什么是“前端”。 所谓前端&#xff0c;主要涉及…