【今日话题】分享下基于地理位置服务的架构方案?比如:附近的人,

李鹏1 5,481 次浏览

【今日话题】
分享下基于地理位置服务的架构方案?比如:附近的人,附近的商店。 – XiangZ

1. 问: 是不是有些数据库,专门存储和计算地址位置的? – twin

回: 嗯,计算位置倒不是,只是会有标记好的一些酒店餐馆什么的,好像是百度的 – Anonymous、z

2. 最近产品要做一个基于地理位置服务,比如找附近的人,目前网上讨论比较多的方案有两种,一种是二维降一维,把经纬度转换成geohash,根据geohash特性,越多位数相似越接近,通过like 'xxx%'来查找,还有就是使用二维索引,这种mongodb有带。 – XiangZ

3. 建议你用slor来实现。Slor不但可以按距离搜索排序,还可以按相关度等纬度排序,都是现成的功能。 – Mandman

4. 使用墨卡托坐标系. 如果只需要大致位置的用GeoHash就够了,比如微信、陌陌和一些游戏,100米、300米、1000米这样. 如果需要精确位置,那么把经纬度转换为墨卡托坐标系是比较好的方法,一般获取到的地理位置是经纬度,通过经纬度计算距离需要一系列的三角函数浮点数运算,消耗太大,而墨卡托坐标系的度量单位就是米,可以很简单的计算两个坐标点的距离,谷歌地图、微软地图、百度地图等等用的都是墨卡托坐标系或其变种,前面说的GeoHash就是把墨卡托坐标系里的区域划分为一个个矩形并对其编码. – 水浸街

5. 百度的地图服务就很好啊,可以直接查看附近多少米之内的建筑设施,还可以返回名称、位置、type等,判断是酒店餐饮、娱乐等 – 青衫隐_刘

回: 百度地图的数据源是百度自己的,如果你要计算自己的两个用户之间的距离就需要用自己的数据源. – 水浸街

回: 百度也有地址运算就是你说的GeoHash那个东西好像 – 青衫隐_刘

6. 先说经纬度的获取,再说如何找到附近的xx.只说安卓和浏览器,ios更简单. 安卓来说,两个方式,一个是直接安卓的内置api,一个使用第三方sdk. 早期安卓没有内置获取经纬度信息,后来的有了。谷歌官方提供的。另外一个使用第三方sdk,现在百度,高德都提供这个获取经纬度的sdk. 经纬度就是类似:东经103,北纬253 这样的信息,类似x轴和y轴,我们通过这么个东西可以精确定位一个设备在地球上哪个位置. – 黑夜路人

7. 常规定位一个经纬度是利用卫星的,因为所有位置都是相对的。 一般的gps设备,都是依赖卫星定位,常规是最少三颗卫星定位设备所在的经纬度。所以你用gps设备会告诉你你现在找到了几颗卫星。卫星越多,位置越准. 但是问题来了.比如你在室内,或者是有阻挡的地方没有卫星信号,你如何获取经纬度?这就是大部分车自带的gpa只能室外工作,室内或者有遮挡就不行,哪怕你经过一个天桥,都会告诉你:gps信号丢失.这就需要依赖第二个定位技:手机基站 – 黑夜路人

8. 在没有手机的时代,有个东西叫做卫星电话,这个东西采用的是我们常规技术属于:集中中心式管理. 就是地球上所有卫星电话都依赖于卫星微波通信,到是这个玩意儿有缺点:第一是信号弱经常被阻挡,传输速率只有几k,通信多完全受不了。另外一个就是,政府无法监控,要知道棱镜门的核心就是各种监听监控。电话监控也是各国政府安全部门的要点。但是,优点明显啊,你在海上和沙漠都可以通信,因为是依赖卫星的,并且很安全,所以。卫星电话是各个政府首脑,还有各种黑社会组织首选通信方式。(可以参考电影《窃听风暴》),穷人现在用不起这个玩意儿. 比如美国白宫内部有种电话给总统专用的,叫做“黄机子”,就是电话颜色是黄色的,它就是防窃听的,猜测可能使用了卫星电话技术。(可以参考美剧《纸牌屋》)。我国领导人也有类似的,叫做“红机子”,红色电话,中-南-hai里面用的,也防窃听,不知道技术是否类似美国的。- 黑夜路人

9. 继续说手机,手机的机制跟卫星电话完全不同,是依赖于地面基站的,(又叫蜂窝),大家可以看见路边电线杆上有,跟个音响一样。有些电梯里也有。 手机通信核心依赖各个基站,基站连接到各个地方的节点服务器,然后完成通信。基站是节点式的,跟卫星的区别是稍微去中心化。所以,我们说手机没信号就是附近没基站,或者基站信号太弱。早期,移动,联通,电信,都建设有自己的基站,大家都知道移动信号好,本质就是有钱建设基站多而已,联通信号差(特别地方上),是因为基站建设的少。后来国家发现这个事情很傻逼,因为每个公司都建设一套基站,重复建设,资源浪费严重,所以,今年成立了一个公司,叫做“铁塔公司”,专门从事基站建设,意思是:你们就别建啦,都用我的!解决了资源浪费的问题。(效果如何,待时间来证明)- 黑夜路人

