加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

距离内的Oracle空间搜索

发布时间:2020-12-12 13:13:33 所属栏目:百科 来源:网络整理
导读:我有下表城市: ID(int),City(char),latitude(float),longitude(float). 现在根据用户的经度(例如:44.8)和纬度(例如:46.3),我想在100英里/公里范围内搜索他附近的所有城市. 我找到了一些例子,但不知道如何使它们适应我的情况 select *from GEO.Cities awhe
我有下表城市:

ID(int),City(char),latitude(float),longitude(float).

现在根据用户的经度(例如:44.8)和纬度(例如:46.3),我想在100英里/公里范围内搜索他附近的所有城市.

我找到了一些例子,但不知道如何使它们适应我的情况

select *
from GEO.Cities a
where SDO_WITHIN_DISTANCE([I don`t know],MDSYS.SDO_GEOMETRY(2001,8307,MDSYS.SDO_POINT_TYPE(44.8,46.3,NULL),NULL,'distance = 1000') = 'TRUE';

任何帮助,将不胜感激.

P.S:如果可以有距离并进行分类

P.P.S:由于性能问题,我想以这种方式做到这一点,我用这种方式做到了这一点http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL,但这需要太长时间……

解决方法

对于mySQL距离搜索,你有很好的参考.

忘记Oracle Spatial的东西.代码太多,复杂性太大,没有足够的增值.

这是一个可以解决问题的查询.这使用法定里程的距离.编辑这修复了mdarwin提到的错误,如果你试图将它用于北极或南极的位置,则以划分检查为代价.

SELECT id,city,LATITUDE,LONGITUDE,distance
    FROM
  (
    SELECT id,(3959 * ACOS(COS(RADIANS(LATITUDE)) 
                 * COS(RADIANS(mylat)) 
                 * COS(RADIANS(LONGITUDE) - RADIANS(mylng)) 
                 + SIN(RADIANS(LATITUDE)) 
                 * SIN(RADIANS(mylat)) 
               ))
           AS distance,b.mydst
      FROM Cities
      JOIN (
        SELECT :LAT AS mylat,:LONG AS mylng,:RADIUS_LIMIT AS mydst
          FROM DUAL
      )b ON (1 = 1)
     WHERE LATITUDE >=  mylat -(mydst/69)
       AND LATITUDE <=  mylat +(mydst/69)
       AND LONGITUDE >= mylng -(mydst/(69 * COS(RADIANS(mylat))))
       AND LONGITUDE <= mylng +(mydst/(69 * COS(RADIANS(mylat))))
  )a
   WHERE distance <= mydst
   ORDER BY distance

如果您以公里为单位工作,请将mydst / 69更改为mydst / 111.045,并将3959更改为6371.4. (1/69将英里转换为度数; 3959是行星半径的值.)

现在,您可能会想要将这个大型查询用作“魔术黑盒子”.不要这样做!这不是很难理解,如果你理解它,你将能够做得更好.这是正在发生的事情.

该子句是使查询快速运行的核心.它会在您的Cities表中搜索您指定的点附近的城市.

WHERE LATITUDE >=  mylat -(mydst/69)
       AND LATITUDE <=  mylat +(mydst/69)
       AND LONGITUDE >= mylng -(mydst/(69 * COS(RADIANS(mylat))))
       AND LONGITUDE <= mylng +(mydst/(69 * COS(RADIANS(mylat))))

要使它工作,你肯定需要一个LATITUDE列的索引. LONGITUDE列上的索引也会有所帮助.它进行近似搜索,寻找在您的点附近的地球表面上的准矩形块内的??行.它选择了太多的城市,但不是太多.

此子句允许您从结果集中删除额外的城市:

WHERE distance <= mydst

该子句是用于计算每个城市与您的观点之间的大圆距离的半正公式.

(3959 * ACOS(COS(RADIANS(LATITUDE)) 
                 * COS(RADIANS(mylat)) 
                 * COS(RADIANS(LONGITUDE) - RADIANS(mylng)) 
                 + SIN(RADIANS(LATITUDE)) 
                 * SIN(RADIANS(mylat))

此子句允许您输入您的点和半径限制,只需输入一次作为查询的绑定变量.它很有用,因为各种公式多次使用这些变量.

SELECT :LAT AS mylat,:RADIUS_LIMIT AS mydst
          FROM DUAL

查询的其余部分只是组织事物,以便您按距离选择和排序.

这是一个更完整的解释:http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读