代码之家  ›  专栏  ›  技术社区  ›  Chaddeus

这个mySQL“空间”查询在SQLServer2008中也可以工作吗?

  •  1
  • Chaddeus  · 技术社区  · 14 年前

    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;
    

    或者在SQLServer2008中有更好的方法来实现这一点吗?

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

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

    非常感谢您的帮助!

    2 回复  |  直到 14 年前
        1
  •  2
  •   Daniel Vassallo    14 年前

    看起来你在选择两点之间的距离。在SQLServer2008中,可以使用 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);
    

    p 将是一个类型字段 而不是两个分开的 decimal 领域。您可能还想创建一个 spatial index 在你的 更好的性能。

    使用 地理 数据类型,只需将字段指定为 地理 在你的 CREATE 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);
    
        2
  •  1
  •   Charles Bretana    14 年前

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

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

    你所需要做的就是把纬度和经度的差异转换成你使用的任何单位的英里数(雕像英里数,或是垂直英里数,随便什么)

    如果u r使用海里每度纬度=60海里。。。
    每个经度等于60*cos(纬度)nm
    在这里,如果两个点之间的距离都在25英里以内,则不需要;甚至不需要担心这一点和另一点之间的差异。。。