HashData实战系列—云原生的支持地理信息数据分析

2022-02-16 00:00:00 数据 用户 数据库 导入 空间

空间数据库的诞生 


随着大数据技术的发展,急剧增长的地理空间大数据已成为海量数据处理的重要组成。地理空间大数据是指带有地理坐标的数据,包括资源、环境、经济和社会等领域一切带有地理坐标的数据,是地理实体的空间特征和属性特征的数字描述,应用前景多样。HashData通过将PostGIS用作插件,引入对空间数据类型、空间索引和空间函数的支持,成为了强大的空间数据库。在此基础上结合对象存储和OSS协议的特性,实现了raster/shapefile/netcdf 等格式的空间数据并行导入数据库。


空间数据库的替代优势


自GIS软件被编写以来,Shapefile(和其他文件格式)一直是进行空间数据存储与交互的标准方式。传统的平面文件在应用中存在着以下弊端:代码可读性差、文件需要特殊应用程序读写;并发操作可能导致数据损坏;复杂问题需要复杂应用程序回答等。相比之下,空间数据库在便捷应用与效率提升方面的优势则十分明显:
 
一、PostGIS实现了从以GIS为中心到以数据库为中心的转变:用户无需特定的GIS数据引擎(GIS Data Engine)处理与空间数据操纵,应用程序只需通过SQL语言即可轻松操纵空间数据,极大地简化了部署过程、降低了开发成本。
 
二、在当今面向地理信息系统应用开发日益复杂的趋势之下, PostGIS摒除了传统地理信息系统空间数据库所采用的空间数据由关系数据库管理,属性数据由文件系统管理的机制。大型数据集用户只需关心数据库对象的管理,无需在文件系统管理上花费过多的精力与资源。

三、建立在PostgreSQL之上的PostGIS,自动继承了重要的"企业级"特性以及开放源代码标准。PostGIS几何数据类型提供了一组覆盖SQL函数(包含转换、管理、检索、比较、生成等,如ST_Intersects),可以无缝操作矢量和栅格地理空间数据。通过R-tree空间索引的应用,使得大数据集复杂的空间数据运算效率得到了大幅提升。
 
因此,空间数据库具备的支持多用户、复杂即时查询,以及对于大型数据集表现出的高性能等特征,有效克服了传统解决方案中的描述能力不足,解决了复杂以及不利于空间数据共享等问题,使得空间数据库成为空间数据分析的必要选择。


HashData 支持分布式PostGIS


HashData云原生数据仓库围绕着对象存储和抽象服务构建,通过融合大规模并行处理(MPP)数据库优异的SQL功能和性能、Hadoop/Spark计算存储分离哲学,以及云计算的弹性和扩展性,帮助企业客户轻松应对数据仓库、数据湖以及数据共享实施中面临的并发访问、可靠性、易用性、扩展性以及成本等挑战。
 

作为典型的MPP(大规模并行处理Massively Parallel Processor)数据库代表,HashData充分利用其强大的计算能力满足了空间数据处理复杂计算的需求。在主流以PostGIS 为基础的数据库中,通常情况下可以利用PostGIS插件工具(raster2pgsql、shp2pgsql)将本地GIS数据转为SQL文件,将SQL文件导入数据库的表中进行存储和管理。这个过程的导入是通过数据库管理节点的使用(insert into ... values(...))方式串行导入数据。


HashData 空间数据导入示例


示例一:导入栅格数据格式

