目录

一、描述

二、创建

三、属性

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

      翻译不当之处,敬请斧正

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

IDL学习(对象):IDLffShape相关推荐

  1. IDL学习记录和Java调用IDL方法

    IDL学习记录和Java调用IDL方法 2018年02月06日 08:32:02 回首1949 阅读数:385更多 个人分类: 随想 版权声明:乐呵乐呵得了 https://blog.csdn.net ...

  2. 操作对象_有进取心的机器人学习对象操作的基本原理

    麻省理工学院的研究人员编制了一个数据集,用来捕捉机器人系统在物理上推动数百个不同物体的详细行为.使用该数据集--这是同类中最大.最多样化的数据集--研究人员可以训练机器人"学习"对 ...

  3. 利用深度学习对象检测器从信息素陷阱图像中自动计数松球菌监测

    Simple Summary 松球菌(Matsucoccus thunbergianae)是一种对黑松造成广泛损害的森林害虫;因此,监测这种害虫是必要的,以尽量减少环境和经济损失的森林.然而,利用信息 ...

  4. IDL学习——处理自带经纬度文件的遥感影像,以哨兵5P数据为例

    IDL学习--处理自带经纬度文件的遥感影像,以哨兵5P数据为例 自带经纬度文件处理流程 1.寻找经纬度文件 2.构建GLT文件 3.使用GLT文件进行几何校正 4.批处理过程中遇到的问题 最近一直在做 ...

  5. 11.18随堂测验:学习对象

    n个信息学选手站在一排,每个选手的位置依次用1~n表示,第i个信息学选手的编程能力用一个整数Hi表示.每个信息学选手都希望找一个编程能力比自己高但又与自己编程能力最接近的选手学习,如果有多个符合条件的 ...

  6. 这个AI模型用最少的训练数据学习对象之间的关系

    https://www.toutiao.com/a6675553528800346628/ 上图:研究人员训练了一个混合AI模型来回答诸如"绿色立方体左边的红色物体与紫色哑光物具有相同形状吗 ...

  7. 【前沿】MIT搞了个进取型机器人!能研究学习对象操纵的基础

    来源:中国机器人网  前言:MIT的研究让数据有了机器人的方向 麻省理工学院的研究人员已经汇编了一个数据集,该数据集捕获了物理上推动数百个不同对象的机器人系统的详细行为.研究人员可以使用数据集(同类中 ...

  8. python学习 -对象把微信消息撤回后好慌,有了这个你就能看到撤回的消息了(超详解)

    目录 一.简介 普通人 python技术人员 1.准备环境 2.itchat介绍 3.itchat使用 4.pycharm解释器写入代码 一.简介 当我们与朋友,亲人,爱人聊天的时候,我估计每个人都经 ...

  9. IDL学习:语法基础-数组

    目录 1. 创建数组 1.1 直接创建 1. 2 利用函数创建 2. 数组索引 3. 数组操作 3.1 数组的信息 3.2 数组维度变化 3.3 数组的最大值和最小值 3.4 数组方差.均值.标准差. ...

最新文章

  1. python奇数和_请问python如何判断奇偶数?
  2. 唯品会订单分库分表的实践总结以及关键步骤--转
  3. mybatis 动态 SQL
  4. 刚体运动中变换矩阵的逆
  5. 作者:孙卫强(1976-),男,博士,上海交通大学教授、博士生导师,主要研究方向为大数据网络、信息通信网等。...
  6. 30秒清除你电脑中的垃圾
  7. 火山PC浏览文件和选择文件-通用对话框教程
  8. 南京全栈python培训
  9. 微信小程序--引用外部字体(云开发实现)
  10. 读懂React原理之调和与Fiber
  11. 路由、路由器、路由表介绍
  12. 经典文献阅读之--PON
  13. Spring Cloud Gateway(十):网关过滤器工厂 GatewayFilterFactory
  14. 计算机专业 公务员发展前景,未来5年,我国待遇“最好”的4个专业,前途不输公务员...
  15. Python 的Tkinter包系列之七:好例子补充
  16. FTP voyager使用配置参考
  17. 韩老师——数据结构与算法—单链表的生成及增删改查操作和常见关于链表的面试题java代码实现
  18. 未名企鹅极客 | 医药数据管理中的短文本高效匹配技术
  19. js中字符串和数组互相转换
  20. 建设符合CNAS认可规范的实验室LIMS系统

热门文章

  1. PPTP中的PAC 和PNS
  2. 美丽链——通过买套内衣读懂“区块链”?
  3. BZOJ4716 假摔
  4. 微信直播聊天室单房间1500万在线的消息架构演进之路
  5. 命令行卡到composer Updating dependencies (including require-dev)解决办法
  6. 【数据结构 C描述】有两个整数集合 A 和 B 分别用两个线性表 LA 和 LB 表示,求:一个新的集合A=A∪B,A仍然为纯集合,线性表采用链式存储方式。【单链表】
  7. Flutter布局中的松约束、紧约束
  8. 智能家居网络安全攻与防
  9. 使用mp3制作caf格式iOS音效
  10. <对职业的思考> 2020年终总结,自我提升永不止步