当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:16:00  来源:本站整理

关于GPS定位较正的实现的解析[Java编程]

赞助商链接



  本文“关于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)的线的距离.


  以上是“关于GPS定位较正的实现的解析[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 关于GPS定位较正的实现的解析
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .