[英]Use $within with a buffered MondoDB Linestring
我需要使用MongoDB評估Point
與LineString
的接近程度。
因為$near
運算符只能將Point
與另一個Point
進行比較,所以我需要從LineString
生成一個多邊形,因此我可以使用$within
運算符。 LineString和多邊形邊緣之間的距離應表示我想要搜索的半徑,例如下面用紅色表示:
什么可能是一個有用的算法,以實現這一目標?
我認為編寫自己的函數要容易得多
找到點和線之間的(垂直)距離,然后通過多邊形方法創建多邊形線的粗細。
哪里:
P0,P1
是線端點 P
是重點 d
是它們之間的距離 線定義為: p(t)=P0+(P1-P0)*t
其中t=<0.0,1.0>
所以函數應該這樣做:
創建垂直線
q(t)=P+DQ*u
其中u=(-inf,+inf)
DQ
是垂直向量(P1-P0) 在2D中,您可以像這樣(x,y) -> (y,-x)
輕松獲得它。 在更高的維度中,使用具有一些非共面向量的交叉積。
計算線與線交叉點
有很多東西關於這個谷歌或自己在這里解決方程你可以提取我的實施。
現在成功交集后
只計算d
作為P
和交點之間的距離。 不要忘記參數t
必須在范圍內。 如果不是(或沒有交叉點)則return min(|P-P0|,|P-P1|)
[提示]
t
和u
參數可以直接從相交測試中獲得,因此如果將(P1-P0)
的垂直向量歸一化為size = 1
那么交點的abs(u)
參數就是距離
[筆記]
我不熟悉mongodb,所以如果你沒有辦法在里面使用自己的測試,那么這個答案是粗略過時的。
不幸的是,MongoDB提供了非常基本的地理空間查詢,因此您應該自己創建緩沖區。 您可以在此處閱讀如何操作: 計算圍繞多點線的多邊形
如果您有像WGS84這樣的經度/緯度坐標,則必須調整此代碼; 在這里閱讀如何計算球體上的點之間的距離https://en.wikipedia.org/wiki/Haversine_formula
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.