Shape文件处理工具

一、Shape文件介绍

ESRI Shapefile(shp),或简称shapefile,是美国环境系统研究所公司(ESRI)开发的一种空间数据开放格式。[1]该文件格式已经成为了地理信息软件界的一个开放标准,这表明ESRI公司在全球的地理信息系统市场的重要性。Shapefile也是一种重要的交换格式,它能够在ESRI与其他公司的产品之间进行数据互操作。

Shapefile文件用于描述几何体对象:,折线与多边形。例如,Shapefile文件可以存储、河流、湖泊等空间对象的几何位置。除了几何位置,shp文件也可以存储这些空间对象的属性,例如一条河流的名字,一个城市的温度等等。

二、Shape文件组成

Shapefile文件指的是一种文件存储的方法,实际上该种文件格式是由多个文件组成的。其中,要组成一个Shapefile,有三个文件是必不可少的,它们分别是".shp", ".shx"与 ".dbf"文件。表示同一数据的一组文件其文件名前缀应该相同。例如,存储一个关于湖的几何与属性数据,就必须有lake.shp,lake.shx与lake.dbf三个文件。而其中“真正”的Shapefile的后缀为shp,然而仅有这个文件数据是不完整的,必须要把其他两个附带上才能构成一组完整的地理数据。除了这三个必须的文件以外,还有八个可选的文件,使用它们可以增强空间数据的表达能力。所有的文件名都必须遵循MS DOS的8.3文件名标准(文件前缀名8个字符,后缀名3个字符,如shapefil.shp),以方便与一些老的应用程序保持兼容性,尽管现在许多新的程序都能够支持长文件名。此外,所有的文件都必须位于同一个目录之中。

必须的文件:

  • .shp— 图形格式,用于保存元素的几何实体。

  • .shx— 图形索引格式。几何体位置索引,记录每一个几何体在shp文件之中的位置,能够加快向前或向后搜索一个几何体的效率。

  • .dbf— 属性数据格式,以dBase IV的数据表格式存储每个几何形状的属性数据。

其他可选的文件:

  • .prj— 投帧式,用于保存地理坐标系统与投影信息,是一个存储well-known text投影描述符的文本文件。

  • .sbnand.sbx— 几何体的空间索引

  • .fbnand.fbx— 只读的Shapefiles的几何体的空间索引

  • .ainand.aih— 列表中活动字段的属性索引。

  • .ixs— 可读写Shapefile文件的地理编码索引

  • .mxs— 可读写Shapefile文件的地理编码索引(ODB格式)

  • .atx—.dbf文件的属性索引,其文件名格式为_shapefile_.columnname.atx(ArcGIS 8及之后的版本)

  • .shp.xml— 以XML格式保存元数据。

  • .cpg— 用于描述.dbf文件的代码页,指明其使用的字符编码

在每个.shp,.shx与.dbf文件之中,图形在每个文件的排序是一致的。也就是说,.shp的第一条记录与.shx及.dbf之中的第一条记录相对应,如此类推。此外,在.shp与.shx之中,有许多字段的字节序是不一样的。因此用户在编写读取这些文件格式的程序时,必须十分小心地处理不同文件的不同字节序。

Shapefile通常以X与Y的方式来处理地理坐标,一般X对应经度,Y对应纬度,用户必须注意X,Y的顺序。

Shapefile图形格式 (.shp)

Shapefile格式的主文件包含了地理参照数据。该文件由一个定长的文件头和一个或若干个变长的记录数据组成。每一条变长数据记录包含一个记录头和一些记录内容。详细的数据存储格式由_Esri Shapefile技术描述_.提供。注意,虽然Shapefile文件的后缀名与AutoCAD的图形字体源格式它们的文件后缀名相同的,都是.shp,请不要把它们混淆。

主文件头包含17个字段,共100个字节,其中包含九个4字节(32位有符号整数,int32)整数字段,紧接着是八个8字节(双精度浮点数)有符号浮点数字段。

三、MySQL对地理空间数据的支持

1.Geometry介绍

  • MySQL中支持的几何数据类型包括Geometry(几何)、Point(点)、LineString(线)、Polygon(面) 以及集合类型的MultiPoint(多点)、MultiLineString(多线)、MultiPolygon(多面)、GeometryCollection(混合数据类型)

  • 其中,Geometry可以表示其他任意类型的值,剩下的只能表示单个类型的值

