001集 您所在的位置:网站首页 dem转shp是什么意思 001集

001集

2024-06-19 22:13| 来源: 网络整理| 查看: 265

 一、什么是shapefile

Shapefile 是一种用于存储地理要素的几何位置和属性信息的非拓扑简单格式。shapefile 中的地理要素可通过点、线或面(区域)来表示。包含 shapefile 的工作空间还可以包含 dBASE 表,它们用于存储可连接到 shapefile 的要素的附加属性。

SHP格式优点

SHP格式的优点如下:

结构简单、易于存储:SHP文件采用二进制格式,结构简单,易于存储和传输。读取速度快:SHP文件的读取速度较快,因为其采用了二进制格式,不需要进行复杂的文本转换。通用性强:SHP文件是AutoCAD系列软件(如AutoCAD、ArcGIS等)的常用文件格式之一,可以在不同的GIS软件和平台之间进行转换和共享。支持空间信息表达:SHP文件可以存储矢量数据,能够表达更为精细的空间信息。

下面是 shapefile 如何在 ArcCatalog 中显示的示例。还能看到 dBASE 文件(它可能与 shapefile 相关联)。

默认情况下,具有文件扩展名 .txt、.asc、.csv 或 .tab 的所有文件将以文本文件的形式显示在 ArcCatalog 中。但在选项 对话框中,您可以选择其中哪些文件类型应显示为文本文件以及哪些不能显示在目录树中。当文本文件包含逗号分隔和制表符分隔的值时,您能够在 ArcCatalog 表视图中看到它们的内容并可将其连接到地理要素。在 ArcCatalog 中,可将文本文件删除,但其内容为只读。

可以在图层“属性”对话框的连接和关联选项卡中,将 dBASE 表或文本文件中存储的属性连接到 shapefile 中的要素。如果表包含描述空间位置的信息(例如,x,y,z 坐标或街道地址),则可以使用 ArcCatalog 中提供的工具创建用以表示这些位置的 shapefile。

旧版本:

除 shapefile 和表之外,ArcView GIS 用户还可以处理项目文件、图例文件和 Avenue 脚本。虽然无法直接在 ArcGIS Desktop 中处理这些项目,但可以通过 ArcCatalog 对其进行管理。要在 ArcCatalog 中查看这些项目,必须将其文件扩展名添加到文件类型列表中。例如,要查看 ArcView GIS 项目,请将文件扩展名 .apr 添加到列表中。

Shapefile 是一种用于存储地理要素的几何位置和属性信息的非拓扑简单格式。Shapefile 是可以在 ArcGIS 中使用和编辑的其中一种空间数据格式。

shapefile 格式在应存储在同一项目工作空间且使用特定文件扩展名的三个或更多文件中定义地理配准要素的几何和属性。这些文件是:

.shp - 用于存储要素几何的主文件;必需文件。.shx - 用于存储要素几何索引的索引文件;必需文件。.dbf - 用于存储要素属性信息的 dBASE 表;必需文件。

几何与属性是一对一关系,这种关系基于记录编号。dBASE 文件中的属性记录必须与主文件中的记录采用相同的顺序。

.sbn 和 .sbx - 用于存储要素空间索引的文件。.fbn 和 .fbx - 用于存储只读 shapefile 的要素空间索引的文件。.ain 和 .aih - 用于存储某个表中或专题属性表中活动字段属性索引的文件。.atx - .atx 文件针对在 ArcCatalog 中创建的各个 Shapefile 或 dBASE 属性索引而创建。ArcGIS 不使用 shapefile 和 dBASE 文件的 ArcView GIS 3.x 属性索引。已为 shapefile 和 dBASE 文件开发出新的属性索引建立模型。.ixs - 读/写 shapefile 的地理编码索引。.mxs - 读/写 shapefile(ODB 格式)的地理编码索引。.prj - 用于存储坐标系信息的文件;由 ArcGIS 使用。.xml - ArcGIS 的元数据 - 用于存储 shapefile 的相关信息。.cpg - 可选文件,指定用于标识要使用的字符集的代码页。

