公路工程以「樁號」(里程標識) 定位空間位置。需將任意樁號轉換為對應的經緯度座標,以支援 GIS 定位、導航等功能。
mile (樁號)、x (經度)、y (緯度)。P1(mile1, x1, y1)、P2(mile2, x2, y2)。k = (mile - mile1) / (mile2 - mile1)
x = x1 + (x2 - x1) * k
y = y1 + (y2 - y1) * k
private static Point[] getNeighborPoint(List<Point> list, double mile) {
Point[] pt = new Point[2];
Point first = list.get(0);
Point last = list.get(list.size() - 1);
if (mile <= first.getMile()) { pt[0] = pt[1] = first; }
else if (mile >= last.getMile()) { pt[0] = pt[1] = last; }
else {
int start = 0, end = list.size() - 1;
while (true) {
int mid = (start + end) / 2;
Point midPt = list.get(mid);
if (midPt.getMile() > mile) {
Point prev = list.get(mid - 1);
if (prev.getMile() < mile) { pt[0] = prev; pt[1] = midPt; break; }
else end = mid;
} else if (midPt.getMile() < mile) {
Point next = list.get(mid + 1);
if (next.getMile() > mile) { pt[0] = midPt; pt[1] = next; break; }
else start = mid;
} else { pt[0] = pt[1] = midPt; break; }
}
}
return pt;
}
private static Point getLocation(Point p1, Point p2, double mile) {
double dMile = p2.getMile() - p1.getMile();
if (dMile == 0) return p1;
double k = (mile - p1.getMile()) / dMile;
double x = p1.getX() + (p2.getX() - p1.getX()) * k;
double y = p1.getY() + (p2.getY() - p1.getY()) * k;
return new Point(x, y, mile);
}
本文解決「樁號→經緯度」:二分查找相鄰節點 + 線性插值。
反向「經緯度→樁號」:需計算點到多條線段的最短垂足距離,屬完全不同的幾何問題,切勿混淆。