概念:
地理編碼是指將地物的名稱轉化爲地物的座標,從而將地物展示在地圖上。逆地理編碼是與其相反的過程,即跟據一個座標,找到對應位置的地物。
目的:
對如下地圖中的路網,前端點擊一點,後臺實現空間分析,找出點擊位置的道路。
道路共有9w餘條,分成線段25w餘段,最終實現後,分析效率可達0.5s左右查出,前端感覺流暢。
實現步驟:
原理:使用到線要素的外包絡矩形以及點到直線的距離。
外包絡矩形用於初步篩選道路,點到直線的距離用於精確篩選。
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))
爲什麼不直接對所有的線使用點到直線的距離?
計算的速度慢。