应用服务
地理逆编码
参考:
如何设计实现一个地址反解析服务?
延伸思考:
- 如果导入开源OSM矢量数据,如何对比出错误的矢量数据?
- 采用 Geohash地理编码(即栅格方案),运用文中有效栅格的思想,由于一个栅格里面可能处于行政边界之上(即跨行政区),那么一个栅格的细粒度如何规划?
地理围栏
参考:
地理围栏算法解析
射线法判断点是否在多边形上
延伸思考:
-
采用R树索引。
1.1. 先对地理围栏做R树索引,缩小遍历范围;
1.2. 遍历围栏,判断点在多边形上。
1.3. 对围栏边界做R树索引,最后对R树粗筛后的边进行精确求交判断。 -
java R树实现?
索引
hash索引
快速便利索引定位,时间复杂度为O(1)
等值判断查询
不提供范围查询
索引数量不宜多
-
Geohash:将一个经纬度信息,转换成一个可以排序,可以比较的字符串编码。
- 特点:
Geohash表示的是一个矩形区域。长度越长,精度越高。
- 缺陷:
方块边界点处的位置点虽然距离很近,但是却属于两个不同的Geohash编码。可以通过去搜索环绕当前方块周围的8个方块来解决该问题,会增大查询量。
树索引
- R树:从叶子结点开始用最小矩形将空间框起来,结点越往上,框住的空间就越大,以此对空间进行分割。
- 特点:
可以避免 Geohash 的全量便利索引,缩小遍历范围
工具
Redis GEO
API
- geoadd:增加某个地理位置的坐标。
- geopos:获取某个地理位置的坐标
- geohash:获取某个地理位置的geohash值。
计算距离:
- geodist:获取两个地理位置的距离。
范围搜索:
-
georadius:根据给定地理位置坐标获取指定范围内的地理位置集合。
-
georadiusbymember:根据给定地理位置获取指定范围内的地理位置集合。
可选参数:
- WITHCOORD:传入WITHCOORD参数,则返回结果会带上匹配位置的经纬度。
- WITHDIST:传入WITHDIST参数,则返回结果会带上匹配位置与给定地理位置的距离。
- ASC|DESC:默认结果是未排序的,传入ASC为从近到远排序,传入DESC为从远到近排序。
- WITHHASH:传入WITHHASH参数,则返回结果会带上匹配位置的hash值。
- 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') - WITHCOORD:传入WITHCOORD参数,则返回结果会带上匹配位置的经纬度。
空间数据库
选型: PostgreSQL,TSDB,MySQL,Elasticsearch
- 轨迹跟踪
- 范围搜索
- 空间对象关系判断
开源地图服务OpenStreetMap
关于领土和国界线的数据不是很准。 解析元数据步骤很复杂。