阅读 902

LBS 调研整理

应用服务

地理逆编码

参考:
如何设计实现一个地址反解析服务?
延伸思考:

  1. 如果导入开源OSM矢量数据,如何对比出错误的矢量数据?
  2. 采用 Geohash地理编码(即栅格方案),运用文中有效栅格的思想,由于一个栅格里面可能处于行政边界之上(即跨行政区),那么一个栅格的细粒度如何规划?

地理围栏

参考:
地理围栏算法解析
射线法判断点是否在多边形上
延伸思考:

  1. 采用R树索引。

    1.1. 先对地理围栏做R树索引,缩小遍历范围;
    1.2. 遍历围栏,判断点在多边形上。
    1.3. 对围栏边界做R树索引,最后对R树粗筛后的边进行精确求交判断。

  2. java R树实现?

索引

hash索引

快速便利索引定位,时间复杂度为O(1)
等值判断查询
不提供范围查询
索引数量不宜多

  • Geohash:将一个经纬度信息,转换成一个可以排序,可以比较的字符串编码。

    • 特点:

    Geohash表示的是一个矩形区域。长度越长,精度越高。

    • 缺陷:

    方块边界点处的位置点虽然距离很近,但是却属于两个不同的Geohash编码。可以通过去搜索环绕当前方块周围的8个方块来解决该问题,会增大查询量。

树索引

  • R树:从叶子结点开始用最小矩形将空间框起来,结点越往上,框住的空间就越大,以此对空间进行分割。
    • 特点:

    可以避免 Geohash 的全量便利索引,缩小遍历范围

工具

Redis GEO

API

  • geoadd:增加某个地理位置的坐标。
  • geopos:获取某个地理位置的坐标
  • geohash:获取某个地理位置的geohash值。

计算距离

  • geodist:获取两个地理位置的距离。

范围搜索:

  • georadius:根据给定地理位置坐标获取指定范围内的地理位置集合。

  • georadiusbymember:根据给定地理位置获取指定范围内的地理位置集合。

    可选参数:

    1. WITHCOORD:传入WITHCOORD参数,则返回结果会带上匹配位置的经纬度。
    2. WITHDIST:传入WITHDIST参数,则返回结果会带上匹配位置与给定地理位置的距离。
    3. ASC|DESC:默认结果是未排序的,传入ASC为从近到远排序,传入DESC为从远到近排序。
    4. WITHHASH:传入WITHHASH参数,则返回结果会带上匹配位置的hash值。
    5. COUNT count:传入COUNT参数,可以返回指定数量的结果。

    ex:找附近的人

    def pin(user, longitude, latitude):
        """
        记录用户的地理位置。
        """
        GEOADD('user-location-set', longitude, latitude, user)
    
    def find_nearby(user, n):
        """
        返回指定用户附近 n 公里的所有其他用户。
        """
        return GEORADIUSBYMEMBER('user-location-set', user, n, unit='km')
    复制代码

空间数据库

选型: PostgreSQL,TSDB,MySQL,Elasticsearch

  • 轨迹跟踪
  • 范围搜索
  • 空间对象关系判断

开源地图服务OpenStreetMap

关于领土和国界线的数据不是很准。 解析元数据步骤很复杂。

参考

文章分类
阅读
文章标签