首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >距离返回值为空

距离返回值为空
EN

Stack Overflow用户
提问于 2014-05-31 22:20:55
回答 1查看 79关注 0票数 0

此处的SQL newb总数。我已经创建了两个SQL表,一个包含有关酒店的信息,另一个包含有关景点的信息。我正在尝试创建一个查询,我可以在其中输入景点的邮政编码,并让数据库返回半径为1英里、5英里和10英里的酒店的距离。

代码语言:javascript
复制
SELECT 
   hotels.*, 
   attractions.*,  
   ( ( ACOS( SIN(hotels.Hotel_Lat                                  * PI() / 180) 
           * SIN(attractions.Attraction_Lat                        * PI() / 180)
         +   
             COS(hotels.Hotel_Long                                 * PI() / 180)
           * COS(attractions.Attraction_Long                       * PI() / 180)
           * COS((hotels.Hotel_Long - attractions.Attraction_Long) * PI() / 180)
           ) * 180 / PI()
     ) * 60 * 1.1515
   ) as distance  
FROM hotels 
JOIN attractions  

此查询返回距离的'Null‘。我的表中填入了经纬度和邮政编码。你知道为什么会这样吗?我有一个负值的经度,如果这有区别的话?

使用MySQL社区服务器5.6.17。

示例数据-酒店中有7行数据。

代码语言:javascript
复制
Hotel_Name | Hotel_Address | Hotel_Lat | Hotel_Long
a            ST158DH        52.906438    -2.145523
b            ST161LF        52.827959    -2.129709

Attraction_Name | Attraction_Postcode | Attraction_Lat | Attraction_Long
a                   ST180BA              52.839509        -2.056964
b                   ST180TG              52.832820        -2.091124

总共有四个景点。

EN

回答 1

Stack Overflow用户

发布于 2014-06-01 04:10:14

使用Haversine formula (即使在很短的距离内也表现良好),尝试以下代码(或用于MySQL的等效代码):

代码语言:javascript
复制
select
     Hotel_Name
    ,Hotel_Address
    ,Attraction_Name
    ,Attraction_Address

    ,round(2 * atn2(sqrt(a),sqrt(1-a)),                       4) as DeltaRad 
    ,round(2 * atn2(sqrt(a),sqrt(1-a)) * (180.0 / pi()),      2) as DeltaDeg 
    ,round(2 * atn2(sqrt(a),sqrt(1-a)) * (180.0 / pi()) * 60, 2) as DeltaNMs 
    ,round(2 * atn2(sqrt(a),sqrt(1-a)) * 6371.0,              2) as DeltaKMs 
from (
  select 
       Hotel_Name
      ,Hotel_Address
      ,Attraction_Name
      ,Attraction_Address

      , SinHalfDeltaLatRad * SinHalfDeltaLatRad
      + CosCosLat 
      * SinHalfDeltaLngRad * SinHalfDeltaLngRad       as a
  from (
    SELECT 
        Hotel_Name
       ,Hotel_Address
       ,Attraction_Name
       ,Attraction_Address

       ,sin((h.Lat - a.Lat) * PI() / 180.0 / 2.0) as SinHalfDeltaLatRad  
       ,sin((h.Lng - a.Lng) * PI() / 180.0 / 2.0) as SinHalfDeltaLngRad  
       ,cos(a.Lat) * cos(a.Lat)                   as CosCosLat           
    FROM hotels      as h
    cross JOIN attractions as a  
  ) t
) t

为您的样本数据提供以下收益:

代码语言:javascript
复制
Hotel_Name           Hotel_Address Attraction_Name      Attraction_Address DeltaRad               DeltaDeg               DeltaNMs               DeltaKMs
-------------------- ------------- -------------------- ------------------ ---------------------- ---------------------- ---------------------- ----------------------
HotelA               ST158DH       AttractionA          ST180BA            0.0018                 0.1                    6.02                   11.15
HotelB               ST161LF       AttractionA          ST180BA            0.0011                 0.06                   3.75                   6.94
HotelA               ST158DH       AttractionB          ST180TG            0.0015                 0.09                   5.2                    9.63
HotelB               ST161LF       AttractionB          ST180TG            0.0006                 0.03                   1.97                   3.64
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23971092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档