公路中都是以樁號來標識空間位置關系的,這時候很經常用到的就是要把樁號轉化為經緯度,以滿足定位等要求。如何實現呢?
其實原理就是:用二分法找到離這個樁號最近的兩個相鄰點,找到後利用相似三角形的算法就可以得到樁號對應的經緯度了。
主要的代碼如下:
Java代碼
//輸入路線的節點List和裡程,返回指定裡程的相鄰點,如果在延長線上則返回起點或終點
private static Point[] getNeighborPoint(List list, double mile) {
Point pt[] = new Point[2];
Point tmp_pt1 = (Point) list.get(0);
Point tmp_pt2 = (Point) list.get(list.size() - 1);
if (mile <= tmp_pt1.getMile()) {
pt[0] = tmp_pt1;
pt[1] = tmp_pt1;
}
else if (mile >= tmp_pt2.getMile()) {
pt[0] = tmp_pt2;
pt[1] = tmp_pt2;
}
else {
int iIndex = 0;
int iStart = 0;
int IEnd = list.size()-1;
while (true) {
iIndex = (iStart + IEnd) / 2;
tmp_pt1 = (Point) list.get(iIndex);
if (tmp_pt1.getMile() > mile) {
tmp_pt2 = (Point) list.get(iIndex - 1);
if (tmp_pt2.getMile() < mile) {
pt[0] = tmp_pt2;
pt[1] = tmp_pt1;
break;
} else {
IEnd = iIndex;
}
}
else if (tmp_pt1.getMile() < mile) {
tmp_pt2 = (Point) list.get(iIndex + 1);
if (tmp_pt2.getMile() > mile) {
pt[0] = tmp_pt1;
pt[1] = tmp_pt2;
break;
} else {
iStart = iIndex;
}
}
else {
pt[0] = tmp_pt1;
pt[1] = tmp_pt1;
break;
}
}
}
return pt;
}
//根據兩個節點和裡程,找出該裡程對應的點,如果兩個節點裡程相等,則返回第一個點
private static Point getLocation(Point pt1, Point pt2, double mile) {
double difMile = pt2.getMile() - pt1.getMile();
if (difMile == 0) {
return pt1;
} else {
double k = (mile - pt1.getMile()) / difMile;
double difx = pt2.getX() - pt1.getX();
double dify = pt2.getY() - pt1.getY();
double x = pt1.getX() + difx * k;
double y = pt1.getY() + dify * k;
return new Point(x, y, mile);
}
}
這裡的樁號轉經緯度要與“經緯度轉樁號”相區別開來,樁號轉經緯度其實就是通過二分法找到相鄰的兩個點再用相似三角形來得到;而經緯度轉樁號是通過點到線的最小距離得到相鄰的兩個點,再通過求垂足的方法來得到樁號值。這裡要注意的是特殊情況的處理!