IPFS教程IPFS-星际文件传输系统IPFS

【应用】基于IPFS和GeoHash构建具有地理位置价值服务的D

2018-03-18  本文已影响57人  嘉乐的SOHO
image

作者简介:戴嘉乐( Mr.Maple ) | 前百度地图高级研发工程师 | ipfs应用实践者&布道师
个人网站:https://www.daijiale.cn
联系方式:微信号(daijiale6239)

一、概述

1.1 项目意义

打造地理位置信息与区块链的关系对象模型,建立一套
人->位置->真实世界->传递信任->价值转移->位置->人 的生态模型,实现用区块链来索引真实世界的愿景。

而GeoHash算法可以大幅度提高在庞大位置数据中的检索效率,同时为应用提供便捷的缓存机制。

IPFS&Filecoin技术则可以保证在一个可信的区块链网络中去大规模传递与海量位置信息相关联的海量文件、数据集合,并保证传递过程中数据的产权价值。

1.2 名词解释

DDApp

DDApp ( Data Decentered Application ):是一个数据去中心化应用的概念,介于传统应用和去中心化应用之间,解决了DApp不能依赖中心化的API的问题,又保证部分需要去中心化场景下的数据,在与应用交互之外,还可以独立分布部署、P2P传输。

IPFS

IPFS全称InterPlanetary File System,中文名:星际文件系统,是一个旨在创建持久且分布式存储和共享文件的网络传输协议。它是一种内容可寻址的对等超媒体分发协议可以让网络更快、更安全、更开放。它是一个面向全球的、是一个点对点的分布式版本文件系统,试图将所有具有相同文件系统的计算设备连接在一起。

GeoHash

Geohash是由Gustavo Niemeyer发明的公共域地理编码系统,它将一个地理位置编码成一串字母和数字。

它是一种层次化的空间数据结构,将空间细分为网格形状的桶,是一种被称为z -阶空间填充曲线的应用,下图中就是GeoHash算法中常用的Peano曲线,一种四叉树线性编码方式。

image

GeoHash数据将具有如下3个特点:

image image

例如,坐标对(116.414597,39.955441),位于北京安定门附近,GeoHash后形成的值为WX4G2

我们已经知道现有的GeoHash算法使用的是Peano空间填充曲线,这种曲线会产生突变,造成了编码虽然相似但距离可能相差很大的问题,因此在基于个人位置查询附近Poi信息时,首先筛选GeoHash编码相似的POI点,然后进行实际距离计算,来规避算法突变所造成的误差。

当然Geohash只是空间索引的一种方式,特别适合POI点数据,而对线Link、面数据采用R树索引更有优势

二、系统设计

2.1 架构设计

image

2.2 对象模型设计

属性 类型 备注
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数据方法

Geo Object Model

属性 类型 备注
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数据方法

2.3 数据库对象映射

2.3.1 数据库选型

这是网友以 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:

2.3.2 对象模型映射成表结构



-- 表的结构 `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

有了以上的概念和设计模型,接下来,给大家看一个简单的Demo实现:

3.1 通过IPFS上传位置数据

curl -F file=@myGeoFile "http://localhost:5001/api/v0/add?recursive=false&quiet=false&hash=sha2-256"

3.2 获取IPFS网络返回值,并关联数据

响应体为 ‘multipart/form-data’格式,成功,会返回如下Body数据:

{
    "Name":"myGeoFile"
    "Hash":"QmYftndCvcEiuSZRX7njywX2AGSeHY21Sa7VryCq1mK1Ew"
    "Bytes":"2428803"
    "Size": ""
}

拿到Hash值后,再通过mixIpfsDataByParam()方法关联到我们的Geo位置数据上

3.3 Geo模型预演

选取第一个基准位置点(模拟用户所在定位)

Alt text
INSERT INTO `geo_object`(`geo_loc`, `geo_address`, `ipfs_hash`) VALUES (GeomFromText('POINT(39.989049 116.313658)'),'3W咖啡馆','QmYftndCvcEiuSZRX7njywX2A21Sa7VryCq1mK1Ew21')

选取第二个Geo位置点(模拟近点)

Alt text
INSERT INTO `geo_object`(`geo_loc`, `geo_address`, `ipfs_hash`) VALUES (GeomFromText('POINT(39.988878 116.313352)'),'中关村创业大街南广场','WCJIEFSCvcE231233HY21Sa7Vr1Cq1mK1Ew')

选取第三个Geo位置点(模拟远点)

image
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:

3.4 获取地理区域内的IPFS数据服务

获取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数据

image

获取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数据

image

PS:
关于Demo这块,后续会另外新开一篇实战文章【应用】基于IPFS和GeoHash构建具有地理位置价值服务的DDApp(实战篇)来做专门介绍,让大家也能自己动手编写一个功能相对完善(可视化界面)DDApp 。

四、应用场景

五、开源计划

初衷:期望能让大家看到区块链的实际应用场景,为区块链和传统技术的结合做更多预演、布道、分享,不去听币圈熙熙攘攘的声音,用技术创造真实的价值,也期待更多和我一样想法的朋友加入,带一些正能量给这个圈子。

IPFS-Geo

意义:是一个具有地理位置特征的IPFS智能对象,其元数据具备Geo相关特性,支持千万级别空间数据的快速索引,对象内还提供LBS相关功能的接口服务。

image

也欢迎加入知识星球:

image

转载声明:特别鸣谢天一哥(飞向未来 IPFS指南公众号作者)ipfser.org早期在IPFS大量的布道工作,才有了博主结合IPFS与传统应用的场景想法,期望更多和我们一样对这个领域感兴趣的朋友能加入进来。

本文章版权归博主daijiale.cn所有,若想转载请联系作者授权,未经授权,禁止转载,如若发现,将通过个人律师以侵犯《中华人民共和国著作权法》起诉(奉陪到底),授权转载也请注明原出处。

参考文献

上一篇下一篇

猜你喜欢

热点阅读