周末调研了一下Geo Location 地理位置信息方面的内容,自己小结一下。
一、通过 IP 地址获得用户的地理位置信息
也就是根据用户的IP,通过IP数据库查询获得信息。一般IP数据库中,
每条记录的基本结构:
 IP地址段(起始、结束),以及对应的信息数据
一般包含的信息:国家、区域(省/州)、城市、街道、经纬度、ISP提供商等信息

因为IP数据库随着时间经常变化(不过一段时间内变化很小),所以需要有人经常维护和更新。这个数据也不可能完全准确、也不可能覆盖全。这是maxmind的城市准确度 http://www.maxmind.com/app/city_accuracy 。
因为没有权威的数据组织机构,且经常有变化。各家数据供应商,基本上做着做着就形成自己的一套数据了。

目前,国内用的比较有名的是“纯真IP数据库”,国外常用的是 maxmind、ip2location。

IP数据库是否收费:收费、免费都有。一般有人维护的数据往往都是收费的,准确率和覆盖率会稍微高一些。

质量方面:
主要概念是准确率和覆盖率。
记录数据总条数。纯真现在是38万条(2010年07月30日更新)
是否有人维护。
数据库更新频率:每月、每周。数据库会定期更新的,maxmind开源版是每月更新一次。

查询形式:
本地,将IP数据库下载到本地使用,查询效率高、性能好。常用在统计分析方面。具体形式又分为:
内存查询:将全部数据直接加载到内存中,便于高性能查询。或者二进制的数据文件本身就是经过优化的索引文件,可以直接对文件做查询。
数据库查询:将数据导入到数据库,再用数据库查询。效率没有内存查询快。
远程(web service或ajax),调用远程第三方服务。查询效率自然比较低,一般用在网页应用中。
查询的本质:输入一个IP,找到其所在的IP段,一般都是采用二分搜索实现的。

