1、概念:

地理编码 是指将地物的**名称转化为地物的坐标,从而将地物展示在地图上
逆地理编码 是与其相反的过程,即跟据一个坐标,找到对应位置的地物**。

2、目的:

对如下地图中的路网,前端点击一点,后台实现空间分析,找出点击位置的道路
道路共有9w余条,分成线段25w余段,最终实现后,分析效率可达0.5s左右查出,前端感觉流畅。

Echarts路线图添加点击事件(从底层实现逆地理编码) - 图1

3、实现步骤:

原理:使用到线要素的外包络矩形以及点到直线的距离
外包络矩形 用于初步筛选道路,点到直线的距离用于精确筛选。
**

1、道路分段并存入数据库

先将道路分成一个个直线段,这样外包络矩形才有意义,否则对于环路,找外包络矩形的算法会出错。
**Echarts路线图添加点击事件(从底层实现逆地理编码) - 图2

2、分段的道路添加外包络矩形属性

xmax, xmin, ymax, ymin

Echarts路线图添加点击事件(从底层实现逆地理编码) - 图3

3、跟据点坐标初步筛选道路

即满足外包络矩形 **包含 点坐标的线** 符合要求,这种符合要求的线可能有多条。

  1. x=request.POST['x']
  2. y=request.POST['y']
  3. res=Line.objects.filter(xmax__gte=x,xmin__lte=x,ymax__gte=y,ymin__lte=y)

4、使用点到直线距离精确筛选

距离最近的即为我们要找的线。
**
点到直线距离:(就是点到直线的数学公式)

  1. a=line.y2-line.y1
  2. b=line.x1-line.x2
  3. c=line.x2*line.y1-line.x1*line.y2
  4. d=(math.fabs(a*int(x)+b*int(y)+c))/(math.pow(a*a+b*b,0.5))

4、为什么不直接对所有的线使用点到直线的距离?


因为计算的速度慢!!**