各文件必须具有相同的前缀,例如,roads.shp、roads.shx 和 roads.dbf。

在 ArcCatalog(或任何 ArcGIS 应用程序)中查看 Shapefile 时,将仅能看到一个代表 Shapefile 的文件;但可以使用 Windows 资源管理器查看与 Shapefile 相关联的所有文件。复制 Shapefile 时,建议在 ArcCatalog 中或者使用地理处理工具执行该操作。但如果在 ArcGIS 之外复制 shapefile,确保复制组成该 shapefile 的所有文件。

编辑 shapefile

可以在具有任意许可等级的 ArcGIS Desktop(ArcGIS Desktop Basic、ArcGIS Desktop Standard或 ArcGIS Desktop Advanced)中编辑 shapefile。但要想利用高级编辑功能(例如,拓扑),则需要将 shapefile 作为要素类导入到地理数据库中。

了解有关在 ArcGIS 中进行编辑的详细信息

将 shapefile 和 dBASE 表导入到地理数据库要素类和表

shapefile 中的所有要素类型都会在地理数据库中转换为几何类型。与 coverage 不同的是,shapefile 要素类型与地理数据库中存储的几何类型相类似,因此转换要更为简单。有关详细信息,请参阅导入时数据如何进行转换。

Shapefile 文件大小限制

组成 shapefile 的每个文件均被限制为 2 GB。因此,.dbf 文件不能超过 2 GB,.shp 文件也不能超过 2 GB(只有这两个文件的容量会很大)。所有组成文件的总大小可以超过 2 GB。

多年以来,Esri 研发了三种用于存储地理信息的主要数据格式:coverage、shapefile 以及地理数据库。其中,Shapefile 为存储地理及属性信息提供了一种简单的格式。正由于 shapefile 的简易性,使其成为一种非常流行的开放式数据转换格式。凭借其简易性,shapefile 似乎已成为人们的必然选择,然而,在它的使用中,仍然存在由地理数据库地址所决定的局限性。因此,使用 shapefile 时,应注意其局限性。概括如下:

地理数据不仅包含 shapefile 可存储的简单要素和属性信息。例如:在地理数据库中,可支持注记、属性关系、拓扑关系、属性域和子类型、坐标精度和分辨率以及很多其他功能,但在 shapefile 中则不支持这些内容。由于 shapefile 是一种广泛用于数据转换的开放式格式,因此,许多非 Esri 软件包都可将数据输出为 shapefile 格式。(要了解 shapefile 格式规范,请参阅 http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf。) 遗憾的是,这些软件包并不总能创建格式正确的 shapefile。或许,您已遇到过从其他源接收到受损的 shapefile 的问题。Shapefile 利用 dBASE 文件格式(.dbf 文件)来存储属性。而 dBASE 是一种非 Esri 格式,该格式是于 20 世纪 80 年代早期开发的,是当时最为流行的属性表存储格式。然而,它们的时代已悄然而逝,从那时起,数据制图表达方法方面的改进(如,Unicode 标准)不断涌现,以支持世界上大部分的书写系统。这就是 shapefile 无法使用非英语语言有效存储信息的原因之一。与地理数据库中的要素类不同,ArcGIS 不对形状长度和形状面积字段进行计算和维护。

正因为存在这些(或更多)问题,如果选用 shapefile 进行活动数据库管理将显得捉襟见肘 - 它们无法处理现今数据的创建、编辑、版本管理及归档的生命周期。

何时使用 shapefile? 导出数据供非 Esri 软件应用程序使用时导出数据供 ArcView GIS 3 或 ArcInfo Workstation 使用时需要迅速写入简单要素和属性时。(但是,您必须注意下面所述的局限性。) 何时不能使用 shapefile?

