摘要:數(shù)據(jù)將具有如下個(gè)特點(diǎn)將二維的經(jīng)緯度轉(zhuǎn)換成字符串,比如下圖展示了北京個(gè)區(qū)域的字符串,分別是,等等,每一個(gè)字符串代表了某一矩形區(qū)域。例如,坐標(biāo)對(duì),位于北京安定門(mén)附近,后形成的值為。
作者簡(jiǎn)介:戴嘉樂(lè)( Mr.Maple ) | 前百度高級(jí)研發(fā)工程師 | IPFS應(yīng)用實(shí)踐者&布道師|一、概述 1.1 項(xiàng)目意義
個(gè)人網(wǎng)站:https://www.daijiale.cn
聯(lián)系方式:微信號(hào):daijiale6239。
打造地理位置信息與區(qū)塊鏈的關(guān)系對(duì)象模型,建立一套 人->位置->真實(shí)世界->傳遞信任->價(jià)值轉(zhuǎn)移->位置->人?的生態(tài)模型,實(shí)現(xiàn)用區(qū)塊鏈來(lái)索引真實(shí)世界的愿景。
通過(guò)GeoHash算法可以大幅度提高在龐大位置數(shù)據(jù)中的檢索效率,同時(shí)為應(yīng)用提供便捷的緩存機(jī)制。
IPFS&Filecoin技術(shù)則可以保證在一個(gè)可信的區(qū)塊鏈網(wǎng)絡(luò)中去大規(guī)模傳遞與海量位置信息相關(guān)聯(lián)的海量文件、數(shù)據(jù)集合,并保證傳遞過(guò)程中數(shù)據(jù)的產(chǎn)權(quán)價(jià)值。
1.2 名詞解釋DDApp
DDApp ( Data Decentered Application ):是一個(gè)數(shù)據(jù)去中心化應(yīng)用的概念,介于傳統(tǒng)應(yīng)用和去中心化應(yīng)用之間,解決了DApp不能依賴(lài)中心化的API的問(wèn)題,又保證部分需要去中心化場(chǎng)景下的數(shù)據(jù),在與應(yīng)用交互之外,還可以獨(dú)立分布部署、P2P傳輸。
IPFS
IPFS全稱(chēng)InterPlanetary File System,中文名:星際文件系統(tǒng),是一個(gè)旨在創(chuàng)建持久且分布式存儲(chǔ)和共享文件的網(wǎng)絡(luò)傳輸協(xié)議。它是一種內(nèi)容可尋址的對(duì)等超媒體分發(fā)協(xié)議可以讓網(wǎng)絡(luò)更快、更安全、更開(kāi)放。它是一個(gè)面向全球的、是一個(gè)點(diǎn)對(duì)點(diǎn)的分布式版本文件系統(tǒng),試圖將所有具有相同文件系統(tǒng)的計(jì)算設(shè)備連接在一起。
GeoHash
Geohash是由Gustavo Niemeyer發(fā)明的公共域地理編碼系統(tǒng),它將一個(gè)地理位置編碼成一串字母和數(shù)字。它是一種層次化的空間數(shù)據(jù)結(jié)構(gòu),將空間細(xì)分為網(wǎng)格形狀的桶,是一種被稱(chēng)為z -階空間填充曲線的應(yīng)用,下圖中就是GeoHash算法中常用的Peano曲線,一種四叉樹(shù)線性編碼方式。
GeoHash數(shù)據(jù)將具有如下3個(gè)特點(diǎn):
1 GeoHash將二維的經(jīng)緯度轉(zhuǎn)換成字符串,比如下圖展示了北京9個(gè)區(qū)域的GeoHash字符串,分別是WX4ER,WX4G2、WX4G3等等,每一個(gè)字符串代表了某一矩形區(qū)域。也就是說(shuō),這個(gè)矩形區(qū)域內(nèi)所有的點(diǎn)(經(jīng)緯度坐標(biāo))都共享相同的GeoHash字符串,這樣既可以保護(hù)隱私(只表示大概區(qū)域位置而不是具體的點(diǎn)),又比較容易做緩存,比如左上角這個(gè)區(qū)域內(nèi)的用戶(hù)不斷發(fā)送位置信息請(qǐng)求餐館數(shù)據(jù),由于這些用戶(hù)的GeoHash字符串都是WX4ER,所以可以把WX4ER當(dāng)作key,把該區(qū)域的餐館信息當(dāng)作value來(lái)進(jìn)行緩存,而如果不使用GeoHash的話,由于區(qū)域內(nèi)的用戶(hù)傳來(lái)的經(jīng)緯度是各不相同的,很難做緩存。
2)字符串越長(zhǎng),表示的范圍越精確。如圖所示,5位的編碼能表示10平方千米范圍的矩形區(qū)域,而6位編碼能表示更精細(xì)的區(qū)域(約0.34平方千米)。
3)字符串相似的表示距離相近(特殊情況后文闡述),這樣可以利用字符串的前綴匹配來(lái)查詢(xún)附近的POI信息。如下兩個(gè)圖所示,一個(gè)在城區(qū),一個(gè)在郊區(qū),城區(qū)的GeoHash字符串之間比較相似,郊區(qū)的字符串之間也比較相似,而城區(qū)和郊區(qū)的GeoHash字符串相似程度要低些。
例如,坐標(biāo)對(duì)(116.414597,39.955441),位于北京安定門(mén)附近,GeoHash后形成的值為WX4G2。
我們已經(jīng)知道現(xiàn)有的GeoHash算法使用的是Peano空間填充曲線,這種曲線會(huì)產(chǎn)生突變,造成了編碼雖然相似但距離可能相差很大的問(wèn)題,因此在基于個(gè)人位置查詢(xún)附近Poi信息時(shí),首先篩選GeoHash編碼相似的POI點(diǎn),然后進(jìn)行實(shí)際距離計(jì)算,來(lái)規(guī)避算法突變所造成的誤差。
當(dāng)然Geohash只是空間索引的一種方式,特別適合POI點(diǎn)數(shù)據(jù),而對(duì)線Link、面數(shù)據(jù)采用R樹(shù)索引更有優(yōu)勢(shì)。
二、系統(tǒng)設(shè)計(jì) 2.1 架構(gòu)設(shè)計(jì) 2.2 對(duì)象模型設(shè)計(jì)Geo Object Model
屬性 | 類(lèi)型 | 備注 |
---|---|---|
geo_id | INT | 唯一標(biāo)識(shí) |
geo_address | STRING | 地址名 |
geo_lng | FLOAT | 位置經(jīng)度 |
geo_lat | FLOAT | 位置緯度 |
geo_hash | STRING | 位置生成的GeoHash值 |
ipfs_hash | STRING | 所存數(shù)據(jù)的IpfsHash值 |
addGeoInfoByParam() | FUNCTION | 添加位置信息方法 |
getGeoInfoByParam() | FUNCTION | 獲取位置信息方法 |
mixGeoHashByParam() | FUNCTION | GeoHash生成算法 |
addIpfsDataByParam() | FUNCTION | 添加Ipfs數(shù)據(jù)方法 |
mixIpfsHashByParam() | FUNCTION | 關(guān)聯(lián)Ipfs數(shù)據(jù)方法 |
這是網(wǎng)友以 100萬(wàn) poi 數(shù)據(jù)查詢(xún)范圍 3km 內(nèi)的點(diǎn)(最多取100條)的性能測(cè)試統(tǒng)計(jì):
以下是各數(shù)據(jù)庫(kù)的對(duì)比情況:
數(shù)據(jù)庫(kù) | 耗時(shí) | 區(qū)域查詢(xún) | 多條件支持 |
---|---|---|---|
redis(3.2.8) | 1-10ms | 支持 | 不支持 |
mongo(3.4.4) | 10-50ms | 支持 | 支持 |
postgreSQL(9.6.2) | 3-8ms | 支持 | 支持 |
mysql(5.7.18) | 8-15ms | 支持 | 支持 |
綜合比較后,個(gè)人選擇了MySql 來(lái)進(jìn)行后文Demo的支撐數(shù)據(jù)庫(kù):
MySql在5.7.4以前版本的童鞋可以通過(guò)myISAM引擎提供的Geom內(nèi)置函數(shù)來(lái)實(shí)現(xiàn)
MySql在5.7.4以后版本的童鞋可以舒服的繼續(xù)使用InnoDB引擎,官方對(duì)其添加了對(duì)空間索引的支持,感興趣的朋友也可以對(duì)比下性能。
PS:
數(shù)據(jù)庫(kù)沒(méi)有哪個(gè)一定好,只要適合場(chǎng)景即可。
在研究IPFS存儲(chǔ)性能的過(guò)程中,由于測(cè)試網(wǎng)絡(luò)節(jié)點(diǎn)問(wèn)題,有很?chē)?yán)重的數(shù)據(jù)傳輸瓶頸,且不穩(wěn)定,短期內(nèi),很難將需要頻繁更新以及百萬(wàn)級(jí)別數(shù)據(jù)的檢索邏輯事務(wù)放在IPFS這一層中來(lái)做。
在IPFS節(jié)點(diǎn)網(wǎng)絡(luò)性能目前并不樂(lè)觀的情況下,嘗試去尋找能實(shí)現(xiàn)具有商業(yè)級(jí)別能力IPFS應(yīng)用的過(guò)渡方案。
2.3.2 對(duì)象模型映射成表結(jié)構(gòu)-- 表的結(jié)構(gòu) `geo_object`--CREATE TABLE `geo_object` (`geo_id` bigint(20) NOT NULL ?AUTO_INCREMENT,`geo_loc` point NOT NULL,`geo_address` varchar(255) NOT NULL,`ipfs_hash` varchar(255) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT="geo對(duì)象模型";-- Indexes for table `geo_object`ALTER TABLE `geo_object`ADD PRIMARY KEY (`geo_id`),ADD SPATIAL KEY `geo_loc` (`geo_loc`);三、Demo
有了以上的概念和設(shè)計(jì)模型,接下來(lái),給大家看一個(gè)簡(jiǎn)單的Demo實(shí)現(xiàn):
3.1 通過(guò)IPFS上傳位置數(shù)據(jù)IPFS單節(jié)點(diǎn)的部署就不詳細(xì)介紹了,這邊可以參考文章 [利用IPFS構(gòu)建自己的去中心化分布式Wiki系統(tǒng)]()?的實(shí)現(xiàn)過(guò)程.
官方提供了Curl的API方式,我們可以通過(guò)addIpfsDataByParam()方法實(shí)現(xiàn)RPC調(diào)用。
curl -F file=@myGeoFile "http://localhost:5001/api/v0/add?recursive=false&quiet=false&hash=sha2-256"
PS:這邊Demo采用的是本地單節(jié)點(diǎn)的數(shù)據(jù)上傳,為了保障服務(wù)的穩(wěn)定性,建議使用ipfs-cluster的節(jié)點(diǎn)集群解決方案,具體方案可以參考IPFS資深大牛(飛向未來(lái))的文章《IPFS家族二》。
3.2 獲取IPFS網(wǎng)絡(luò)返回值,并關(guān)聯(lián)數(shù)據(jù)響應(yīng)體為 ‘multipart/form-data’格式,成功,會(huì)返回如下Body數(shù)據(jù):
{"Name":"myGeoFile""Hash":"QmYftndCvcEiuSZRX7njywX2AGSeHY21Sa7VryCq1mK1Ew""Bytes":"2428803""Size": ""}
拿到Hash值后,再通過(guò)mixIpfsDataByParam()方法關(guān)聯(lián)到我們的Geo位置數(shù)據(jù)上。
3.3 Geo模型預(yù)演選取第一個(gè)基準(zhǔn)位置點(diǎn)(模擬用戶(hù)所在定位):
維度lat:39.989049 經(jīng)度lng:116.313658
INSERT INTO `geo_object`(`geo_loc`, `geo_address`, `ipfs_hash`) VALUES (GeomFromText("POINT(39.989049 116.313658)"),"3W咖啡館","QmYftndCvcEiuSZRX7njywX2A21Sa7VryCq1mK1Ew21")
選取第二個(gè)Geo位置點(diǎn)(模擬近點(diǎn)):
維度lat:39.988878 經(jīng)度lng:116.313352
INSERT INTO `geo_object`(`geo_loc`, `geo_address`, `ipfs_hash`) VALUES (GeomFromText("POINT(39.988878 116.313352)"),"中關(guān)村創(chuàng)業(yè)大街南廣場(chǎng)","WCJIEFSCvcE231233HY21Sa7Vr1Cq1mK1Ew")
選取第三個(gè)Geo位置點(diǎn)(模擬遠(yuǎn)點(diǎn)):
維度lat:40.005466 經(jīng)度lng:116.315938
INSERT INTO `geo_object`(`geo_loc`, `geo_address`, `ipfs_hash`) VALUES (GeomFromText("POINT(40.005466 116.315938)"),"圓明園","KBYftndCvcEiuSZRX7njyw1332Y21Sa723mKASDED")球面距離圍欄算法
假設(shè)球面圍欄對(duì)角點(diǎn)坐標(biāo)A1(x1,y1),B1(x2,y2):
x1 = lat + distance / ( 111.1 / COS(RADIANS(lng))), ? y1 = lng + distance / 111.1 ? x1 = lat - distance / ( 111.1 / COS(RADIANS(lng))), ? y1 = lng - distance / 111.1 ? //構(gòu)建一階空間填充曲線 LineString(A1,B1) ?
PS:
赤道上經(jīng)度的每個(gè)度大約相當(dāng)于111.1km,經(jīng)度的每個(gè)度的距離從0km到111.1km;
RADIANS()為弧度計(jì)算內(nèi)置函數(shù);
LineString() 為構(gòu)建一階空間填充曲線內(nèi)置函數(shù)。
3.4 獲取地理區(qū)域內(nèi)的IPFS數(shù)據(jù)服務(wù)獲取1km以?xún)?nèi)的IPFS數(shù)據(jù):
SELECT ?* ?FROM ? ?geo_object ?WHERE ? MBRContains ? ( ? LineString ? ( ? Point ? ( ?39.989049 + 1 / ( 111.1 / COS(RADIANS(116.313658))), ?116.313658 + 1 / 111.1 ?), ? Point ? ( ?39.989049 - 1 / ( 111.1 / COS(RADIANS(116.313658))), ?116.313658 - 1 / 111.1 ?) ? ), ? geo_loc ? ) ?
如下圖所示,我們拿到了距離3W咖啡館1Km以?xún)?nèi)中關(guān)村大街南廣場(chǎng)附近相關(guān)聯(lián)的IPFS數(shù)據(jù):
獲取10km以?xún)?nèi)的IPFS數(shù)據(jù):
SELECT ?* ?FROM ? ?geo_object ?WHERE ? MBRContains ? ( ? LineString ? ( ? Point ? ( ?39.989049 + 10 / ( 111.1 / COS(RADIANS(116.313658))), ?116.313658 + 10 / 111.1 ?), ? Point ? ( ?39.989049 - 10 / ( 111.1 / COS(RADIANS(116.313658))), ?116.313658 - 10 / 111.1 ?) ? ), ? geo_loc ? ) ?
如下圖所示,我們拿到了距離3W咖啡館10Km以?xún)?nèi)中關(guān)村大街南廣場(chǎng)附近相關(guān)聯(lián)的IPFS數(shù)據(jù):
PS:
關(guān)于Demo這塊,后續(xù)會(huì)另外新開(kāi)一篇實(shí)戰(zhàn)文章【應(yīng)用】基于IPFS和GeoHash構(gòu)建具有地理位置價(jià)值服務(wù)的DDApp(實(shí)戰(zhàn)篇)來(lái)做專(zhuān)門(mén)介紹,讓大家也能自己動(dòng)手編寫(xiě)一個(gè)功能相對(duì)完善(可視化界面)DDApp 。
Vevue:一個(gè)在選定的區(qū)域內(nèi)街拍可獲得代幣獎(jiǎng)勵(lì)的DApp,鼓勵(lì)用戶(hù)分享原創(chuàng)內(nèi)容,激勵(lì)場(chǎng)景化廣告。
地理位置簽到:只有到達(dá)指定位置坐標(biāo)點(diǎn),才可取得可信簽到密碼憑證,進(jìn)行核對(duì),確認(rèn)地理位置信任問(wèn)題。(滴滴加班公司打車(chē)報(bào)銷(xiāo)場(chǎng)景)
到店紅包(糖果):,吸引用戶(hù)到達(dá)指定實(shí)體店鋪位置,通過(guò)位置可信核對(duì),分發(fā)代幣糖果憑證/快照,激勵(lì)用戶(hù)到店消費(fèi),體驗(yàn)現(xiàn)場(chǎng)活動(dòng)。
車(chē)主停車(chē)位產(chǎn)權(quán)保護(hù):經(jīng)過(guò)購(gòu)買(mǎi)的專(zhuān)用停車(chē)位實(shí)為車(chē)主用戶(hù)的資產(chǎn),應(yīng)受到產(chǎn)權(quán)保護(hù),且車(chē)位的轉(zhuǎn)移、交易需要在一套依賴(lài)地理位置的信任體系中進(jìn)行。
景區(qū)、名勝古跡、歷史遺跡信息保護(hù):滄海桑田,地轉(zhuǎn)星移,也許有一天名勝古跡不復(fù)存在,但它們的電子信息(地理位置、圖像、所屬?lài)?guó)家、歷史文化、視頻、VR全景等信息)將永遠(yuǎn)被保存在區(qū)塊鏈上,真實(shí)且不被篡改,源遠(yuǎn)流長(zhǎng)。
與位置AR游戲結(jié)合:之前很火的Pokémon Go如果再加上Filecoin的獎(jiǎng)勵(lì)機(jī)制會(huì)是一種什么樣的場(chǎng)面?也可以參考MANA區(qū)塊鏈項(xiàng)目的價(jià)值。
物聯(lián)網(wǎng)結(jié)合:?充電樁,ETC這些具有支付屬性、位置屬性的智能設(shè)備創(chuàng)新等等。
五、開(kāi)源計(jì)劃初衷:期望能讓大家看到區(qū)塊鏈的實(shí)際應(yīng)用場(chǎng)景,為區(qū)塊鏈和傳統(tǒng)技術(shù)的結(jié)合做更多預(yù)演、布道、分享,不去聽(tīng)?zhēng)湃ξ跷跞寥恋穆曇?,用技術(shù)創(chuàng)造真實(shí)的價(jià)值,也期待更多和我一樣想法的朋友加入,帶一些正能量給這個(gè)圈子。
IPFS-Geo
意義:是一個(gè)具有地理位置特征的IPFS智能對(duì)象,其元數(shù)據(jù)具備Geo相關(guān)特性,支持千萬(wàn)級(jí)別空間數(shù)據(jù)的快速索引,對(duì)象內(nèi)還提供LBS相關(guān)功能的接口服務(wù)。
[ 【戴嘉樂(lè)】利用IPFS構(gòu)建自己的去中心化分布式Wiki系統(tǒng)]()
圓方圓學(xué)院匯集大批區(qū)塊鏈名師,打造精品的區(qū)塊鏈技術(shù)課程。 在各大平臺(tái)都長(zhǎng)期有優(yōu)質(zhì)免費(fèi)公開(kāi)課,歡迎報(bào)名收看。
公開(kāi)課地址:https://ke.qq.com/course/345101? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24426.html
摘要:戴嘉樂(lè)去年月參與了的眾籌,從而了解到技術(shù),獨(dú)立開(kāi)發(fā)了兩款基于的開(kāi)源應(yīng)用,一個(gè)是與有關(guān)的系統(tǒng),另一個(gè)是相關(guān)的地理位置檢索系統(tǒng)?,F(xiàn)在支持的數(shù)據(jù)結(jié)構(gòu),支持比特幣以太坊的區(qū)塊數(shù)據(jù)。 戴嘉樂(lè)是前百度高級(jí)研發(fā)工程師,ipfser.org&巴比特專(zhuān)欄作者。戴嘉樂(lè)去年8月參與了FileCoin的眾籌,從而了解到IPFS技術(shù),獨(dú)立開(kāi)發(fā)了兩款基于IPFS的開(kāi)源應(yīng)用,一個(gè)是與IPFS有關(guān)的wiki系統(tǒng),另一...
摘要:五參考文獻(xiàn)區(qū)塊鏈利用構(gòu)建自己的去中心化分布式系統(tǒng)相關(guān)文章和視頻推薦戴嘉樂(lè)入門(mén)基于和構(gòu)建自維護(hù)資源網(wǎng)關(guān)圓方圓學(xué)院匯集大批區(qū)塊鏈名師,打造精品的區(qū)塊鏈技術(shù)課程。 作者簡(jiǎn)介:戴嘉樂(lè)( Mr.Maple ) | 前百度高級(jí)研發(fā)工程師 | IPFS應(yīng)用實(shí)踐者&布道師|個(gè)人網(wǎng)站:https://www.daijiale.cn聯(lián)系方式:微信號(hào):daijiale6239。 一、背景 上篇文章[《(入門(mén)...
摘要:作者簡(jiǎn)介戴嘉樂(lè)前百度高級(jí)研發(fā)工程師應(yīng)用實(shí)踐者布道師個(gè)人網(wǎng)站聯(lián)系方式微信號(hào)。二技術(shù)介紹對(duì)這項(xiàng)技術(shù)不熟悉的同學(xué),可以參考我之前一次演講分享的內(nèi)容戴嘉樂(lè)詳解的本質(zhì)技術(shù)架構(gòu)以及應(yīng)用。 作者簡(jiǎn)介:戴嘉樂(lè)( Mr.Maple ) | 前百度高級(jí)研發(fā)工程師 | IPFS應(yīng)用實(shí)踐者&布道師|個(gè)人網(wǎng)站:https://www.daijiale.cn聯(lián)系方式:微信號(hào):daijiale6239。 一、應(yīng)用背...
摘要:全稱(chēng),中文名星際文件系統(tǒng),是一個(gè)旨在創(chuàng)建持久且分布式存儲(chǔ)和共享文件的網(wǎng)絡(luò)傳輸協(xié)議。在網(wǎng)絡(luò)中的節(jié)點(diǎn)將構(gòu)成一個(gè)分布式文件系統(tǒng)。使用稱(chēng)為去中心化命名系統(tǒng),每個(gè)文件都可以被協(xié)作命名為易讀的名字。三項(xiàng)目實(shí)踐利用構(gòu)建一個(gè)去中心化不可篡改的分布式系統(tǒng)。 作者簡(jiǎn)介:戴嘉樂(lè)( Mr.Maple ) | 前百度高級(jí)研發(fā)工程師 | IPFS應(yīng)用實(shí)踐者&布道師|個(gè)人網(wǎng)站:https://www.daijial...
摘要:寫(xiě)在前面,這一篇文章是許曉笛在北京開(kāi)發(fā)者圓桌會(huì)議上的發(fā)言實(shí)錄,感謝主辦方戴嘉樂(lè)和董天一的邀請(qǐng),感謝編輯們。我這次分享題目是有可能有點(diǎn)標(biāo)題黨,前面拉了三個(gè)字有可能是落地的一個(gè)非常重要的途徑。共識(shí)機(jī)制共識(shí)機(jī)制,就是所有代幣持有人選舉。 寫(xiě)在前面,這一篇文章是許曉笛 2018.05.20 在北京 《IPFS開(kāi)發(fā)者圓桌會(huì)議》上的發(fā)言實(shí)錄,感謝主辦方戴嘉樂(lè)和董天一的邀請(qǐng),感謝編輯們。先介紹一下《...
閱讀 1567·2021-11-19 09:55
閱讀 2792·2021-09-06 15:02
閱讀 3561·2019-08-30 15:53
閱讀 1108·2019-08-29 16:36
閱讀 1245·2019-08-29 16:29
閱讀 2296·2019-08-29 15:21
閱讀 634·2019-08-29 13:45
閱讀 2688·2019-08-26 17:15