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