除以下列出的一些特例外,可以使用 shapefile 来存储简单的要素几何。不过,shapefile 在属性存储上存在严重问题。例如,它们无法存储空值,无法向上舍入数字,对 Unicode 字符串的支持不足,字段名称最长只能为 10 个字符,且无法在日期字段中存储时间。这些只是其中的主要问题。此外,它们不支持在地理数据库中的某些功能,如:属性域和子类型。因此,除非是非常简单的属性且不需要使用地理数据库功能,否则请不要使用 shapefile。

Shapefile 组件与文件扩展名

Shapefile 存储在三个或更多个具有相同前缀的文件中,且位于同一系统文件夹(shapefile 工作空间)中。使用 Windows 资源管理器而非 ArcCatalog 查看该文件夹时,可以看到单个文件。

Shapefile 扩展名

扩展名

说明

必需的文件?

.shp

用于存储要素几何的主文件。此文件中未存储任何属性 - 仅有几何。

.shx

.shp 的配套文件,用于存储 .shp 文件中各个要素 ID 的位置。

.dbf

用于存储要素属性信息的 dBASE 表。

.sbn 和 .sbx

用于存储要素空间索引的文件。

.atx

为各 dBASE 属性索引(建立于 ArcCatalog 中)而创建。

.ixs 和 .mxs

读写 shapefile 的地理编码索引。

.prj

用于存储坐标系信息的文件。

.xml

ArcGIS 的元数据;用于存储 shapefile 的相关信息。

几何限制 任何 shapefile 组件文件都有大小为 2 GB 的上限,可理解为可包含的点要素最多约为 7000 万个。shapefile 中可存储的线或面要素的实际数量取决于每个线或面中的折点数(一个折点相当于一个点)。Shapefile 也不包含类似于地理数据库要素类具有的 x,y 容差的信息。两坐标系被视为同一坐标系之前,x、y 容差就是它们之间的最小距离。当评估相同要素类中各要素之间的关系或评估多个不同要素类之间的关系时,会使用此 x、y 容差。编辑要素时,也会经常使用它。若所要执行的任意类型的操作涉及元素之间的比较(例如,使用叠加工具、裁剪工具、按位置选择图层工具或任何将两个或多个要素类作为输入的工具),则应使用地理数据库要素类(包含 x,y 容差)而非 shapefile。由于形状压缩方法的不同,shapefile 所占用的空间可能为文件地理数据库或 SDE 的三到五倍。Shapefile 支持多面体,但不支持以下多面体的高级功能: 纹理坐标纹理及部分色带光线法向量与地理数据库要素类的空间索引相比,Shapefile 的空间索引效率较低。这就意味着,同地理数据库要素类相比,空间查询(如选择面内的要素)耗时更长。只有在处理大量要素时,这一项劣势才会明显。shapefile 不支持通过参数定义的曲线 (也称为圆弧曲线)。如创建曲线中所述,参数曲线是通过编辑数据库要素类而创建的。圆弧曲线利用数学公式绘制曲线。若您将含圆弧曲线的地理数据库要素类导出到 shapefile 中,就可将弯曲要素变换为简单线要素,并使空间上靠近的折点捕捉到弯曲的形状。 属性限制 与其他格式不同,shapefile 为二进制文件,但存储数值型属性确使用字符类型字段。对于实数(即,包含小数位的数字),这可能会导致舍入误差。因此,此限制不适用于形状坐标,而仅适用于属性。下表列出了各属性数据类型的字段宽度。 dBASE 中的字段宽度

地理数据库数据类型

dBASE 字段类型

dBASE 字段宽度(字符数)

对象 ID

数值

9

短整型

数值

4

长整型

数值

9

浮点型

浮点型

13

双精度型

浮点型

13

文本

字符

254

日期

日期

8

dBASE 文件标准仅支持其字段名称及字段值中的 ANSI 字符。Esri 已针对 dBASE 文件新增了大量 Unicode 支持,以存储 Unicode 字段名称及字段值。但此附加支持仅适用于 ArcGIS,在非 Esri 应用程序中可能不提供这些支持。

