當(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ā)的簡化程度和計(jì)算的執(zhí)行效率不會(huì)非常高。
參考資料:http://baike.baidu.com/view/7839.htm
接著再往下想,用到數(shù)據(jù)庫技術(shù)是必然,但不會(huì)把節(jié)點(diǎn)的坐標(biāo)信息存儲(chǔ)到數(shù)據(jù)庫普通的字段中進(jìn)行查詢,如果和Dijkstra算法相比不會(huì)簡化工作量也不會(huì)提高性能,但使用到MySQL中空間數(shù)據(jù)庫的概念就會(huì)簡化很多也會(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ù)庫也可以獲得當(dāng)前點(diǎn)對(duì)多點(diǎn)的最短路徑,也就是說在地理數(shù)據(jù)不會(huì)更新的場景下完全可以采用android手機(jī)上的數(shù)據(jù)庫完成這項(xiàng)工作,沒有必要非要利用服務(wù)器端的Spatial Database完成最短路徑的計(jì)算。
MySQL空間數(shù)據(jù)幾種主要類型:
– GEOMETRY Geometry是層次結(jié)構(gòu)的根類。它是一種非實(shí)例化類,但具有很多屬性,這些屬性對(duì)由任何Geometry子類創(chuàng)建的所有幾何值來說是共同的。
– POINT 代表坐標(biāo)空間中單個(gè)位置的幾何類,他的屬性包含 X-坐標(biāo)值,Y-坐標(biāo)值。
– LINESTRING 具有線段的坐標(biāo),由每個(gè)連續(xù)的點(diǎn)對(duì)(兩點(diǎn))定義。如果僅包含兩點(diǎn),LineString為Line。 如果它既是簡單的也是封閉的,LineString為LinearRing。
– 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í),下面來創(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):表示求一個(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語句實(shí)現(xiàn)的是一個(gè)算術(shù)表達(dá)式
即兩點(diǎn)間的直線距離。
比如說現(xiàn)在有兩個(gè)點(diǎn)坐標(biāo)A(x1,y1),B(x2,y2) 要求線段AB長度 就是用這個(gè)公式去計(jì)算。把A看成當(dāng)前位置B看成一個(gè)門店,不就是相當(dāng)于計(jì)算當(dāng)前位置到門店這兩個(gè)點(diǎn)的距離嗎。坐標(biāo)點(diǎn)有了帶進(jìn)去就行,等于現(xiàn)在只要能用函數(shù)把這個(gè)公式表示出來就可以了。
所以用到這三個(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è)公式組合起來就行了
整個(gè)SQRT(POW( ABS( X(Location) – X(@center)), 2) + POW(ABS(Y(Location) – Y(@center)), 2))這句話就是用來表示這個(gè)公式的
,
這個(gè)公式計(jì)算得出來的值就是兩點(diǎn)間的直線距離。
參考資料:
http://dev.mysql.com/doc/refman/5.1/zh/spatial-extensions-in-mysql.html
http://en.wikipedia.org/wiki/Spatial_database
口水:
以上部分內(nèi)容來自 NJ-AMT 實(shí)習(xí)生余珊的分析報(bào)告。
–end–
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com