10. 这块科普清晰了吧,继续说手机定位. 手机定位本质是看你手机是连接到哪个基站,来确定你大概位置。一般运营商们会给每个基站编号,比如说上地十街的百度大厦,移动基站编号9527,那么,只要知道基站编码,就知道你在哪个位置了。基站定位缺点也明显啊,就是不精确,因为一个基站可能给周围几百米或者一公里的手机提供服务啊,所以有时候我们看手机地图,会发现自己漂移在另外一条街,就是因为基站定位不精确的原因。 – 黑夜路人

11. 在这个问题上,谷歌又琢磨出一个解决方案,手机不是不准么,嘿嘿,试试wifi啊!又诞生了,wifi信号定位技术.精确度比手机高,室内也能定位,听着就很帅!缺点来了……tmd,我怎么知道一个wifi的ssid叫做:360-wifi-9527的wifi信号在地球哪个角落?谷歌想出了一个妙招,你们猜猜是啥?这个招非常苦逼,哈哈.就是两个字:扫街!谷歌当年的街景车,说是街景,其实还顺便把沿途的wifi信号和地理位置都记录下来了 .有木有很叼炸天的节奏! 国内一样这么干的是百度,高德,和腾讯 – 黑夜路人

12. 客户端要获取经纬度,直接调用安卓内置api是可以获得的,你不论谷歌是用gps、手机基站、还是wifi信号,反正能够给你获得经纬度,你用就行了。国内的经纬度,百度、高德、腾讯,做得都不错,因为他们的车子也出去扫wifi信号去了。不过wifi信号有时候会换,相应他们也会做更新,是否会从客户端偷数据回去,这个不知道。反正会比较准就是了。- 黑夜路人

13. 如果想要在安卓浏览器上面获取这些信息,同样的,调用api,就是在你的html5页面里面输出相应的东西,然后页面会问用户是否需要访问用户位置,用户同意了就可以用,你访问滴滴打车,美团之类的就会看到这个提示。但是浏览器调用的api跟你自己安卓 native app获取信息差不多,不过就是比较繁琐,用户会不乐意,所以 web app这个活不好干呐。- 黑夜路人

回: html5的geolocation API… – 朝沐金风

14. wifi定位精确度很低的 – 朝沐金风

回: 如果不是你们家wifi当然不高,但是也是没办法中的办法。最精准非GPS莫属了。 – 黑夜路人

回: 所以一般最优先的是gps. 精度在20米. 然后是移动基站定位 – 朝沐金风

现在的室内定位技术,能够做到定位你再商场第几层哪个商店门口。。。尿了。。。。 – 黑夜路人

15. 现在你经过千辛万苦,依赖内置api或者第三方sdk,获取了用户的经纬度,传递给了服务端,现在服务端如何帮助你找到附近的xx呢?(比如附近的炮友。。。) 上面我看到大家讨论了几种方案,大体是这几种方案。

1. 使用GIS的数据库引擎。(Geograhpic Information system,地理信息系统)。
2. 使用PostGIS第三方扩展
3. 使用类似GeoHash类似的做法
4. 部分内置了 空间索引与空间查询 的数据库(非GIS引擎)

第1种,目前支持最好的是PostgrSQL,使用PostGIS扩展,能够获得很好的gis操作。mysql 一直在gis方面支持不太好,但是从mysql4.1开始,mysql就引入了一系列空间扩展,使其具备了一定的空间处理能力。

第2种,不用说了,很著名的 PostGIS,大家可以研究下。

第3种,GeoHash,是一种处理算法,大致就是把全球定位成一个个个子,你大致属于哪个格子,你就是能够找到附近的人或店。这个不需要GIS引擎支持,算法就能够支持,就是运算量比较大。参考这篇文章:http://blog.csdn.net/heiyeshuwu/article/details/34476491

第4种,类似于第1种,目前支持最好的就是MongoDB内置的原生地支持了空间索引与空间查询,不需要依赖PostGIS这种扩展,可以直接使用,比如输入一个精度,给出附近某个范围的其他数据。操作比较简单。 – 黑夜路人

16. 问: GIS数据库怎么理解?求科普 – 水浸街

回: GIS数据库是某区域内关于一定地理要素特征的数据集合,主要涉及对图形和属性数据的管理和组织。 – 黑夜路人

回: 什么原理