注:

若您的字段名称或字段值需要支持 Unicode,则强烈建议您使用地理数据库,而非 shapefile。

日期字段仅支持日期。它们不支持时间。

警告:

对于执行时态分析的所有工具(例如时空模式挖掘工具箱中的工具)而言,日期字段不支持时间是一个严重限制。请避免使用 shapefile 进行任何类型的时态分析或日期时间计算。

字段名称的长度不能超过 10 个字符。属性的最大记录长度为 4000 字节。记录长度是用于定义全部字段的字节数,而非用于存储实际值的字节数。最大字段数为 255。若超出此上限,当转换为 shapefile 时只会转换前 255 个字段。dBASE 文件必须至少包含一个字段。当您新建 shapefile 或 dBASE 表格时,默认会创建一个整数 ID 字段。dBASE 文件不支持类型 blob、guid、全局 ID、坐标 ID 或栅格字段类型。dBASE 文件除了 WHERE 语句以外,不支持 其它 SQL 命令。当您保存编辑时,属性索引会被删除,因此,必须重新创建属性索引。 空值表示

Shapefile 不支持空值。如果将含有空值的要素类转换为 shapefile 或将数据库表转换为 dBASE 文件,则将按下表所述更改空值。

警告:

当将 shapefile 或 dBASE (.dbf) 文件用作工具的输入时,ArcGIS 无法确定某一字段值表示空值还是合法值。

shapefile 和 dBASE (.dbf) 文件中的空值替换

包含空值的数据类型

空值替换

数字 - 当工具需要输出“空”、无穷大或 NaN(非数字)时

-1.7976931348623158e+308(最大负值的 IEEE 标准)

数字(所有其他地理处理工具)

0

文本

“ ”(空白 - 单空格)

日期

存储为零,但显示为

不支持的功能

Shapefile 在工作空间或要素类级别无扩展数据类型。因此,从地理数据库要素类或其他格式转换为 shapefile 时会导致下列数据丢失:

子类型属性域几何网络拓扑注记 形状长度和形状面积

对于存储在地理数据库中的线或面要素类,ArcGIS 会计算并维护 shape_length 和 shape_area 字段;也就是说,编辑地理数据库要素类中的线形状或面形状时,系统会重新计算 shape_length 和 shape_area 字段中的值以反映对要素所做的编辑。但这不适用于 shapefile。即使 shapefile 具有 shape_area 或 shape_leng 字段,对 shapefile 进行编辑后,字段也不会更新。

Shapefile 和地理处理

任何能够输出要素类的地理处理工具,均可选择 shapefile 或地理数据库要素类作为输出格式。同样,任意输出结果为表的工具,均可选择 dBASE 文件 (.dbf) 或地理数据库表作为输出格式。需要始终了解所使用的格式,以及将地理数据库输入转换为 shapefile 输出所产生的后果。

地理处理工具可自动生成输出要素类或表。自动生成的输出基于使用当前及临时工作空间环境中所述的许多因素。若您的临时工作空间环境未设置为某个地理数据库,而是设置为了某个系统文件夹,则自动生成的输出要素类将为 shapefile 或 dBASE 文件,如下图所示。

建议您将临时工作空间设置为某个文件地理数据库,以便自动生成的输出不会被写入 shapefile 或 .dbf 表中,而是被写入文件地理数据库中。

了解有关地理处理环境的详细信息

由于 shapefile 写入速度快,通常将它作为模型的中间数据使用,从而可加快模型执行速度。不过,写入文件地理数据库与写入 shapefile 的速度几乎相同,所以除非对执行速度的要求较高,否则应始终使用文件地理数据库写入中间数据及输出数据。若您一定要使用 shapefile,请注意上述局限性,且仅将 shapefile 用于简单要素和属性。将 shapefile 用于中间数据的替代方法是将要素写入 in_memory 工作空间。

有关 shapefile 的坐标系的基础知识

通常,shapefile 并不包含任何用于确定已使用哪个坐标系来定义其要素的信息。在这种情况下,“形状”列的“空间参考”属性将为“未知”或“假定地理”。如果要素的边界坐标在 x 方向上介于 -180 到 180 范围内,在 y 方向上介于 -90 到 90 范围内,ArcGIS 会认为该数据为地理数据,其基准面为 NAD27。如果边界坐标不在该范围内,软件会认为空间参考为未知。

了解有关坐标系的详细信息

即使 shapefile 的坐标系未定义,也可以使用相应的 shapefile,但可能无法利用所有可用功能。例如,shapefile 可能不能与其他数据排列在一起,这样,其自动创建的元数据将是不完整的。

在 ArcCatalog 中可以多种方式定义 shapefile 的坐标系:

选择 ArcCatalog 随附的其中一个预定义坐标系。导入由另一数据源使用的坐标系参数。定义新的自定义坐标系。

坐标系参数必须保存在 shapefile 所在文件夹的 .prj 文件中,并且 .prj 文件必须与 shapefile 具有相同的文件前缀。例如,如果您正在使用名为 wells.shp 的 shapefile,那么其坐标系参数必须存储在同一文件夹的 wells.prj 文件中。

定义坐标系后,可以修改各参数。例如,您可能想要修改坐标系中从另一数据源导入的一个参数或者对其中一个预定义坐标系进行自定义。创建自定义坐标系后,可以将其另存为单独的坐标系文件;您可能需要与您所在组织中的其他人共享该坐标系。

要在 ArcCatalog 中添加或修改 shapefile 的坐标系,请使用“投影”工具或“创建空间参考”工具。

shapefile(.shp)空间数据格式详细说明

shp空间数据格式详细说明 shapefile(.shp)空间数据格式详细说明 写在前面一.主文件的组织 1.主文件头2.主文件记录 (1)记录头(2)主文件记录内容 1)空 shape2)Point (点)3)MultiPoint (多点)4) Arc(弧段)5)Polygon(面)二.索引文件的组织 1.索引文件文件头2.索引记录三.属性文件的组织 1.属性文件的文件头2.属性文件的实体信息3.读取属性文件的示例:

  ESRI 的 shape 文件由一个主文件(.shp)、一个索引文件(.shx)和一个 dBASE 表(.dbf)构成。主文件(.shp)是一个可变记录长度的随机文件,文件中的每个记录描述一个包含多个顶点的 shape。在索引文件(.shx)中,每个记录内容包含着与主文件中记录相对应的从主文件开始处的偏移量。dBASE 表(.dbf)中包含着与每个要素相对应的一条要素属性记录。几何数据与属性的一一对应关系是基于记录号来对应的。dBASE 文件中属性记录的顺序必须与主文件中的记录顺序相同。

一.主文件的组织

  主文件(.shp)用于记录空间坐标信息,包含一个固定长度的文件头,在文件头的后面存储着可变长度的记录。每个可变长度记录由一个固定长度的记录头和跟随其后的可变长度记录内容组成。在这里插入图片描述

我们将一个二进制位称为1bit,8bit,也就是8个二进制位构成一个字节。我们看一下一个字节可以表达的十进制范围

00000000(二进制)→0(十进制)

11111111(二进制)→255(十进制)

可以看到,一个字节可以表达256个数字,c语言中的char变量就是占用1个字节。另外,我们需要了解常见变量类型所占字节数,例如

       C语言中:int整型变量占用4个字节,float类型占用4个字节,double占用8个字节。

        而VBA中:int整型变量占用两个字节;长整型 Long,占用4个字节;单精度浮点型 Single,占用4个字节;双精度浮点型 Double,占用8个字节。

实际上4个字节就可以表达很大的整数了,可以表达2^32个值,也就是4294967296个值,但通常整型加上正负号范围也就是:-2147483647~+2147483647,可以满足大部分需求,当然还有占用很多字节的长整型,可以占用8个字节(天文数字)。为了降低空间浪费,也有占用2个字节的短整型。

