MSSQL中经纬度坐标的排序处理

介绍

在MSSQL中,经纬度坐标的存储方式可以是浮点数或者字符串,可以通过STPointFromText函数将字符串转换为点类型来存储。然而,在进行经纬度排序处理时,需要进行一些特殊的处理,下面将详细介绍如何进行排序。

按经度排序

存储经纬度

在MSSQL中,经纬度可以使用浮点数类型进行存储,例如下面的代码:

CREATE TABLE locations (id INT, longitude FLOAT, latitude FLOAT)

INSERT INTO locations (id, longitude, latitude)

VALUES (1, -122.419416, 37.774929),

(2, -118.243685, 34.052234),

(3, -77.036871, 38.907192),

...

在存储经纬度时,要注意经度是负数的情况。另外,也可以使用字符串类型进行存储,例如下面的代码:

CREATE TABLE locations (id INT, coord VARCHAR(MAX))

INSERT INTO locations (id, coord)

VALUES (1, 'POINT(-122.419416 37.774929)'),

(2, 'POINT(-118.243685 34.052234)'),

(3, 'POINT(-77.036871 38.907192)'),

...

按经度排序

下面是按照经度进行排序的代码:

SELECT id, longitude, latitude

FROM locations

ORDER BY longitude ASC;

这里的关键是“ORDER BY longitude ASC”,表示按照经度升序排列。如果要按照降序排列,则将“ASC”改为“DESC”。

按距离排序

存储经纬度

如果要将经纬度用于按照距离排序,最好使用STPointFromText函数将字符串转换为点类型进行存储。下面是存储经纬度的代码:

CREATE TABLE locations (id INT, coord VARCHAR(MAX))

INSERT INTO locations (id, coord)

VALUES (1, 'POINT(-122.419416 37.774929)'),

(2, 'POINT(-118.243685 34.052234)'),

(3, 'POINT(-77.036871 38.907192)'),

...

计算距离

要计算两个点之间的距离,需要使用STDistance函数。下面是计算距离的代码:

SELECT A.id, B.id, A.coord.STDistance(B.coord) AS distance

FROM locations A, locations B

WHERE A.id < B.id;

这里用到了自身连接,将locations表连接两次,因此需要给它们起不同的别名。“WHERE A.id < B.id”表示只计算一次距离,即id更小的点到id更大的点之间的距离,因为距离是对称的。

按距离排序

下面是将locations表按照离指定点的距离排序的代码:

DECLARE @point VARCHAR(MAX) = 'POINT(-122.419416 37.774929)';

SELECT id, coord.STDistance(geometry::STGeomFromText(@point, 4269)) AS distance

FROM locations

ORDER BY distance ASC;

这里的关键是“ORDER BY distance ASC”,表示按照距离升序排列。如果要按照降序排列,则将“ASC”改为“DESC”。

结论

MSSQL中将经纬度用于排序,可以使用浮点数类型或者将字符串转换为点类型进行存储。按照经度进行排序时,只需要使用“ORDER BY longitude ASC/DESC”。按照距离进行排序时,需要使用STPointFromText函数将字符串转换为点类型,使用STDistance函数计算距离,同时排序时使用“ORDER BY distance ASC/DESC”。

数据库标签