摘要:在做和地圖有關的項目的時候,有時候會遇到這樣的需求,比如已知圓中心的經緯度,手動輸入它的半徑得到這個圓范圍內所有的隨機點。求圓半徑內點的代碼主要的業務是這句是緯度和米的比例關系是經度和米的比例關系最后根據車牌號模塊查詢。
在做和地圖有關的項目的時候,有時候會遇到這樣的需求,比如:
已知圓中心的經緯度(lng, lat),手動輸入它的半徑radius,得到這個圓范圍內所有的隨機點。
我用的是百度地圖js-sdk。
理論部分,喜歡看代碼可以直接跳過:
從上圖可以看出,圓1的經緯度是(114.132384, 22.539816)用(x1, y1)表示,圓2的經緯度是(114.131888, 22.533516)用(x2, y2)表示
我不可能用abs(x1 - x2) + abs(y1 - y2) <= radius這樣的邏輯去判斷圓1是否在以圓2為中心點,radius為半徑的圓范圍內,因為這樣不是兩點之間的最佳路徑。(abs為取絕對值函數)
我需要用到初中數學學到過的勾股定理知識,用(abs(x1-x2))^2 + (abs(y1-y2))^2 <= radius^2來獲得兩點之間最短路徑,也就是把這個想象成一個直角三角形,求它的斜邊。
我通過js將原點的經緯度和半徑傳到后臺,后臺用java,用的是mybatis框架,數據庫用的Oracle。
js和java就是簡單的數據傳輸,可以省略,業務邏輯主要在sql部分:
表結構:車牌號,緯度,經度,時間。
先根據相同車牌號用GROUP BY去重,取最大時間的一條數據。
求圓半徑內點的sql代碼:
SELECT G1.* FROM ${tableName} G1, ( SELECT MIN(UUID) AS UUID, MAX(LOCATIONTIME) FROM ${tableName} GROUP BY VEHICLENO ) G2 WHERE G1.UUID = G2.UUID AND POWER(ABS((G1.LAT / 0.00000899 - #{lat} / 0.00000899)), 2) + POWER(ABS((G1.LON / 0.00001141 - #{lon} / 0.00001141)), 2) POWER(#{radius}, 2) AND VEHICLENO LIKE CONCAT(#{chepaihao}, "%")
主要的業務是這句:
POWER(ABS((G1.LAT / 0.00000899 - #{lat} / 0.00000899)), 2) + POWER(ABS((G1.LON / 0.00001141 - #{lon} / 0.00001141)), 2) POWER(#{radius}, 2)
0.00000899是緯度和米的比例關系: 1m = 0.00000899°
0.00001141是經度和米的比例關系: 1m = 0.00001141°
最后根據車牌號模塊查詢。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106670.html
摘要:在做和地圖有關的項目的時候,有時候會遇到這樣的需求,比如已知圓中心的經緯度,手動輸入它的半徑得到這個圓范圍內所有的隨機點。求圓半徑內點的代碼主要的業務是這句是緯度和米的比例關系是經度和米的比例關系最后根據車牌號模塊查詢。 在做和地圖有關的項目的時候,有時候會遇到這樣的需求,比如:已知圓中心的經緯度(lng, lat),手動輸入它的半徑radius,得到這個圓范圍內所有的隨機點。 我用的...
摘要:說明這篇文章說如何用畫出漂亮的下雨效果,先看看最后實現的效果吧。 說明 這篇文章說如何用canvas畫出漂亮的下雨效果,先看看最后實現的效果吧。 效果圖showImg(https://segmentfault.com/img/bV8ITm?w=936&h=532); 解釋 看圖來分析下,我們需要實現哪些效果。1、雨滴下落效果,移動鼠標控制下落方向 2、雨滴下落散成小水珠,小水珠的移動...
閱讀 632·2021-08-17 10:15
閱讀 1715·2021-07-30 14:57
閱讀 1971·2019-08-30 15:55
閱讀 2813·2019-08-30 15:55
閱讀 2704·2019-08-30 15:44
閱讀 662·2019-08-30 14:13
閱讀 2380·2019-08-30 13:55
閱讀 2588·2019-08-26 13:56