1.主文件头

  主文件头长度为 100 字节,一共有9个int型和8个double型数据。 注:表中最后4个加星号特别标示的四个数据只有当这个Shapefile文件包含Z方向坐标或者具有Measure值时才有值,否则为0.0。所谓Measure值,是用于存储需要的附加数据,可以用来记录各种数据,例如权值、道路长度等信息。

(注:带星号的标注的为:若无M值或Z值,则未使用,值为0.0)

坐标包含小数,

在VBA中,当你将一个Double类型的实数(8字节,64位)写入内存时,VBA会遵循IEEE 754标准来编码这个数值。IEEE 754标准定义了浮点数在计算机内存中的表示方式。

一个64位的Double类型数值在内存中的编码方式如下:

符号位(Sign Bit):最高位(第64位,从0开始计数)表示数的正负。0表示正数,1表示负数。

指数部分(Exponent):接下来的11位(第63位到第53位)表示指数。这个指数是一个有偏的二进制表示,实际的指数值需要减去一个固定的偏置值(对于Double类型,这个偏置值是1023)。

尾数部分(Mantissa):剩下的52位(第52位到第1位)表示尾数,也称为分数部分。它表示一个介于1和2之间的数(隐含的1.xxxxxx),这个数乘以2的指数次方就是原始的浮点数值。

在VBA中,当你将一个Double类型的值赋给一个变量时,VBA会自动按照上述规则将这个值编码成内存中的64位表示。这个编码过程对程序员通常是透明的,除非你直接操作内存(比如使用指针或者某些低级的内存操作函数)。

例如,假设你有一个Double类型的变量myVar,它的值为1.2。在内存中,myVar的编码将按照IEEE 754标准表示1.2的二进制形式。具体编码值取决于1.2在二进制下的表示,以及IEEE 754标准如何对这个值进行编码。

如果你想要查看Double类型变量在内存中的具体编码,通常需要使用一些专门的工具或者技术,比如指针操作、内存查看工具,或者编写特定的代码来提取这些位。但是,请注意,直接操作内存通常是不安全的,并且可能违反某些编程最佳实践。在大多数情况下,你应该避免直接操作内存,除非你有明确的需求和足够的知识来安全地进行这样的操作。

Shapefile文件所支持的几何类型: 注:对于一个不是记录Null Shape 类型的Shapefile文件,它所记录的空间目标的几何类型必须一致,不能在一个Shapefile文件中同时记录两种不同类型的几何目标。在这里插入图片描述 读取坐标文件(.shp)的文件头的代码如下:

