目录
一、描述
二、创建
三、属性
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
翻译不当之处,敬请斧正!
路漫漫其修遠兮,吾將上下而求索