PostGIS中数据类型地理(点,4326)的大小?
Posted
技术标签:
【中文标题】PostGIS中数据类型地理(点,4326)的大小?【英文标题】:Size of data type Geography(Point, 4326) in PostGIS? 【发布时间】:2015-05-26 09:45:58 【问题描述】:它的构造函数接受一个 POINT 和一个 SRID。由于 POINT 是两个双精度数(每个 8 个字节),SRID 是一个整数(4 个字节),可以假设整个结构占用 8*2+4=20 个字节的存储空间吗?
【问题讨论】:
我不知道你的问题的答案,但我可以告诉你,这并不容易,应用一个简单的计算。数据库不仅存储数据,还存储该数据的索引。您甚至可以有多种类型的索引(有多种数据库索引类型(唯一、多列等),对于地理数据,您有一个 GIST 索引(通用搜索树)) srid 不是为每一行存储的,是列的一个特征。粗略估计为no_rows * 2 * 8 + 4
【参考方案1】:
看看ST_Mem_Size。这也为您提供了 toast 表的大小,因此比 pg_total_relation_size 和其他内置 Postgres 函数更合适,后者不适用——尽管这只适用于更大的几何图形。回到你的问题,为了一点,
SELECT ST_Mem_Size(ST_MakePoint(0, 0));
返回 32 个字节,即 4 个双精度字节(而不是您期望的 2 个字节)。这样做的原因是有额外的元数据,例如要存储的字节序。
在 SRID 中添加,
SELECT ST_Mem_Size(ST_SetSRID(ST_MakePoint(0, 0), 4326));
返回 32 个字节。
现在,一个线串,有两个点,
SELECT ST_Mem_Size(ST_SetSRID(ST_GeomFromText('LINESTRING(0 0, 1 1)'), 4326));
返回 48 个字节,现在只有 16 个字节,即 2 个双倍,比 Point 大,如您所料。
现在,如果你缓冲这一点,
SELECT ST_Mem_Size(ST_SetSRID(ST_Buffer(ST_MakePoint(0, 0), 10), 4326));
你得到 568 字节,这是因为默认情况下每个四分之一圆段有 8 个点,加上末尾有一个重复的起点,你可以检查一下,
SELECT ST_NPoints(ST_SetSRID(ST_Buffer(ST_MakePoint(0, 0), 10), 4326));
给你 33*16 = 528,其他 40 个字节来自 SRID、字节序等。
【讨论】:
感谢您的回答。您能否评论一下 SRID,它是为每条记录存储还是为整列存储?来自en.wikipedia.org/wiki/SRID:在启用空间的数据库中 [...],SRID 用于唯一标识用于定义空间数据列或空间列中的单个空间对象的坐标系(取决于空间实现)。”跨度> 是的,所以每个几何记录只包含一次 SRID,这就是为什么当你从一个点转到一个有两个点的 LineString 时,都设置了 SRID,大小只增加了 16 个字节,因为 SRID 已被记录。 我知道向 LineString 添加更多点不会添加更多 SRID。但是我们可以有多个 LineString 对象,每条记录一个,然后我仍然想知道每条记录是否包含自己的 SRID。 是的,每条记录仍将包含自己的 SRID,因为您可以在同一列中混合具有不同 SRID 的几何图形,尽管在我看来这不是一个好主意。以上是关于PostGIS中数据类型地理(点,4326)的大小?的主要内容,如果未能解决你的问题,请参考以下文章
Postgis 中 2 点之间的距离,单位为 srid 4326,以米为单位
有啥方法可以从作为 LAT/LONG 作为 PostGIS 中的地理数据类型插入的 GPS 坐标中恢复数据?
如何使用 Hibernate 在 PostGIS 中将 geojson(在 javascript 中)保存到几何(MultiPolygon,4326)