Answers:
您可以使用数据类型point
- (x,y)
可以是经纬度的组合。占用16个字节:float8
内部2个数字。
或使其成为两列类型float
(= float8
或double precision
)。每个8字节。
或real
(= float4
)如果不需要额外的精度。每个4个字节。
甚至即使numeric
您需要绝对精度。每组4位2字节,外加3-8字节开销。
该geometry
和geography
数据类型由附加模块提供了PostGIS并占据一个在你的表列。每个点占用32个字节。那里有一些额外的开销,例如SRID。这些类型存储(long / lat),而不存储(lat / long)。
float
数据类型。这使得坐标计算非常复杂。您应该使用PostGIS和geography
数据类型进行此类计算。
在PostGIS中,对于具有经度和纬度的点,存在地理数据类型。
要添加列:
alter table your_table add column geog geography;
要插入数据:
insert into your_table (geog) values ('SRID=4326;POINT(longitude latitude)');
4326是空间参考ID,表示它的数据是经度和纬度,与GPS中的相同。关于它的更多信息: http //epsg.io/4326
顺序为经度,纬度-因此,如果将其绘制为地图,则为(x,y)。
要找到最接近的点,您首先需要创建空间索引:
create index on your_table using gist (geog);
然后要求最接近给定点的5:
select *
from your_table
order by geog <-> 'SRID=4326;POINT(lon lat)'
limit 5;
如果您不需要PostGIS提供的所有功能,则Postgres(现在)提供了一个名为Earthdistance的扩展模块。它使用点或立方体根据距离计算的精度需求,数据类型。
现在,您可以使用earth_box函数-例如-查询某个位置特定距离内的点。
在PostGIS中,比起地理(圆形地球模型),几何学更受青睐,因为计算简单得多,因此速度更快。它还具有许多可用功能,但在很长的距离内精度较低。
将CSV导入到较长的纬度字段中DECIMAL(10,6)
。6位数是10厘米精度,对于大多数使用情况应该足够了。
然后投射您导入的数据
SELECT
--ST_SetSRID(ST_Point(long, lat),4326) geom -- the wrong way because SRID not set in geometry_columns table
ST_Point(long, lat)::geometry(Geometry, 4326) geom
INTO target_table
FROM source_table;
验证SRID不为零!
SELECT * FROM public.geometry_columns WHERE f_table_name = 'target_table';
使用WKT查看器和验证长纬度参数的顺序ST_AsEWKT(target_table.geom)
。
然后索引以获得最佳性能
CREATE INDEX idx_target_table_geom_gist
ON target_table USING gist(geom);