人们常说的Shapefile是一种美国ESRI公司开发的空间数据开放格式。目前,许多空间数据都以此格式进行存储、管理、共享,这证明了shape格式的实用性,也侧面证明了ESRI公司的实力和影响力。
Shapefile格式保存了图形的矢量信息和其属性信息,一般由以下几个文件组成:
* .shp - 存储空间几何对象。
* .shx - 存储空间几何对象在*.shp文件中偏移索引。
* .dbf -存储空间几何对象的属性信息。
除了以上三个文件格式之外,还可以有其它文件的支持,这样能够优化访问数据库的性能:
* .sbn 和 .sbx - 空间几何对象空间索引。
* .fbn 和 .fbx - 存储只读空间几何对象空间索引。
* .ain 和 .aih - 存储列表中活动字段的属性索引。
* .prj - 保存空间参考信息。
* .shp.xml - 保存的元数据。
关于*.shp、*.shx、*dbf文件的读取,可以去网站http://shapelib.maptools.org/下载源代码进行研究。
shapefile文件格式的白皮书可以去网站http://dl.maptools.org/dl/shapelib/shapefile.pdf下载
但是,如果想加快读写速度需要注意以下几点:
1、利用SHPObject对象时,每次都对Z、M值进行了分配空间,开发人员可以自己修改shapelib库源代码,在没有M、Z值情况下不分配内存空间;
2、开发者重写函数一个读取函数:SHPReadObject( SHPHandle hSHP, int iShape, SHPObject ** obj),obj对象不必每次读取都重新重复分配内存,只有在上一个对象占用的内存空间小于此次读取对象时再重新分配空间;
3、修改SHPObject结构,将顶点坐标的x、y值交互存放,和物理存储位置一致,例如:x1 y1 x2 y2 x3 y3...
4、利用quadtree进行空间搜索,加快空间数据搜索速度;
5、完全重新设计sHPObject结构,使其与自己系统的空间数据对象一致,再重新开发shapeobject读写函数,自己从文件中解析数据,直接形成自己的内存数据结构去分析、绘制等工作,而不是利用ShpObject进行中转;
6、注意shapefile格式中的Polygon,是拥有对个环的Polygon,环间可以嵌套形成洞、岛等现象,虽然ESRI规定,换走向的右侧为Polygon内部,但很多时候shapefile的存储并未遵守这一规则,而且环的存储顺序也很混乱,即:内环不一定紧随其外环存储,在读取中特别注意。
7、warmerdam这位老仙儿,在shapefile读取库中,加入了quadtree的支持。但是,如果你把这些代码独立编译成dll,然后去调用会出现问题。SearchDiskTree()中要求传入的是FILE*,而这个参数是在你的工程(DLL或者EXE)中打开的,程序运行时崩溃。最好在shapelib中添加一个函数SearchDiskTreeEx(),改为传*.qix文件名吧。
在shptree代码中,有分配内存的函数,却没有回收内存的函数,也需要自己添加一个,避免不同空间中非配、回收内存。