PHP进阶学习之Geo的地图定位算法详解

本文实例讲述了PHP进阶学习之Geo的地图定位算法。分享给大家供大家参考,具体如下:

前言

日常开发中我们经常需要查找某个物体的定位,或者查找附近的范围等,我们自然而然会想到的方法就是利用各种提供服务的地图网站的API,基于API,用经纬度去实现定位和查找附近范围等等。然而,由于原理没有做一个了解和一定的认识,在对比距离远近关系或者控制精确程度方面,我们并不了解怎么利用这些经纬度数值去实现距离转化和对比。本章节我们就来探讨一下基于geo的位置算法原理。

概念

  1. 纬线:纬线是与地轴垂直的线,着东西方向环绕地球一周,所有的纬度都是平行的。其中,赤道是最长的纬线,纬度为0度,纬线数值是角度数值,从赤道开始分为北纬和南纬,都是0-90°;
  2. 经线:地球仪上的竖线,是连接南北两极并且与纬线垂直相交的半圆,子午线为0°,分为西经和东经,都是0-180°,经线也是角度数值;
  3. 经纬线和米的换算:经度或者纬度0.00001度,约等于1米,这个在GPS测算距离的时候可以体会到,GPS只要精确到小数点后五位,就是10米范围内的精度;
  4. 为了便于理解,将地球看成一个基于经纬度线的坐标系。经度范围为-180~180°,纬度范围为-90~90°,地球上任意一点都可以用经纬度这样两个维度去唯一确定

在实际应用中,如果要用两个维度去确定一个点,则计算量会很大,因为一个二维确定一个平面,如果我们把二维平面上的所有点都用一个数字表示,即经纬度换算成一个字符串,则可以转为一维坐标来表示,大大减少计算量。这就是现在应用广泛的geoHash。

geoHash:Geohash是公共领域地理编码系统,它将地理位置编码为一串字母和数字。Geohash提供了像任意精度这样的属性,以及逐渐从代码末尾删除字符以减小其大小(并逐渐失去精度)的可能性。由于逐步精度下降的结果,附近的地方往往(但不总是)呈现类似的前缀。共享前缀越长,两个地方越接近。

原理

能将一个地球上的点表示成一串字母,并且相近的地点字母的共同前缀越多。这能让位置搜索在开发中变得很容易。它的原理就是依据上述说的geoHash值。下面就来详细说明geoHash值是怎么算出来的:

  1. 根据经纬度计算GeoHash二进制编码(以经纬度值:(116.389550,39.928167)进行算法说明)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5595.html