1、概念:
地理编码 是指将地物的**名称转化为地物的坐标,从而将地物展示在地图上。
逆地理编码 是与其相反的过程,即跟据一个坐标,找到对应位置的地物**。
2、目的:
对如下地图中的路网,前端点击一点,后台实现空间分析,找出点击位置的道路。
道路共有9w余条,分成线段25w余段,最终实现后,分析效率可达0.5s左右查出,前端感觉流畅。
3、实现步骤:
原理:使用到线要素的外包络矩形以及点到直线的距离。
外包络矩形 用于初步筛选道路,点到直线的距离用于精确筛选。
**
1、道路分段并存入数据库
先将道路分成一个个直线段,这样外包络矩形才有意义,否则对于环路,找外包络矩形的算法会出错。
**
2、分段的道路添加外包络矩形属性
即 xmax, xmin, ymax, ymin
3、跟据点坐标初步筛选道路
即满足外包络矩形 **包含 点坐标的线** 符合要求,这种符合要求的线可能有多条。
x=request.POST['x']
y=request.POST['y']
res=Line.objects.filter(xmax__gte=x,xmin__lte=x,ymax__gte=y,ymin__lte=y)
4、使用点到直线距离精确筛选
距离最近的即为我们要找的线。
**
点到直线距离:(就是点到直线的数学公式)
a=line.y2-line.y1
b=line.x1-line.x2
c=line.x2*line.y1-line.x1*line.y2
d=(math.fabs(a*int(x)+b*int(y)+c))/(math.pow(a*a+b*b,0.5))
4、为什么不直接对所有的线使用点到直线的距离?
因为:计算的速度慢!!**