数据结构之Shapefile

数据结构之Shapefile

 

Shapefile 简述
Shapefile 将空间要素的非拓朴的几何结构和属性信息存储在数据集中。这种几何结构包含一系列的矢量坐标。 Shapefile 支持点状、线状和面状要素。其中面状要素是封闭的环路,并且相邻两个面状要素的公共边是重复画两次的,也就是分别存储于属于这个面状要素的几何结构中。
目前有四种方式获得 Shapefile 格式的数据:
(1)导出成 Shapefile 格式:用 ARC/INFO PC ARC/INFO SDE ArcView GIS 或者 BusinessMAP 软件从其他数据源导出成为 Shapefile 数据。
(2)数字化:用 ArcView GIS 的要素创建工具可以通过数字化直接创建 Shapefile 数据。
(3)程序:用 Avene ArcView GIS ), MapObjects ARC 宏语言( AML )( ARC/INFO )或简单宏语言( SML )( PC ARC/INFO )软件可以用程序创建 Shapefile 数据。
(4)通过创建程序直接写入 Shapefile 定义中。
 
Shapefile 的文件
一个 ESRI shapefile 数据包含一个主文件( .shp ),一个索引文件( .shx )和一个 dBASE .dbf )表。主文件是直接访问的,变长记录的文件,每一条记录都描述一个形状的一系列结点。在索引文件中,每一条记录包含主文件相应记录相对于主文件头的偏移量。 dBASE 表中每条记录表示一个要素的属性。这种几何结构和属性要素一对一的关系是通过记录号来控制的,表中的属性记录的顺序必须和主文件中的记录顺序相同。
Shapefile 存储整型和双精度型的数据。整型数据是有符号 32 位整型( 4 字节),双精度数据是有符号 64 IEEE 双精度浮点数据( 8 字节)。浮点数必须是数字的值,正无穷、负无穷和非数字( NaN )值都是不允许的。不过, shapefile 支持“无数据”的值,但是通常只能用于测量。任何小于 -10 38 浮点数都被认为是“无数据”。
一、主文件:
主文件( .shp )包含一个定长的文件头,之后就是变长的记录。每一条变长的记录都是由一个定长的记录头和变长的记录内容组成的。 Shapefile 的内容分为两类:一是数据相关,包括主文件记录内容和主文件头的数据描述范围(形状类型,最小矩形外框等);二是文件管理相关,包括文件和记录的长度和记录的偏移量等。主文件中用于记录数据相关的整型和双精度整型的字节序是 little endian PC Intel ),而用于文件管理相关的字节序则是 big endian Sun or Motorola )。
主文件头长度为 100 字节。下表列出头的字节位置、值、类型和字节序。
位置
字段
字段值
字段类型
字节序
Byte 0
文件代码
9994
整型
Big
4
未使用
0
整型
Big
20
未使用
0
整型
Big
24
文件长度
文件长度
整型
Big
28
版本
1000
整型
Little
32
几何形状
形状类型
整型
Little
36
边界框
X 最小值
双精度浮点型
Little
44
边界框
Y 最小值
双精度浮点型
Little
52
边界框
X 最大值
双精度浮点型
Little
60
边界框
Y 最大值
双精度浮点型
Little
68*
边界框
Z 最小值
双精度浮点型
Little
76*
边界框
Z 最大值
双精度浮点型
Little
84*
边界框
M 最小值
双精度浮点型
Little
92*
边界框
M 最小值
双精度浮点型
Little
注意:如果不是测量或者 Z 型,带 * 的部分就没有使用,其值为 0.0
   文件长度是文件的所有长度,用 16 位字表示(即包括 50 16 位字长度的文件头)。
