MySQL空間數(shù)據(jù)庫–查詢點到多點間的最短路徑
本文關(guān)鍵詞:空間參考系,由筆耕文化傳播整理發(fā)布。
當(dāng)SNS產(chǎn)品加入LBS的技術(shù)將會讓移動互聯(lián)網(wǎng)領(lǐng)域更加豐富多彩,例如:大眾點評,街旁,盛大切客 這些運行在智能手機端的應(yīng)用,當(dāng)用戶拿出手機就可以根據(jù)你當(dāng)前的所在地向你推薦一些有用的信息,例如:附近的美食,商鋪,周邊生活信息,等。 攻城師們,你有沒有
當(dāng)SNS產(chǎn)品加入LBS的技術(shù)將會讓移動互聯(lián)網(wǎng)領(lǐng)域更加豐富多彩,例如:大眾點評,街旁,盛大切客 這些運行在智能手機端的應(yīng)用,當(dāng)用戶拿出手機就可以根據(jù)你當(dāng)前的所在地向你推薦一些有用的信息,例如:附近的美食,商鋪,周邊生活信息,等。
攻城師們,你有沒有想過這些應(yīng)用背后的技術(shù)實現(xiàn)呢?手機端獲得當(dāng)前的坐標(biāo)后是怎么進行計算和查詢返回附件的結(jié)果呢?
用Java程序可以實現(xiàn)Dijkstra算法獲得點與多點之間最短路徑的計算結(jié)果,但是我個人認(rèn)為是一種暴力的方法,開發(fā)的簡化程度和計算的執(zhí)行效率不會非常高。
參考資料:
接著再往下想,用到數(shù)據(jù)庫技術(shù)是必然,但不會把節(jié)點的坐標(biāo)信息存儲到數(shù)據(jù)庫普通的字段中進行查詢,如果和Dijkstra算法相比不會簡化工作量也不會提高性能,但使用到MySQL中空間數(shù)據(jù)庫的概念就會簡化很多也會得到性能的提升,開源的MySQL Spatial空間索引機制就可以對點到多點之間的距離計算,類似的Spatial Database還有,PostGIS,SpatiaLite。
我的廢話:
在android手機上獲得當(dāng)前坐標(biāo)后,將數(shù)據(jù)整好錄入android中的SQLite數(shù)據(jù)庫也可以獲得當(dāng)前點對多點的最短路徑,也就是說在地理數(shù)據(jù)不會更新的場景下完全可以采用android手機上的數(shù)據(jù)庫完成這項工作,沒有必要非要利用服務(wù)器端的Spatial Database完成最短路徑的計算。
MySQL空間數(shù)據(jù)幾種主要類型:
– GEOMETRY Geometry是層次結(jié)構(gòu)的根類。它是一種非實例化類,但具有很多屬性,,這些屬性對由任何Geometry子類創(chuàng)建的所有幾何值來說是共同的。
– POINT 代表坐標(biāo)空間中單個位置的幾何類,他的屬性包含 X-坐標(biāo)值,Y-坐標(biāo)值。
– LINESTRING 具有線段的坐標(biāo),由每個連續(xù)的點對(兩點)定義。如果僅包含兩點,LineString為Line。 如果它既是簡單的也是封閉的,LineString為LinearRing。
– POLYGON 它由單個外部邊界以及0或多個內(nèi)部邊界定義,其中,每個內(nèi)部邊界定義為Polygon中的1個孔。例如:在地區(qū)地圖上,Polygon對象可表示森林。
– MULTIPOINT MultiPoint是一種由Point元素構(gòu)成的幾何對象集合。這些點未以任何方式連接或排序。
– MULTILINESTRING MultiLineString是一種由 LineString元素構(gòu)成的MultiCurve幾何對象集合,例如:河流體系或高速路系統(tǒng)。
– MULTIPOLYGON MultiPolygon是一種由Polygon元素構(gòu)成的幾何對象集合。在地區(qū)地圖上,MultiPolygon可表示湖泊系統(tǒng)。
– GEOMETRYCOLLECTION 他是由1個或多個任意類幾何對象構(gòu)成的幾何對象。GeometryCollection中的所有元素必須具有相同的空間參考系(即相同的坐標(biāo)系).
以上幾種的類型依賴關(guān)系,如圖所示:
了解過上述一些基本知識,下面來創(chuàng)建一張商戶表,并且包含定義的空間數(shù)據(jù)庫的POINT字段:
Create table shop (
shop_id int(3) primary key,
Location POINT,
Shop_na vachar(100),
Shop_info vachar(300)
);
插入幾條商家的門店信息,其中采用GeomFromText方法將坐標(biāo)的數(shù)據(jù)庫插入POINT字段中,例如:
insert into shop values (‘XXX’,’,GeomFromText(‘POINT(1 1)’),’XX店’,’ '其他信息');
下面將根據(jù)客戶當(dāng)前所在位置在MySQL中查詢,搜索出在當(dāng)前位置附近的一定范圍內(nèi)的門店,并且可以做到按距離由近到遠(yuǎn)排列顯示出來,從讓用戶而找到離他最近的門店。
把客戶當(dāng)前所在位置可設(shè)成變量 ,例如:set @center=GeomFromText(‘POINT(10 10)’);
再把要找到最近門店可以縮小搜索范圍 設(shè)半徑,添加搜索條件
例:set @radius=30;
WHERE SQRT(POW( ABS( X(location) – X(@center)), 2) + POW( ABS(Y(location) – Y(@center)), 2 )) < @radius
最近門店搜索,完整的SQL示例:
SELECT shop_id,shop_na, SQRT(POW( ABS( X(Location) – X(@center)), 2) + POW(ABS(Y(Location) – Y(@center)), 2 )) AS distance
FROM shop WHERE SQRT(POW( ABS( X(location) – X(@center)), 2) + POW( ABS(Y(location) – Y(@center)), 2 )) < @radius
order by distance;
其中涉及的數(shù)學(xué)函數(shù)SQRT(x):表示求一個數(shù)x的平方根。POW(x,y):包含兩個參數(shù)表示求x的y次冪。ABS(x):表示求數(shù)X的絕對值。整個SQRT(POW( ABS( X(Location) – X(@center)), 2) + POW(ABS(Y(Location) – Y(@center)), 2 ))這個SQL語句實現(xiàn)的是一個算術(shù)表達式
即兩點間的直線距離。
比如說現(xiàn)在有兩個點坐標(biāo)A(x1,y1),B(x2,y2) 要求線段AB長度 就是用
所以用到這三個函數(shù):
SQRT(x):表示求一個數(shù)x的平方根。就相當(dāng)于那個根號!蘹
POW(x,y):包含兩個參數(shù)表示求x的y次冪
例如pow(2,3)就表示23,那么POW((X1-X2),2)就相當(dāng)于〖(x1-x2)〗^2
ABS(x):表示求數(shù)X的絕對值。|x| ABS(x1-x2)就等于|x1-x2|.
根據(jù)那個公式組合起來就行了
整個SQRT(POW( ABS( X(Location) – X(@center)), 2) + POW(ABS(Y(Location) – Y(@center)), 2))這句話就是用來表示這個公式的
這個公式計算得出來的值就是兩點間的直線距離。
參考資料:
口水:
以上部分內(nèi)容來自 NJ-AMT 實習(xí)生余珊的分析報告。
–end–
本文關(guān)鍵詞:空間參考系,由筆耕文化傳播整理發(fā)布。
本文編號:270476
本文鏈接:http://sikaile.net/wenshubaike/jajx/270476.html