快速业务通道

关于GPS定位较正的实现的分析 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-25

关于GPS定位较正的实现的分析

时间:2009-11-12 javaeye lgx2351

我们在做定位车辆或其它相关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)的线的距离。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号