程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> 樁號轉經緯度的實現

樁號轉經緯度的實現

編輯:J2EE

公路中都是以樁號來標識空間位置關系的,這時候很經常用到的就是要把樁號轉化為經緯度,以滿足定位等要求。如何實現呢?

其實原理就是:用二分法找到離這個樁號最近的兩個相鄰點,找到後利用相似三角形的算法就可以得到樁號對應的經緯度了。

主要的代碼如下:

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);
 }
 }

這裡的樁號轉經緯度要與“經緯度轉樁號”相區別開來,樁號轉經緯度其實就是通過二分法找到相鄰的兩個點再用相似三角形來得到;而經緯度轉樁號是通過點到線的最小距離得到相鄰的兩個點,再通過求垂足的方法來得到樁號值。這裡要注意的是特殊情況的處理!


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved