达梦数据库(DM Database)支持存储和操作经纬度数据,主要可以通过以下方式实现:

1. 使用 DOUBLE 类型存储经纬度

最基本的方式是使用 DOUBLE 类型分别存储纬度(latitude)和经度(longitude),例如:

CREATE TABLE locations (
    id INT PRIMARY KEY,
    latitude DOUBLE NOT NULL,
    longitude DOUBLE NOT NULL
);

这种方式适用于简单查询,但如果需要进行地理计算(如计算两点距离),则需要手动编写计算公式。

2. 使用 ST_GEOMETRY 类型存储地理数据

达梦数据库支持 GIS(地理信息系统),可以使用 ST_GEOMETRY 类型来存储经纬度,并进行空间查询和计算。例如:

CREATE TABLE geo_locations (
    id INT PRIMARY KEY,
    geom ST_GEOMETRY NOT NULL
);

插入经纬度数据:

INSERT INTO geo_locations (id, geom) 
VALUES (1, ST_GeomFromText('POINT(116.4074 39.9042)', 4326));

这里 4326 代表 WGS84 坐标系(GPS 常用的坐标系)。

3. 计算两点间距离

可以使用 ST_Distance 计算两点之间的直线距离(单位:米):

SELECT ST_Distance(
    ST_GeomFromText('POINT(116.4074 39.9042)', 4326),
    ST_GeomFromText('POINT(121.4737 31.2304)', 4326)
) AS distance;

这里计算的是北京(116.4074, 39.9042)到上海(121.4737, 31.2304)的直线距离。

4. 空间索引优化查询

如果要对大量经纬度数据进行查询,建议创建 空间索引 以提高查询性能:

CREATE SPATIAL INDEX idx_geo ON geo_locations (geom);

然后可以用 空间范围查询 来查找附近的点,例如查找某个点 POINT(116.4074 39.9042) 5公里内的所有位置

SELECT * FROM geo_locations 
WHERE ST_Distance(geom, ST_GeomFromText('POINT(116.4074 39.9042)', 4326)) < 5000;

总结

  • 仅存储经纬度:使用 DOUBLE 类型
  • 需要空间计算(如距离、范围查询):使用 ST_GEOMETRY
  • 进行高效查询:使用 空间索引

如果你的业务涉及大量地理数据计算,推荐使用 ST_GEOMETRY + 空间索引 来提高效率。