几何类型的对应值为:无形状( 0 ),点( 1 ),线( 3 ),多边形( 5 ),多点( 8 ), Z 型点( 11 ), Z 型线( 13 ), Z 型多边形( 15 ), Z 型多点( 18 ), M 型点( 21 ), M 型线( 23 ), M 型多边形( 25 ), M 型多点( 28 ), MultiPatch 31 )。
每一条记录的头保存该条记录号和内容长度。记录头是定长的,占 8 字节。前 4 字节整型表示记录号,字节序是 Big ;后 4 字节整型表示记录内容长度,字节序是 Big 。内容长度只是内容的长度,用 16 位字表示。所以,每条记录的长度就是( 4 +内容长度)的 16 位字表示。
主文件的记录内容包含几何类型和几何数据。记录内容的长度取决于形状的部分和结点的数量,每一种几何类型有其相应的记录内容。
(1)无形状:通常无形状是用来占位的,在 shapefile 创建时设置为无形状,之后再
添加几何数据。
位置
字段
字段值
字段类型
个数
字节序
Byte 0
几何形状
0
整型
1
Little
(2) X Y 空间的点:包括一对双精度的 X Y 坐标值。
位置
字段
字段值
字段类型
个数
字节序
0
几何形状
1
整型
1
Little
4
X
X 坐标
双精度
1
Little
12
Y
Y 坐标
双精度
1
Little
(3) X Y 空间的多点:是一个点集。包括边界框、点个数和各个点的坐标。
位置
字段
字段值
字段类型
个数
字节序
0
几何形状
8
整型
1
Little
4
边界框
矩形顶点值
双精度
4
Little
36
点数
点的个数值
整型
1
Little
40
点集
各个点坐标
点型
点的个数
Little
(4) X Y 空间的线:是一个有序的顶点集合,包括一个或多个部分。部分是指连接两个或两个以上顶点的序列。部分可能会相连也可能不相连,可能相交也可能不相交。包括边界框、部分数、点数、每个部分第一个点的索引序号和各个点的坐标。
注意: X 44 4 ×部分的个数。
位置
字段
字段值
字段类型
个数
字节序
0
几何形状
3
整型
1
Little
4
边界框
矩形顶点值
双精度
4
Little
36
部分数
部分个数值
整型
1
Little
40
点数
点的个数值
整型
1
Little
44
部分集
每个部分第一个点在点集中的序号
整型
部分的个数
Little
X
点集
各个点坐标
点型
点的个数
Little
(5) X Y 空间的多边形:一个多边形包含一个或多个环。环是一个首尾连接的由 4 个或 4 个以上的点组成的一个封闭的,非自交的环路。一个多边形可能包含多重外环路。一个环的顶点顺序或方向显示了环是否位于多边形的内部。内部环是逆时针的,而简单的环状多边形通常是顺时针的。和线类似,多边形也包括边界框、部分数、点数、每个部分第一个点的索引序号和各个点的坐标,只是多边形中把环看做是部分。其内容表同线相同,略。
下面这个例子是一个包含一个内环的共有 8 个顶点的多边形。对于多边形类型有几点需要注意:
l         环是封闭的,也就是第一个和最后一个顶点必须是相同的。
l         每一个环的顶点组成的点的数组中,环的顺序是不重要的。
l         存储在 shapefile 中的多边形必须是“干净的”。这里干净的多边形是指:
Ø     不自交。就是说属于一个环的部分不能也属于另一个环。顶点可以共用,但环中的部分不能共用。
Ø     内部环是逆时针顺序的。“不干净的”多边形中内环的顺序也是顺时针的,会造成内部重叠。
以上图为例,该多边形部分个数为 2 ,顶点个数为 10
部分: 0 (第一部分由 v1 v2 v3 v4 v1 组成,第一个顶点在点集中的序号为 0 )   
    5 (第二部分由 v5 v8 v7 v6 v5 组成,第一个顶点在点集中的序号为 5 ,      
      且为内环,所以点的顺序是逆时针)
点集:  v1  v2  v3  v4  v1  v5  v8  v7  v6  v5
    (序号)           2                              9
    (其他的几何类型比较类似,就先略掉了)
 
二、索引文件:
索引文件包括 100 字节文件的头和定长为 8 字节的若干条记录。
索引文件头中的文件长度也是用 16 位字来计算的,为 50 16 位字和记录的条数乘以 4 倍的字数。
I 条索引记录存储其在主文件中的偏移量和主文件中该条记录的内容长度。
位置
字段
字段值
字段类型
字节序
0
偏移量
偏移量值
整型
Big
4
内容长度
内容长度值
整型
Big
注意:记录的偏移量是从主文件的开头到该条记录头的第一个字节的以 16 位字来计算的偏移量。所以,第一条记录的偏移量就是 50 ,因为主文件有 100 字节的头。
 
三、 dBASE 文件
     dBASE 文件包括要素的属性或者让其他表可以连接的属性关键值。它的格式是标准的
数据库文件格式。有 3 个要求:
l         文件名必须与主文件和索引文件的名字相同,文件名后缀必须是 .dbf
l         表中必须每一个要素都有一条记录。
l         记录的顺序必须和主文件中的要素记录的顺序相同。
l         dBASE 头中的年份值必须是 1900 年之后的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值