回: 我发一个官方描述:与其它数据库相比GIS数据库有着自身的一些特点:⑴ GIS数据库不仅有与一般数据库数据性质相似的地理要素的属性数据,还有大量的空间数据,即描述地理要素空间分布位置的数据,且这两种数据之间具有不可分割的联系;⑵ 地理信息系统是一个复杂的巨系统,用多种数据来描述资源环境。即使是一个极小的区域,数据量大;⑶ 数据库的更新周期比较长,且不是适时更新,它更多的是提供查询作用。上述特点,决定了建立GIS数据库时,一方面应该遵循和应用通用数据库的原理和方法,另一方面还必须采取一些特殊的技术和方法,来解决其它数据库所没有的管理空间数据的问题。 – 黑夜路人

17. 地理位置获取的,还有一种,精度很低,感觉不是很靠谱geoip。通过IP获取大致地理位置。
之前知道创宇在openssl心脏出血漏洞的时候做了一个 ZoomEye监测“心脏出血”漏洞全球分布图,应该就用到这个 – XiangZ

18. 问: geoip 不靠谱的原因是?
我看新浪微博的数据就有geo字段 – Micarol

回: 比如,我现在的路由器翻墙了,用geoip就不是我这里的位置了,而且IP很难定位具体位置,大多数只能把行政中心的位置定义为IP位置,所以不准,但是在大场景,不需要很精确的服务,比如分布图这样的,可以用 – XiangZ

19. ip定位是传统的定位技术,在pc时代就有,但是又了手机这种设备,它就很out了。现在不是很多各种ip库,就是依赖ip定位。比如 ip138.com,能够查询ip位置,还有纯真ip库,高春辉的17mon IP库等等。 国内互联网公司,在ip数据库方面做得最好的是腾讯,数据挖掘的非常棒,通过一个ip,知道这个人是什么场景下上网的,是干嘛的,消费能力如何等等。 其他互联网公司,都有自己的客户端,通过客户端获取用户ip和位置,各有各的绝招。不过也有偷别人ip库信息的。 – 黑夜路人

20. 纯真ip库结构解析:http://www.cnblogs.com/analyzer/articles/1726143.html – 黑夜路人

21. Mongodb 查询经纬度:http://www.2cto.com/database/201406/305985.html – 黑夜路人

22. 大致了解了一下空间数据库,应该就是可以存储对象的数据库这个意思. 比如一个点在数据库里是一个对象,一张图也是一个对象. 对于需要功能比较复杂的GIS系统还是很不错的,但对于互联网访问这种功能简单、访问量大的估计数据库部分开销会太大 – 水浸街

23. 我了解的arcgis里面除了存普通的属性表数据,还存储拓扑信息 – 李明

回: 拓扑信息是计算路径需要的吧,比如百度地图上从a点到b点怎么走 – 水浸街

24. 存储只是点线面. 现在精度误差其实已经没有了. 政府不允许 。所以地图厂商会人为纠偏 – flea

25. 服务端获取手机端ip时,如果手机通过基站上网,记得是有 手机归属地与 手机所在地之分 – ten-ten

26. 室内定位可以看下美团的方案 – flea

回: 美团的室内定位,应该是这个吧 http://tech.meituan.com/mt-wifi-locate-practice-part1.html – XiangZ

27. 我知道有创业公司在做大型卖场的免费wifi,一个功能是到达某个店铺会发送促销广告,另一个功能应该就是室内导航功能,可以与第三方合作 – 水浸街

28. 数据库postgre. 目前它是支持空间数据最好的数据库 . 流通数据格式geojson. 搜索用芒果 ,solr, elasticsearch 都行. – flea

29. 这样其实挺蛋疼的 太杂乱了. 全国点数据量没法用pssql很好点解决. 我们目前路表数据就有十几亿条. 现在初步用redis先起步. 正在把数据全部静态化到内存中 不去请求redis了. – 闵敢

30. 附近的 商店 这个功能很好实现 因为 经纬度都是静态的 所以用sphinx就能搞定 具体函数 SetGeoAnchor 附近的人比较麻烦 因为经纬度都是实时变的 可以用redis+Geohash实现 – 刘祥昆

31. 用mongodb可以支持附近的人,某个区域(多边形)内的人. http://docs.mongodb.org/manual/tutorial/query-a-2dsphere-index/ 坐标一般用geojson存储,数据量大的话可以做分片,目前我用的感觉还不错 – 风之缘

回: mongodb感觉不是一个好方法 不如自己用更简单的来做
访问量不是特别大的话 redis就可以 – 闵敢

回: 恩,一般简单方案就用geohash就行了. 配合redis. 简单高效 – 黑夜路人

 
 

One thought on “ 【今日话题】分享下基于地理位置服务的架构方案?比如:附近的人, ”

  1. 电缆桥架

    好高深噢

发表评论

? razz sad evil ! smile oops grin eek shock ??? cool lol mad twisted roll wink idea arrow neutral cry mrgreen