void OnReadShp(CString ShpFileName) { FILE* m_ShpFile_fp; //****Shp文件指针 //打开坐标文件 if((m_ShpFile_fp=fopen(ShpFileName,"rb"))==NULL) { return; } //读取坐标文件头的内容 开始 int FileCode; int Unused; int FileLength; int Version; int ShapeType; double Xmin; double Ymin; double Xmax; double Ymax; double Zmin; double Zmax; double Mmin; double Mmax; fread(&FileCode, sizeof(int), 1,m_ShpFile_fp); FileCode = OnChangeByteOrder (FileCode); for(i=0;i 0 Then Exit Sub '创建空间参考文件 '定义空间参考.show '自定义选择参数 坐标系、加带号、中央子午线、投影带宽 坐标系 = "2000国家大地坐标系" 中央子午线 = 114 加带号 = False 投影带宽 = 3 Dim PrjName As String PrjName = ThisDrawing.Path & "\ZD.prj" Dim m(0 To 12) As String 常数 = 中央子午线 / 3 投影项目 = str1 + "3_Degree_GK_Zone_" + Trim(常数) & Chr(34) & Chr(44) '"Beijing_1954_3_Degree_GK_Zone_39" "Xian_1980_3_Degree_GK_Zone_39" 加常数 = "PARAMETER[" & Chr(34) & "False_Easting" & Chr(34) & Chr(44) & Format(常数 * 1000000 + 500000, "0.0") & "]" m(0) = 投影项目 m(1) = 地理标志 m(2) = 基准 m(3) = 球体 m(4) = "PRIMEM[" & Chr(34) & "Greenwich" & Chr(34) & ",0.0]," '径线起点 格林威治" m(5) = "UNIT[" & Chr(34) & "Degree" & Chr(34) & ",0.0174532925199433]]," '弧度单位 m(6) = "PROJECTION[" & Chr(34) & "Gauss_Kruger" & Chr(34) & "]," '投影 m(7) = 加常数 m(8) = "PARAMETER[" & Chr(34) & "False_Northing" & Chr(34) & ",0.0]," '北纬 m(9) = 中央径线 m(10) = "PARAMETER[" & Chr(34) & "Scale_Factor" & Chr(34) & ",1.0]," '长度比例 m(11) = "PARAMETER[" & Chr(34) & "Latitude_Of_Origin" & Chr(34) & ",0.0]," '纬度起点 m(12) = "UNIT[" & Chr(34) & "Meter" & Chr(34) & ",1.0]]" '长度单位 Open PrjName For Output As #1 Print #1, m(0) + m(1) + m(2) + m(3) + m(4) + m(5) + m(6) + m(7) + m(8) + m(9) + m(10) + m(11) + m(12) Close 发包方编码 = Left(ThisDrawing.Name, 12) Dim 转换标准 As String 'Shape转换标准样本.xlsx 转换标准 = ThisDrawing.Path & "\ZD.xlsx" excel.Workbooks.Open filename:=转换标准 '打开文件 'Dim MySheet As excel.worksheet 'Excel工作表 'For Each MySheet In excel.ActiveWorkbook.Sheets '历遍Excel的工作表 ' If excel.activesheet.Name = "JZX" Or MySheet.Name = "说明" Then Exit For '目前不转界址线 Dim MySheet As Object ' Set MySheet = excel.worksheets(1) Set MySheet = excel.activesheet 表名 = 工作目录 & 发包方编码 & MySheet.Name 文件名 = 表名 + ".prj" FileCopy PrjName, 文件名 '复制预先创建好的空间参考文件 ShpName = 表名 & ".shp": ShpFile = 1 ShxName = 表名 & ".shx": ShxFile = 2 DbfName = 表名 & ".dbf": DbfFile = 3 CPGName = 表名 & ".CPG": CPGFile = 4 '如果文件已存在,删除文件 If Dir(ShpName) "" Then Kill ShpName If Dir(ShxName) "" Then Kill ShxName If Dir(DbfName) "" Then Kill DbfName If Dir(CPGName) "" Then Kill DbfName '创建打开Shape文件,输出头文件内容 Open CPGName For Binary As #CPGFile '打开文件 Put #CPGFile, 1, "ANSI" Close Open ShpName For Binary As #ShpFile '打开文件 Open ShxName For Binary As #ShxFile '打开文件 Open DbfName For Binary As #DbfFile '打开文件 字段数 = MySheet.Cells(5, 2) 字段总长度 = MySheet.Cells(6, 2) ReDim pField(字段数 - 1) For i = 0 To 字段数 - 1 pField(i).Name = MySheet.Cells(i + 8, 1) pField(i).Type = MySheet.Cells(i + 8, 2) pField(i).Length = MySheet.Cells(i + 8, 3) pField(i).pScale = MySheet.Cells(i + 8, 4) pField(i).Method = MySheet.Cells(i + 8, 6) Select Case pField(i).Method '取值方法 Case "扩展属性" pField(i).Number = MySheet.Cells(i + 8, 7) Case "黙认值" pField(i).value = MySheet.Cells(i + 8, 7) End Select r = 32 + i * 32 'pdf的文件头32字节和字段描述,每个字段32字节 On Error Resume Next For N = 1 To 11 '只有11个字节 记录字段名,是ASCII码值,如果字段名超过11个字符会被舍去。 Put #DbfFile, r + N, Asc(Mid(pField(i).Name, N, 1)) Next Put #DbfFile, r + 12, pField(i).Type Put #DbfFile, r + 17, pField(i).Length Put #DbfFile, r + 18, pField(i).pScale Next 文件头长度 = 字段数 * 32 + 32 + 1 Put #DbfFile, 9, 文件头长度 '文件头长度 文件头32+每个字段32+控制位0D一个字节 Put #DbfFile, 11, 字段总长度 + 1 '一条记录的字节长度 version = 3 Put #DbfFile, 1, version 'dbf版本信息 dateF(0) = 2024 - 1900: dateF(1) = 2: dateF(2) = 26 Put #DbfFile, 2, dateF '最近的更新日期,年数是1900到今年的年数 Dim myb As Byte myb = &HD Put #DbfFile, 文件头长度, myb '0d控制位,vba中&h为十六进制数,c++中是0X longN = 170328064 '' 9994转16进制270A倒序0A270000转十进制170328064 Put #ShpFile, 1, longN '1 File Code,文件号9994 Put #ShxFile, 1, longN longN = 1000 '小端序,系统默认一样不需要转 Put #ShpFile, 29, longN '1 版本号 Put #ShxFile, 29, longN longN = MySheet.Cells(4, 2) '点线面135类型,此代码为面转换代码 Put #ShpFile, 33, longN '33 几何类型 Put #ShxFile, 33, longN '以下输出图形信息 ' 范围框(0) = 100000000: 范围框(1) = 100000000 ' 范围框(2) = 0: 范围框(3) = 0 Shp指针 = 101: 记录长度 = 101 Shx指针 = 101 记录条数 = 0 Dbf指针 = 文件头长度 + 1 r = LOF(DbfFile) ThisDrawing.SelectionSets.Item("窗选").Delete Err.Clear Set SelectA = ThisDrawing.SelectionSets.Add("窗选") fType(0) = MySheet.Cells(2, 1): fData(0) = MySheet.Cells(2, 3) fType(1) = MySheet.Cells(3, 1): fData(1) = MySheet.Cells(3, 3) SelectA.Select acSelectionSetAll, , , fType, fData SelectA.Highlight (True) For Each Entry In SelectA Entry.GetXData "", XDType, xData ' MsgBox Entry.ObjectName ' ThisDrawing.Regen acActiveViewport 记录条数 = 记录条数 + 2 For i = 0 To 字段数 - 1 Select Case pField(i).Method '取值方法 Case "扩展属性" pField(i).Name = xData(pField(i).Number) Case "黙认值" pField(i).Name = pField(i).value Case "编号" pField(i).Name = 记录条数 / 2 Case Else pField(i).Name = "" End Select Next Select Case MySheet.Cells(4, 2) 'Shape类型 Case 5 '面 Call Shape面记录内容(Entry) Case 3 '线 Call Shape线记录内容(Entry) Case 1 '点 Call Shape点记录内容(Entry) End Select Next SelectA.Delete '关闭Shape文件 Dim Offset As Long N = 记录条数 / 2 Put #DbfFile, 5, N KZW1A = &H1A '控制位1A Put #DbfFile, Dbf指针, KZW1A Offset = LOF(ShpFile) / 2 '这里的长度是字节数/2 longN = 转为大端序(Offset) Put #ShpFile, 25, longN 'Shp文件长度 longN = 转为大端序((Shx指针 - 1) / 2) Put #ShxFile, 25, longN 'Shx文件长度字节数/2 Put #ShpFile, 37, 图形框 Put #ShxFile, 37, 图形框 ' Put #ShpFile, 37, 范围框 ' Put #ShxFile, 37, 范围框 Close 'excel.ActiveWorkbook.Close SaveChanges:=True MsgBox "已完成", , "QQ443440204" End Sub

 转换前的cad和vba代码:

 转换后的shp:



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有