由于某些TIFF文件像素大、无法直接导入数据库中,这里会对栅格数据进行分片处理。tile_size是设置切分数据的大小,在oss_parameters中若没有设置大小,默认按照512x512处理。切分数据分片大值不能大于10000x10000,若超出大值按照大值10000来进行处理,以下为示例:
-Import Gis raster data to table:CREATE READABLE EXTERNAL TABLE osstbl_example(filename text, rast raster, metadata text) LOCATION('oss://ossext-example.sh1a.qingstor.com/raster tile_size=100x100 oss_type=QS access_key_id=xxx secret_access_key=xxx') FORMAT 'raster';
SELECT filename, st_value(rast, 3, 4) from osstbl_example order by filename;
--Results of the raster-- filename列说明-- icg/gis/raster/test_input.tiff 是对象存储的文件路径。-- tilenum 是当前切分的第几个瓦片。-- xtile 表示坐标系x第几个瓦片。-- ytile 表示坐标系y第几个瓦片。-- tile_size 是当前切片大小。 filename | st_value-----------------------------------------------------------------------------+------------------ icg/gis/raster/test_input.tiff tilenum:0 xtile:0 ytile:0 tile_size:100x100 | 260.100006103516 icg/gis/raster/test_input.tiff tilenum:1 xtile:1 ytile:0 tile_size:100x100 | 252.389999389648 icg/gis/raster/test_input.tiff tilenum:2 xtile:2 ytile:0 tile_size:100x100 | 255.429992675781 icg/gis/raster/test_input.tiff tilenum:3 xtile:3 ytile:0 tile_size:100x100 | 288.690002441406 icg/gis/raster/test_input.tiff tilenum:4 xtile:1 ytile:1 tile_size:100x100 | 280.169982910156 icg/gis/raster/test_input.tiff tilenum:5 xtile:2 ytile:1 tile_size:100x100 | 284.72998046875 icg/gis/raster/test_input.tiff tilenum:6 xtile:3 ytile:1 tile_size:100x100 | 301.100006103516 icg/gis/raster/test_input.tiff tilenum:7 xtile:1 ytile:2 tile_size:100x100 | 297.639984130859 icg/gis/raster/test_input.tiff tilenum:8 xtile:2 ytile:2 tile_size:100x100 | 301.940002441406 icg/gis/raster/test_output.tiff tilenum:0 xtile:0 ytile:0 tile_size:100x100 | 260.100006103516 icg/gis/raster/test_output.tiff tilenum:1 xtile:1 ytile:0 tile_size:100x100 | 252.389999389648 icg/gis/raster/test_output.tiff tilenum:2 xtile:2 ytile:0 tile_size:100x100 | 255.429992675781 icg/gis/raster/test_output.tiff tilenum:3 xtile:3 ytile:0 tile_size:100x100 | 288.690002441406 icg/gis/raster/test_output.tiff tilenum:4 xtile:1 ytile:1 tile_size:100x100 | 280.169982910156 icg/gis/raster/test_output.tiff tilenum:5 xtile:2 ytile:1 tile_size:100x100 | 284.72998046875 icg/gis/raster/test_output.tiff tilenum:6 xtile:3 ytile:1 tile_size:100x100 | 301.100006103516 icg/gis/raster/test_output.tiff tilenum:7 xtile:1 ytile:2 tile_size:100x100 | 297.639984130859 icg/gis/raster/test_output.tiff tilenum:8 xtile:2 ytile:2 tile_size:100x100 | 301.940002441406Copy