2.Geometry类型

注意:数据中间不能有多余的空格

名称
类型
例如

Point

点坐标

POINT(103 35)

LineString

线坐标

LINESTRING(103 35,103 36,104 36,105 37)

Polygon

面坐标

POLYGON(103 35,104 35,104 36,103 36,103 35)

MultiPoint

多点

MULTIPOINT(103 35, 104 34,105 35)

MultiLineString

多线

MULTILINESTRING((103 35, 104 35), (105 36, 105 37))

MultiPolygon

多面

MULTIPOLYGON(((103 35,104 35,104 36,103 36,103 35)),((103 36,104 36,104 37,103 36)))

GeometryCollection

混合类型

GEOMETRYCOLLECTION(POINT(103 35), LINESTRING(103 35, 103 37))

3、Geometry数据格式

MySQ L支持WKB,WKT数据生成空间数据类型,提供如下函数:

  • WKT(文本格式:在代码中的格式)

GeomFromText(wtk [,srid)PointFromText LINESTRINGFROMTEXT ......

  • WKB(二进制格式:存储在Geometry类型的表字段中)

GeomFromWKB(wtk [,srid)GeomFromWKB GeomFromWKB ......

4、Geometry的常用函数

1.构造函数

构造函数会获取一种几何类型或几何的文本说明,然后创建一个几何

  • ST_Point:文本格式转Point格式(例如存表的时候)

  • ST_PointFromText:Point格式转文本格式(例如查询的时候)

  • ST_Polygon:文本格式转Polygon格式

  • ST_PolygonFromText:Polygon格式转文本格式

  • ST_PointFromWKB:以熟知二进制 (WKB) 表示和空间参考 ID 作为输入参数返回 ST_Point 类型的对象

2.存取器函数

函数都采用一个或多个几何作为输入,并返回关于几何的特定信息

  • 获取线/面对象四至:st_xmin(geometry)、st_ymin(geometry)、st_xmax(geometry)、st_ymax(geometry)

  • ST_AsText:获取一个几何类型,然后返回其可识别的文本表示

  • ST_AsGeoJSON:将Geometry格式转为JSON格式

  • ST_Centroid:以面或多面为参数输入,然后返回位于几何的包络矩形中心的点

  • ST_Length:用于返回线串或多线串的长度

  • ST_MaxX:以几何为参数,返回最大的 X 坐标

  • ST_SRID:以几何对象作为输入参数,并返回其空间参考 ID

  • ST_X:返回点坐标的 X 坐标

  • ST_Y:返回点坐标的 Y 坐标

3.关系函数

关系函数将几何作为输入并确定各几何之间是否存在特定关系

  • ST_Contains:判断第一个几何对象是否完全包含第二个几何对象

  • ST_Disjoint:判断两个几何对象无交集

  • ST_Equals:判断两个几何对象是否完全相同

4.几何函数

函数利用空间数据并对其执行分析,然后返回新的空间数据

  • ST_Buffer:获取几何对象和距离,然后返回表示围绕源对象的缓冲区的几何对象(例如可以使用线坐标,构造一个线坐标50米之内的面)

  • ST_Distance:用于返回两个几何之间的距离。这一距离是两个几何的最近折点之间的距离

  • ST_Difference:获取两个几何对象,然后返回表示两个源对象之差的几何对象(例如,计算两个面积差)

更多相关函数可参考:ArcMap

四、Shape文件解析

shape文件解析使用geopandas进行解析和坐标的转换。

核心解析逻辑如下

五、两种解析方式

1.命令行解析

本方式解析方式灵活。可随意修改代码进行解析,但是必须要懂得python,能够配置相应的python开发环境以及修改python代码。

代码如下:

2.使用ShapeUtils.exe解析(打开有点慢)

本方式使用简单,只要使用软件输入相关shape文件地址信息,即可查看shape结构、生成示意图、生成geojson、生成sql、生成excel等,但也相对限制了灵活度。

代码如下:

六、相关文件下载:

命令行解析文件下载:shape-file-parse.py

工具源码下载:shape-parse-utils.py

Last updated

Was this helpful?