1

在我开始对我的 Web 应用程序进行相当大的检修以使用空间查询之前,我想知道这个 MySQL 查询是否适用于 SQL Server 2008:

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * 
        cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * 
        sin( radians( lat ) ) ) ) AS distance 
FROM markers HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20;

或者在 SQL Server 2008 中有没有更好的方法来做到这一点?

我的数据库目前存储日本军事基地附近的企业经纬度。但是,我正在查询表以查找包含指定基地 id 的企业。

Biz table
----------------------
PK BizId bigint (auto increment)
Name
Address
Lat
Long
**FK BaseId int (from the MilBase table)**

基于中心纬度/经度和给定半径(以公里为单位)的空间查询将更适合该应用程序,并将开辟一些新的可能性。

任何帮助是极大的赞赏!

4

2 回答 2

2

看起来您正在选择两点之间的距离。在 SQL Server 2008 中,您可以使用数据类型的STDistance方法。geography这看起来像这样:

SELECT   TOP 20
         geography::STGeomFromText('POINT(-122.0 37.0)', 4326).STDistance(p) 
FROM     markers
WHERE    geography::STGeomFromText('POINT(-122.0 37.0)', 4326).STDistance(p) < 25
ORDER BY geography::STGeomFromText('POINT(-122.0 37.0)', 4326).STDistance(p);

wherep将是一个类型的字段,geography而不是两个单独的decimal字段。您可能还想在字段上创建空间索引p以获得更好的性能。

要使用geography数据类型,只需将您的字段指定geographyCREATE TABLE

CREATE TABLE markers ( 
    id     int IDENTITY (1,1),
    p      geography, 
    title  varchar(100) 
);

现在将值插入markers表中将如下所示:

INSERT INTO markers (id, p, title) 
VALUES (
    1,
    geography::STGeomFromText('POINT(-122.0 37.0)', 4326),
    'My Marker'
);    

-122.0经度在哪里,37.0纬度在哪里。

创建空间索引看起来像这样:

CREATE SPATIAL INDEX  ix_sp_markers
                      ON markers(p)
                      USING GEOGRAPHY_GRID
                      WITH ( GRIDS = (HIGH, HIGH, HIGH, HIGH),
                             CELLS_PER_OBJECT = 2,
                             PAD_INDEX = ON);
于 2010-07-05T15:46:54.463 回答
1

如果您只对检索 25 英里内的点感兴趣,那么在距离计算中绝对不需要使用球面或大圆数学......仅使用标准的笛卡尔距离公式就足够了......

Where  Square(Delta-X) + Square(Delta-Y) < 225  

您需要做的就是将纬度差异和经度差异转换为您使用的任何单位的英里数(雕像英里海里等)

如果你使用海里,每个纬度度 = 60 海里......
并且每个经度度等于 60 * cos(Latitude) 海里
如果两个点都在 25 海里之内,你甚至不需要担心关于这个因素从一个点到另一个点之间的差异......

于 2010-07-05T15:54:11.007 回答