WEB开发网
开发学院软件开发Java 关于GPS定位较正的实现的分析 阅读

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

 2009-09-06 00:00:00 来源:WEB开发网   
核心提示:我们在做定位车辆或其它相关GPS点的时候,由于返回得到的数据并不是很准确,关于GPS定位较正的实现的分析,如车辆传上来的GPS坐标点偏离了道路很远,而实质坐标应该是在道路上的,2.这里大量用了Point类,最终求的点也是通过Point的get方法来得到的,这时候需要做个较正,把在允许范围内的点较正到道路上

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

Tags:关于 GPS 定位

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接