做者简介:戴嘉乐( Mr.Maple ) | 前百度高级研发工程师 | IPFS应用实践者&布道师|
我的网站: https://www.daijiale.cn
联系方式:微信号:daijiale6239。
打造地理位置信息与区块链的关系对象模型,创建一套 人->位置->真实世界->传递信任->价值转移->位置->人 的生态模型,实现用区块链来索引真实世界的愿景。vue
经过GeoHash算法能够大幅度提升在庞大位置数据中的检索效率,同时为应用提供便捷的缓存机制。mysql
IPFS&Filecoin技术则能够保证在一个可信的区块链网络中去大规模传递与海量位置信息相关联的海量文件、数据集合,并保证传递过程当中数据的产权价值。redis
GeoHash数据将具备以下3个特色:
例如,坐标对(116.414597,39.955441),位于北京安定门附近,GeoHash后造成的值为WX4G2。算法
咱们已经知道现有的GeoHash算法使用的是Peano空间填充曲线,这种曲线会产生突变,形成了编码虽然类似但距离可能相差很大的问题,所以在基于我的位置查询附近Poi信息时,首先筛选GeoHash编码类似的POI点,而后进行实际距离计算,来规避算法突变所形成的偏差。sql
固然Geohash只是空间索引的一种方式,特别适合POI点数据,而对线Link、面数据采用R树索引更有优点。数据库
Geo Object Modelapi
属性 | 类型 | 备注 |
---|---|---|
geo_id | INT | 惟一标识 |
geo_address | STRING | 地址名 |
geo_lng | FLOAT | 位置经度 |
geo_lat | FLOAT | 位置纬度 |
geo_hash | STRING | 位置生成的GeoHash值 |
ipfs_hash | STRING | 所存数据的IpfsHash值 |
addGeoInfoByParam() | FUNCTION | 添加位置信息方法 |
getGeoInfoByParam() | FUNCTION | 获取位置信息方法 |
mixGeoHashByParam() | FUNCTION | GeoHash生成算法 |
addIpfsDataByParam() | FUNCTION | 添加Ipfs数据方法 |
mixIpfsHashByParam() | FUNCTION | 关联Ipfs数据方法 |
这是网友以 100万 poi 数据查询范围 3km 内的点(最多取100条)的性能测试统计:
如下是各数据库的对比状况:缓存
数据库 | 耗时 | 区域查询 | 多条件支持 |
---|---|---|---|
redis(3.2.8) | 1-10ms | 支持 | 不支持 |
mongo(3.4.4) | 10-50ms | 支持 | 支持 |
postgreSQL(9.6.2) | 3-8ms | 支持 | 支持 |
mysql(5.7.18) | 8-15ms | 支持 | 支持 |
综合比较后,我的选择了MySql 来进行后文Demo的支撑数据库:安全
PS:微信
-- 表的结构 `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对象模型';-- Indexes for table `geo_object`ALTER TABLE `geo_object`ADD PRIMARY KEY (`geo_id`),ADD SPATIAL KEY `geo_loc` (`geo_loc`);
有了以上的概念和设计模型,接下来,给你们看一个简单的Demo实现:
IPFS单节点的部署就不详细介绍了,这边能够参考文章 [利用IPFS构建本身的去中心化分布式Wiki系统]() 的实现过程.
官方提供了Curl的API方式,咱们能够经过addIpfsDataByParam()方法实现RPC调用。
curl -F file=@myGeoFile "http://localhost:5001/api/v0/add?recursive=false&quiet=false&hash=sha2-256"
PS:这边Demo采用的是本地单节点的数据上传,为了保障服务的稳定性,建议使用ipfs-cluster的节点集群解决方案,具体方案能够参考IPFS资深大牛(飞向将来)的文章《IPFS家族二》。
响应体为 ‘multipart/form-data’格式,成功,会返回以下Body数据:
{"Name":"myGeoFile""Hash":"QmYftndCvcEiuSZRX7njywX2AGSeHY21Sa7VryCq1mK1Ew""Bytes":"2428803""Size": ""}
拿到Hash值后,再经过mixIpfsDataByParam()方法关联到咱们的Geo位置数据上。
选取第一个基准位置点(模拟用户所在定位):
维度lat:39.989049 经度lng:116.313658
INSERT INTO `geo_object`(`geo_loc`, `geo_address`, `ipfs_hash`) VALUES (GeomFromText('POINT(39.989049 116.313658)'),'3W咖啡馆','QmYftndCvcEiuSZRX7njywX2A21Sa7VryCq1mK1Ew21')
选取第二个Geo位置点(模拟近点):
维度lat:39.988878 经度lng:116.313352
INSERT INTO `geo_object`(`geo_loc`, `geo_address`, `ipfs_hash`) VALUES (GeomFromText('POINT(39.988878 116.313352)'),'中关村创业大街南广场','WCJIEFSCvcE231233HY21Sa7Vr1Cq1mK1Ew')
选取第三个Geo位置点(模拟远点):
维度lat:40.005466 经度lng:116.315938
INSERT INTO `geo_object`(`geo_loc`, `geo_address`, `ipfs_hash`) VALUES (GeomFromText('POINT(40.005466 116.315938)'),'圆明园','KBYftndCvcEiuSZRX7njyw1332Y21Sa723mKASDED')
假设球面围栏对角点坐标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 //构建一阶空间填充曲线 LineString(A1,B1)
PS:
获取1km之内的IPFS数据:
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之内中关村大街南广场附近相关联的IPFS数据:
获取10km之内的IPFS数据:
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之内中关村大街南广场附近相关联的IPFS数据:
PS:
关于Demo这块,后续会另外新开一篇实战文章【应用】基于IPFS和GeoHash构建具备地理位置价值服务的DDApp(实战篇)来作专门介绍,让你们也能本身动手编写一个功能相对完善(可视化界面)DDApp 。
初衷:指望能让你们看到区块链的实际应用场景,为区块链和传统技术的结合作更多预演、布道、分享,不去听币圈熙熙攘攘的声音,用技术创造真实的价值,也期待更多和我同样想法的朋友加入,带一些正能量给这个圈子。
IPFS-Geo
意义:是一个具备地理位置特征的IPFS智能对象,其元数据具有Geo相关特性,支持千万级别空间数据的快速索引,对象内还提供LBS相关功能的接口服务。
[ 【戴嘉乐】利用IPFS构建本身的去中心化分布式Wiki系统]()
圆方圆学院聚集大批区块链名师,打造精品的区块链技术课程。 在各大平台都长期有优质免费公开课,欢迎报名收看。
公开课地址:https://ke.qq.com/course/345101