似乎有一小撮人,正在鼓吹shp必死论(可能是受够了shp的缺点了吧!),我就简单翻译一下。
shp文件具体是什么我就不过多介绍了,它诞生于1990年,马上就是它的30大寿了。
尽管shp文件是Esri维护的,但是它的规范是开放的,也就是说,如果你懂了shp文件的几大数据结构构成,会编程,你也可以手搓一个shp文件读写程序,不需要依赖任何第三方库。
3.1 shp文件的缺陷但是,下面原文开始重点驳斥shp文件的坏处:
为什么Shapefile这么糟糕?以下是Shapefile格式错误的几个原因,您应该避免使用它:
要额外使用prj文件定义坐标系统(shp文件规范不包括prj文件来定义坐标系统,这是额外的)
多文件格式(至少要3个文件,其他软件还会自己扩充更多同名扩展文件,这就使得数据共享非常麻烦,这也是一个非常致命的弱点)
属性名最多为10字符
dbf属性表最多255个字段
数据类型有限,只支持浮点数、整数、日期、文本,一个值最多254字符
文字编码有大问题,在ArcGIS中打开shp文件中文乱码的问题大家肯定遇到过
shp文件和dbf文件最大2GB(虽然GDAL改进了但是毫无卵用)
不能拓扑
每个shp只能是一种几何类型
更复杂的数据结构无法实现,例如不规则三角网等
不能用纹理或材质存储3d数据
...
不展开了,有兴趣的朋友到他们官网看即可
3.1 备选方案讲道理,现在没有任何一种矢量格式能完全替代shp,但是不得不说其他的格式正在慢慢崛起,有他们的用户。
例如,kml、gml、geojson等
一些Shapefile替代品:
OGC GeoPackage
GeoJSON
OGC GML
SpatiaLite
CSV
OGC KML
其中,第一位列的就是gpkg,而且经过近几年的迭代升级、修订,再加上它可以扩展的特性,使得gpkg更强大。
GeoPackage的一个缺点是,它底层SQLite数据库是一种复杂的二进制格式,不适合流式传输。它必须写入本地文件系统或通过中间服务访问。所以,在本地应用中,gpkg是shp文件的一个不错替代品(如果你有需要)
GeoJson并不是shp文件的代替品,只是地理数据的一种json实现。它的一个特点就是支持流传输;存在的问题是,不是所有的几何都可以表示,高级的坐标系统支持也不算好。
所以,基于XML的GML格式(仅支持矢量数据)就有了用武之地。但是GML也有其缺点,就是数据结构定义标准复杂,较少软件愿意支持它,ArcGIS把它的支持丢进了数据互操作模块。如果GeoJson不能解决问题,可以试试GML。
SpatialLite和gpkg类似,也是一个开源数据库,也是基于SQLite,也是单文件,也支持SQL,但是不如gpkg广泛。究其原因,是因为sl缺乏扩展能力(好比世界之窗vsChrome),也不支持栅格数据。同样的,它也不支持流传输。
csv文件,估计有的同学用过,最大的特点就是简单了。它就是个文本格式的二维数据表格。在非GIS行业中,csv非常受欢迎。作为属性表可能合适,但是它并不具备几何等复杂空间信息的存储能力,而且它没有一个标准。
kml是谷歌在谷歌地球中推荐的格式,基于XML,单文件。它有个特点就是,数据和样式同存在于一个kml文件中。缺点也有,仅支持wgs84坐标。由于它基于XML,所以数据量一大就不好用了。数据和样式存在耦合,这也是个缺点。
当然,除了以上开源格式外,还可以使用更复杂的DBMS或者ArcGIS家使用的面向对象的地理数据库。
笔者的建议是,还是具体问题具体分析。如果你要做真正的GIS项目,通用、标准化、性能高才是不二之选;所以,像kml等非主流但是又有其价值的数据,除了在它本身的平台用外,最好转换到更通用的格式上,例如,就GeoPackage——不然还是老实点用shp文件吧~
项目大的,有高并发、安全要求的,不妨试试PostgreSQL的PostGIS拓展。或者用MySQL、其他商业数据库,那些就不在本文的讨论范围了。
参考资料
[1]. OGC的GeoPackage官网:https://www.geopackage.org/
[2]. OGC的GeoPackage起步文档:
[3]. OGC的GeoPackage标准(类似于白皮书)
[4]. 实现了GeoPackage的有关软件:https://www.geopackage.org/implementations.html
[5]. GeoPackage vs Shapefiles:https://www.gis-blog.com/geopackage-vs-shapefile/
[6]. Shp文件必须死!(这个网站有点偏激):