程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 關於GPS定位較正的實現的分析

關於GPS定位較正的實現的分析

編輯:關於JAVA

我們在做定位車輛或其它相關GPS點的時候,由於返回得到的數據並不是很准確,如車輛傳上來的GPS坐標點偏離了道路很遠,而實質坐標應該是在道路上的,這時候需要做個較正,把在允許范圍內的點較正到道路上。怎麼實現呢?

可以先用利用得到的GPS坐標值循環遍歷得到距離道路最近的兩個節點,然後通過得到的兩個最近節點的坐標,利用求垂足的方法得到垂足的坐標就是所要求的點,也就是較正後的點了。

具體的代碼如下:

Java代碼

 //根據路線id和點坐標,找出該路線上距離改點的最近點
 public static Point getPoint(String roadid, double x, double y) {
 RoadlineDao dao = (RoadlineDao) DaoConfig.getDaoManager().getDao( 
  RoadlineDao.class);
 List list = dao.getPoints(roadid);

 double distance = Integer.MAX_VALUE;
 Point pt1 = null, pt2 = null;
 Point tmp_pt1, tmp_pt2;
 double tmp_distance;
 for (int i = 1; i < list.size(); i++) {
  tmp_pt1 = (Point) list.get(i - 1);
  tmp_pt2 = (Point) list.get(i);
  tmp_distance = Line2D.ptSegDist(tmp_pt1.getX(), tmp_pt1.getY(),
   tmp_pt2.getX(), tmp_pt2.getY(), x, y);
  if (distance > tmp_distance) {
  distance = tmp_distance;
  pt1 = tmp_pt1;
  pt2 = tmp_pt2;
  }
 }

 if (pt1 == null || pt2 == null)
  return null;
 else
  return getLatestPoint(pt1, pt2, x, y);
 }

 //點到線段的最近點
 private static Point getLatestPoint(Point pt1, Point pt2, double x, double y) {
 Point pt = new Point();

 Point pf = new Point();
 if (pt1.getX() == pt2.getX()) {
  pf.setX(pt1.getX());
  pf.setY(y);
 } else if (pt1.getY() == pt2.getY()) {
  pf.setX(x);
  pf.setY(pt1.getY());
 } else {
  double k = (pt2.getY() - pt1.getY()) / (pt2.getX() - pt1.getX());
  pf.setX((k * k * pt1.getX() + k * (y - pt1.getY()) + x)
   / (k * k + 1));
  pf.setY(k * (pf.getX() - pt1.getX()) + pt1.getY());
 }

 if (Math.min(pt1.getX(), pt2.getX()) <= pf.getX()
  && pf.getX() <= Math.max(pt1.getX(), pt2.getX())
  && Math.min(pt1.getY(), pt2.getY()) <= pf.getY()
  && pf.getY() <= Math.max(pt1.getY(), pt2.getY()))
 {
  pt = pf;
  double dx = pt2.getX() - pt1.getX();
  double dy = pt2.getY() - pt1.getY();
  double dm = pt2.getMile() - pt1.getMile();
  if (dx != 0) {
  pt.setMile((float) (pt1.getMile() + (pt.getX() - pt1.getX())
   / dx * dm));
  } else {
  pt.setMile((float) (pt1.getMile() + (pt.getY() - pt1.getY())
   / dy * dm));
  }
 } else
 {
  if (Math.abs(pt1.getX() - pf.getX()) <= Math.abs(pt2.getX()
   - pf.getX())
   && Math.abs(pt1.getY() - pf.getY()) <= Math.abs(pt2.getY()
    - pf.getY())) {
  pt = pt1;
  } else {
  pt = pt2;
  }
 }
 return pt;
 }

以上代碼應注意的是:

1.其實經緯度轉樁號也是一樣的原理,通過計算最終得到道路上的Point對象。

2.這裡大量用了Point類,最終求的點也是通過Point的get方法來得到的。

3.Line2D.ptSegDist(x1,y1,x2,y2,x,y)方法是得到(x,y)到兩個端點(x1,y1),(x2,y2)的線的距離。

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