oracle近似查找,距离内的Oracle空间搜索
對于mySQL距離搜索,你有很好的參考.
忘記Oracle Spatial的東西.代碼太多,復雜性太大,沒有足夠的增值.
這是一個可以解決問題的查詢.這使用法定里程的距離.編輯這修復了mdarwin提到的錯誤,如果你試圖將它用于北極或南極的位置,則以劃分檢查為代價.
SELECT id, city, LATITUDE, LONGITUDE, distance
FROM
(
SELECT id,
city,
LATITUDE, LONGITUDE,
(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,
:LONG AS mylng,
:RADIUS_LIMIT AS mydst
FROM DUAL
查詢的其余部分只是組織事物,以便您按距離選擇和排序.
總結
以上是生活随笔為你收集整理的oracle近似查找,距离内的Oracle空间搜索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下能运行python,(转)L
- 下一篇: Facade 和 Mediator 模式