示例二:导入矢量数据格式
查看矢量数据详细信息: 创建SQL函数Ogr_Fdw_Info并执行该方法,创建成功后用户可获取shapefile建表SQL语句。
--Create SQL Function:CREATE OR REPLACE FUNCTION ogr_fdw_info(text) returns setof record as '$libdir/gpossext.so', 'Ogr_Fdw_Info'  LANGUAGE C STRICT;
select * from ogr_fdw_info('oss://ossext-example.sh1a.qingstor.com/shape access_key_id=xxx secret_access_key=xxx oss_type=QS') AS tbl(name text, sqlq text);
--Results of the ogr_fdw_info SQL function name | sqlq----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 2launder | CREATE READABLE EXTERNAL TABLE shp_2launder ( : fid bigint, : geom Geometry(Point,4326), : n2ame varchar OPTIONS (column_name 2ame), : age integer, : height real, : b_rthdate date OPTIONS (column_name b-rthdate) : ) : LOCATION ('oss://ossext-example.sh1a.qingstor.com/shape access_key_id=xxx secret_access_key=xxx oss_type=QS layer=2launder') : FORMAT 'Shapefile'; : enc | CREATE READABLE EXTERNAL TABLE shp_enc ( : fid bigint, : geom Geometry(Point,4326), : name varchar, : age integer, : height real, : birthdate date : ) : LOCATION ('oss://ossext-example.sh1a.qingstor.com/shape access_key_id=xxx secret_access_key=xxx oss_type=QS layer=enc') : FORMAT 'Shapefile'; : pt_two | CREATE READABLE EXTERNAL TABLE shp_pt_two ( : fid bigint, : geom Geometry(Point,4326), : name varchar, : age integer, : height real, : birthdate date : ) : LOCATION ('oss://ossext-example.sh1a.qingstor.com/shape access_key_id=xxx secret_access_key=xxx oss_type=QS layer=pt_two') : FORMAT 'Shapefile'; : natural | CREATE READABLE EXTERNAL TABLE shp_natural ( : fid bigint, : id real, : natural varchar : ) : LOCATION ('oss://ossext-example.sh1a.qingstor.com/shape access_key_id=xxx secret_access_key=xxx oss_type=QS layer=natural') : FORMAT 'Shapefile'; :(4 rows)Copy
导入数据: 创建外部表格式选择Shapefile格式,用户填写layer字段选择图层,创建成功后用户可执行查询语句查看。
--Create shapefile table:create readable external table shp_2launder (fid bigint, geom Geometry(Point,4326), name varchar, age integer, height real, birthdate date) location('oss://ossext-example.sh1a.qingstor.com/shape access_key_id=xxx secret_access_key=xxx oss_type=QS layer=2launder') format 'Shapefile';        SELECT * FROM shp_2launder;
--Results of the shapefile fid | geom | name | age | height | birthdate-----+----------------------------------------------------+-------+-----+--------+------------ 0 | 0101000020E6100000C00497D1162CB93F8CBAEF08A080E63F | Peter | 45 | 5.6 | 04-12-1965 1 | 0101000020E610000054E943ACD697E2BFC0895EE54A46CF3F | Paul | 33 | 5.84 | 03-25-1971(2 rows)Copy

示例三:导入矢量数据格式

查看子数据集: NETCDF数据具有多个子数据集,用户需要创建SQL函数查看子数据集。创建SQL函数nc_subdataset_info并执行该方法,创建成功后用户可执行查询语句查看子数据集。
--Create SQL Function:CREATE OR REPLACE FUNCTION nc_subdataset_info(text) returns setof record as  '$libdir/gpossext.so', 'nc_subdataset_info' LANGUAGE C STRICT;  select * from nc_subdataset_info ('oss://ossext-example.sh1a.qingstor.com/netcdf/input.nc access_key_id=xxx secret_access_key=xxx oss_type=QS ') AS tbl(name text, sqlq text);
--Results of the netcdf SQL Function name | sqlq-------------------------+-------------------------------------------------------------------------------- icg/gis/netcdf/input.nc | SUBDATASET_1_NAME=NETCDF:"/vsiossext/netcdf/input.nc":TMP_P0_L103_GLL0 : SUBDATASET_1_DESC=[1x205x253] TMP_P0_L103_GLL0 (32-bit floating-point) : SUBDATASET_2_NAME=NETCDF:"/vsiossext/netcdf/input.nc":initial_time0 : SUBDATASET_2_DESC=[1x18] initial_time0 (8-bit character) :Copy
导入数据: 创建外部表为NETCDF格式,用户填写subdataset字段选择子数据集。创建成功后用户可执行查询语句查看。 
--Create netcdf table:CREATE READABLE EXTERNAL TABLE osstbl_netcdf(filename text, rast raster, metadata text) LOCATION('oss://ossext-example.sh1a.qingstor.com/netcdf/input.nc subdataset=1 access_key_id=xxx secret_access_key=xxx oss_type=QS') FORMAT 'netcdf';
SELECT filename, st_value(rast, 3, 4) from osstbl_netcdf order by filename;
--Results of the netcdf filename | st_value-----------------+------------------ netcdf/input.nc | 260.100006103516(1 row)

小结


随着科技的发展,空间数据集不断增大,空间数据计算的复杂度也在不断提升。如何在这样的背景下有效提升空间数据处理效率、简化空间数据处理的过程,成为空间数据库需要重点考虑的问题。HashData从实际的科研项目与民生项目中得到灵感和契机,通过OSS 协议外部表,实现了MPP数据库并行处理能力在空间数据集上导入和空间数据处理上的融合,使得空间大数据项目能够依托HashData 数据库平台高效、灵活地处理更大的数据量与更加复杂的计算需求。