是否提供API:有的IP数据库提供API,支持多语言(java、javascript、C#等),这样你就不用自己直接分析数据格式、整理、写查询代码了。

是否提供经纬度:纯真IP数据库不提供经纬度,Maxmind提供。如果做地图应用,一般是需要经纬度的。

语言方面:英文还是中文。maxmind提供的数据,所有信息都是英文的,国家是iso的国家码,如中国是China,北京是Beijing,国内环境使用不方便,除非你自己再维护一个中英对照表。而纯真IP数据库就中文信息。

另外,有些Web服务器也有这方面的功能集成。因为对Web应用而言,IP数据显然是通过Web服务器获得的,因此这部分工作也可以交给web 服务器来做。比如 Nginx 就带了一个GeoIP 的可选模块( http://wiki.nginx.org/NginxHttpGeoIPModule),集成了 MaxMind,安装时需要在configure中指定该模块。

Maxmind,http://www.maxmind.com,
有收费版,也有开源版本。
数据下载,http://geolite.maxmind.com/download/geoip/database/
准确度,http://www.maxmind.com/app/city_accuracy
支持多种语言,http://www.maxmind.com/app/city
Open Source binary API available for the following languages:
C
PHP (Pure)
Java
Perl (XS)
Perl (Pure)
Apache
Python
MS COM
C#
Pascal
Ruby
For performance details, see our benchmark page

ip2location , http://www.ip2location.com/ ,和Maxmind类似,不多介绍了。

纯真IP数据库
http://www.cz88.net/
主要是国内信息,比较准确,也比较精确(可以到小区、网吧什么的),数据也是中文的。比较适合分析国内数据,国内够用了。国外数据非常少,如果主要处理国外的,不要用这个。没有经纬度。
数据的使用方法:
方法一:利用其自带的程序,可以将二进制数据解压为文本文件,然后写个程序将其导入到数据库中。为了方便IP查询,将IPv4的文本格式统一转为整数处理(网上有关于IP转整数的方法)。
方法二:使用某种编程语言,直接对二进制的数据文件进行查询。当然你要知道它的二进制格式,不过有一些现成的实现。对于java语言,使用LumaQQ中的现成代码就可以了,因为以前LumaQQ的显示地理位置就是用纯真IP数据库实现的。只用到IPSeeker.java,Utils.java ,IPEntry.java 。核心是IPSeeker.java,使用很简单,一看就明白。顺便说一下,里面有个cache如果你不需要可以自己去掉,另外其单例模式不是线程安全的,如果多线程使用,自己加个同步。

官方组织:APNIC
http://www.apnic.net/
APNIC is an open, membership-based, not-for-profit organization providing Internet addressing services to the Asia Pacific.
数据下载:http://ftp.apnic.net/apnic/dbase/data/
http://ftp.apnic.net/apnic/dbase/data/country-ipv4.lst 提供了IP段到国家的映射。小工具chnroutes 就是利用这个数据。

二、通过 W3C Geo API 获得用户地理位置
也就是html5中关于地理位置的方面
geolocation api,地理位置由浏览器提供,需要浏览器支持。很多基于地理位置的网站都开始使用了,一般需要浏览器用户同意。
W3C 的 Geolocation API Specification:http://dev.w3.org/geo/api/spec-source.html

三、移动领域
手机:GPS(精确度高、刚开启时搜星比较慢、手机上比较费电)、根据手机信号的基站定位(不太精确、范围较大),
Wifi信号应该也可以,但要有这方面的数据收集

其它参考:
Web 地理定位(Geo-Location)知识大全,http://www.javaeye.com/news/13813-web-geo
根据IP定位地理位置,http://www.huachu.com.cn/read/readbookinfo.asp?sectionid=1000004203

Geo Location 地理位置信息小结相关推荐

  1. Redis之GEO存储地理位置信息

    在外卖软件中的附近的美食店铺.外卖小哥的距离,打车软件附近的车辆,交友软件中附近的小姐姐.我们都可以利用redis的GEO地理位置计算得出. 1.Redis 的 Geo 是在 3.2 版本才有的 2. ...

  2. Redis GEO地理位置信息的应用

    Redis GEO地理位置信息的应用 Redis GEO 概述 应用场景 Redis GEO命令 GEO命令演示 Redis GEO实现附近人的功能 基础类 API接口 接口实现 执行测试 Redis ...

  3. redis:地理位置信息geo

    简介 redis3.2版本提供了GEO(地理信息定位)功能,支持存储地理位置信息. 可以用来实现比如附近位置,摇一摇这类依附于地理位置的功能 GEO功能是 Redis 的另一位作者Matt Stanc ...

  4. 【Android笔记 二】Location获取地理位置信息(上)

    2011 7 22暑假实训的第五天,跟大家分享以下我对Android location的学习吧,这是一个最基本的获取地理位置信息的入门,下一次给大家介绍更质能化的地理位置选择Criteria,今天就先 ...

  5. 获取用户精准地理位置信息(百度地图)

    获取用户精准地理位置信息步骤: 1.通过 navigator.geolocation.getCurrentPosition(showPosition, showError); 方法获取经纬度: 2.使 ...

  6. html5实现获取地理位置信息并定位

    html5实现获取地理位置信息并定位 一.总结 一句话总结:获取地理位置是分两步:获取经纬度和根据经纬度获取地址信息 a.HTML5的Geolocation(地理位置功能(Geolocation AP ...

  7. Android通过百度地图API用Service和Alarm在后台定时获取地理位置信息

    本文主要介绍了Android项目集成百度地图API,使用AlarmManager定时调用Service,在Service中请求坐标更新,并通过坐标得到省.市和县三级地理位置信息的方法. 程序结构很简单 ...

  8. flutter利用高德如何获取地理位置信息bug处理

    flutter中对于利用高德如何获取地理位置信息, 1.在高德开发平台,注册成为开发者,并获取key 2.安装依赖 对于如何安装第三方插件 请点击此处pub.dev amap_location 3.修 ...

  9. 百度api:根据经纬度获取地理位置信息

    调用百度api,根据经度和纬度获取地理位置信息,返回Json. C#代码: using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Syste ...

最新文章

  1. PL/SQL高级编程
  2. Linux System Programming --Chapter Three
  3. webRTC——浏览器里的音视频通话
  4. MongoDB 小试牛刀
  5. 文献记录(part73)--基于 PCA 的信息压缩 : 从一阶到高阶
  6. Nancy跨平台开发总结(六)三层架构之Token认证的Rest API
  7. flex 弹性合模型
  8. 马云再谈对钱没有兴趣;比尔·盖茨:微软原本可以击败 Android!TypeScript 3.7 发布 | 极客头条...
  9. mysql php 时间比较大小_MySql中时间比较的实现
  10. html5画电池状态,JavaScript里获取电池状态的方法
  11. C++构造函数详解(复制构造函数)
  12. Java关于抽象类是否可以实例化问题
  13. Halcon 3D 计算3D模型的3D表面法线
  14. BGA封装的优缺点解析
  15. SpringBoot--访问静态页面
  16. “FlipFlo“.它从1计数到100,遇到3的倍数就替换为单词 Flip”,5的倍数就替换为单词“Flop”,既为3的倍数又为5的倍数则替换为单词 ―FlipFlop”其余情况下输出当前数字.
  17. Excel下载附件工具类
  18. 安装SAS增强型编辑器资源和步骤
  19. 第七章 LINUX中的火墙策略
  20. Simulink建模:PID控制模型

热门文章

  1. 防止文件泄露,教你如何识别文件类型
  2. 【尚硅谷】Java数据结构与算法笔记10 - 树结构的基础部分
  3. python遍历列表小妙招
  4. 计算机启动什么意思,UEFI启动是什么意思?UEFI和BIOS启动的区别是什么?
  5. “我,年薪200万,阿里P9,被劝退了!”
  6. VMware Workstation 安装 Windows 10
  7. 2021年中国信托行业发展现状及未来发展趋势分析[图]
  8. Python复制文件夹下的excel文件的指定列
  9. CSS画出三角形、直角三角形、梯形、直角梯形
  10. ZYNQ使用1G/2.5G Ethernet PCS/PMA or SGMII拓展PS端网口