介绍
在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”。