2015-06-06 50 views
0

我知道我可能會因爲問這個問題而被罵,但我希望有人能幫助我指出正確的方向。用neo4j找路/導航

我正在嘗試創建一個像Google地圖一樣的應用程序查找應用程序,但它會將路線標記爲地圖上的多個點。

我試圖讓一個動物運輸的工具,允許多人在從A點的路徑見面B.我想我念你可以用圖形數據庫做到這一點。

任何人都可以提供地圖數據庫,文章等資源來幫助我嗎?我一直在試圖谷歌的文章,但可以找到任何匹配,所以我認爲我使用了錯誤的術語如「尋路」或「方向」

謝謝!

+0

你能澄清你的意思嗎?在地圖上標記多個點的路線?你稍後提到從A到B的路徑,但這隻有2點。 – cybersam

回答

2

我想start with this article。要問一個更具體的問題,你需要一個數據模型和你想要做的一個例子。

但是一般來說,使用的語言可能是「最短路徑」。一般來說,如果您試圖找到從A點到B點的路徑,那麼您正在尋找「路徑成本」最小的「最短路徑」。有時候成本是距離,有時候成本是時間 - 但是無論哪種方式,你通常都在尋找最短路徑,而不是任何路徑。由FrobberOfBits提到

+0

根據運輸鏈中的人數,它將成爲2點和x點之間的最佳映射路線。根據他們願意開車在每個點的中點開多遠的距離,愛也能夠做到每個人的半徑 –

4

圖形數據庫可以很好地用於尋路,尤其是shortestPath

只要您有可以形成路徑的節點,就可以很好地工作。根據我在您的評論中瞭解的內容,事實上,您需要首先根據用戶駕駛偏好動態構建這些節點。

此外,顯然你目前沒有A點到B點的數據模型?

這是我會怎樣着手,簡要:

用例是A點是我的家,點2是在那裏生活的Neo4j的社區照顧者,在地圖上這將是:

enter image description here

所有小白在從A到B的路由點可以是Neo4j的節點。

現在你說,對於例如,有一個真棒女孩50公里,以加盟路線的駕駛偏好,因此目前的路線必須改變。

enter image description here

在你的應用程序,你不強制用戶選擇一箇中間點,你將不得不在飛行創建它。

所以我快速的解決方案,是讓在半徑,這將是最接近於初始路徑的目標點的點。

要實現它,首先你需要從女孩的當前位置的初始方位到目的地(這裏德累斯頓)

凡LAT1和lon1是女孩的位置,LAT2,lon2的德累斯頓的位置

然後,鑑於此初始方位,您可以計算從軸承bearing50公里的距離中的女孩開始的位置,例如

在PHP它會是什麼樣子(測試):

// Function that calculate new coordinates from point A 
// Given a bearing and a distance to point B 
function getAwayPosition($lat1, $lon1, $lat2, $lon2, $distance) 
{ 
    // Getting true course from point A to point B 
    $la1 = deg2rad($lat1); 
    $la2 = deg2rad($lat2); 
    $lo1 = deg2rad($lon1); 
    $lo2 = deg2rad($lon2); 

    $y = sin($la2-$la1)*cos($lo1); 
    $x = cos($lo1*sin($lo2))-sin($lo1)*cos($lo2)*cos($la2-$la1); 
    $course = fmod(rad2deg(atan2($y, $x)+360), 360); 

    // Getting the new lat/lon points from lat1/lon1 given the course and the distance 
    $bearing = deg2rad($course); //back to radians for the coordinates calculation 
    $laa = asin(sin($la1 * cos($distance/6371 + $la1 * cos($course)))); 
    $loo = $lo1 + atan2(sin($bearing) * sin($distance/6371) * cos($la1), cos($distance/6371) - sin($la1) * sin($laa)); 

    return array(
     'lat' => rad2deg($laa), 
     'lon' => rad2deg($loo), 
     'bearing' => $course 
    ); 
} 

注:也有haversin功能Cypher支架計算地球的距離,我沒有打那麼多與它雖然

因此,您可以添加一個代表女孩所需位置的節點,以加入旅程。

到目前爲止,我們現在已經3良好的節點爲Neo4j的:

enter image description here

現在,我認爲這將是最多可爲過程的其餘部分的數據模型,如果從A到B的路由不要在數據庫中形成已有的Neo4j節點,您可以通過使用Google Maps API計算所有點的距離來動態構建它,並將其設置爲關係屬性。 然後你可以做一個Cypher最短路徑並減少關係距離屬性。

如果您已經有節點代表從A到B的初始路線的多箇中間點,則可以使用Neo4j Spatial並從女孩的所需位置到路線的中間節點獲取最近點並創建一個關係與距離。 再次shortestPath最佳映射路線。

第二個解決方案會更好,因爲你會立刻有一個圖表一起玩:

enter image description here

和簡單的Cypher查詢,如果你想用最少公里的路徑:

MATCH (a:Point {id:'A'}), (b:Point {id:'B'}) 
MATCH p=allShortestPaths((a)-[:NEXT_POINT]-(b)) 
RETURN p, reduce(totalKm = 0, x in relationships(p)| totalKm + x.kilometers) as distance 
ORDER BY distance ASC 

也有Djikstra算法與成本性能可與Neo4j的REST API http://neo4j.com/docs/stable/rest-api-graph-algos.html

個一些資源:

所以,作爲一個結論,如果你想使用的Neo4j確定最佳路線 ,你需要幫助他在數據庫中的一些數據;-)

+0

哦,我的上帝,真棒!非常感謝你提供的所有信息 –

+0

我用經過測試的PHP代碼取代了JS代碼 –

3

你看起來要描述的是從A到B經由不同的航點(人的位置)的路線,但是目標是從A到B的總距離被最小化。具有這些特徵的圖表中的路徑稱爲Minimum Spanning Tree。最重要的是,人們可以通過旅行來實現「主要路線」的事實只是引入了額外的路標,它並沒有改變整體問題,也沒有改變它的傳統解決方式。

Cypher和REST API都沒有函數來計算最小生成樹,不幸的是,簡單地收集各個節點之間的最短路徑(例如使用Dijkstra算法),然後嘗試從這些最短路徑段創建路徑將不是最優的在一般情況下。

但是,通過服務器插件或Neo4j中的非託管擴展來實現Prim's algorithm並不困難,我建議您查看一下。

+0

你在哪裏找到了該國的地理數據庫? –