版权声明:本文为博主原创文章,欢迎转载,SuperMap技术问答社区 http://ask.supermap.com https://blog.csdn.net/supermapsupport/article/details/82112844
用Java组件对出租车GPS采集点进行纠偏
随着技术发展,如今对出租车的运营管理也非常精准,运营公司后台通过实时接收出租车的位置信息,对出租车进行运营调度及安全管理。在位置信息数据的处理方面就离不开gis数据基础处理功能与空间分析功能。本文对位置数据的前期预处理做一个详细的讲解。
数据准备:
原始上海出租车位置信息数据Taxi_105作为示例,依次为出租车id,采集时间,经度,纬度,速度,方向角,是否载客,如图一
点数据集模板,用于存储点对象
上海区域的网络数据集BuildNetwork,用于纠偏gps点坐标。
Java组件包:
基础包com.supermap.data.jar,导航模块包com.supermap.analyst.navigation.jar
处理步骤:
按行读取位置信息数据
InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格式 BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; while ((lineTxt = bufferedReader.readLine()) != null) { makeRecord(lineTxt); }
gps坐标信息转为点对象记录,由于gps采集坐标系是wgs84,与路网数据的坐标系是一致的,故不需做投影转换,gps时间戳字段必须转换为时间整型才可进行路网纠偏。
private void makeRecord(String lineTxt) throws ParseException { String[] strArray = lineTxt.split(","); // 筛选速度不正常的记录 if (Double.valueOf(strArray[4].trim()).doubleValue() > 0.0 && Double.valueOf(strArray[4].trim()).doubleValue() < 100.0) { Map values = new HashMap(); long time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(strArray[1]).getTime(); values.put("TaxiID", strArray[0].trim()); values.put("TimeInfo", time / 1000); values.put("Speed", strArray[4].trim()); values.put("Direction", strArray[5].trim()); values.put("HasPassenger", strArray[6].trim()); GeoPoint point = new GeoPoint(Double.valueOf(strArray[2].trim()).doubleValue(), Double.valueOf(strArray[3].trim()).doubleValue()); boolean add = mRecordset.addNew(point, values); point.dispose(); values.clear(); System.out.println("添加:" + add); } }
用网络数据BuildNetwork构建导航模型文件ssc,注”道路等级”为必填字段,且为整型,且值不为空
加载导航模型及分析环境:
String filePathBJ = "data/NavigationModelAll.ssc"; PathAnalyst analyst = new PathAnalyst();// 3.加载文件模型 SSCDataEnvironment environment = new SSCDataEnvironment(); boolean bConnect = environment.connectData(filePathBJ, netWork); // 4.设置ssc分析环境 boolean bEnviron = analyst.setSSCEnvironment(environment);
设置gps点预处理参数:
MapMatchParameter parameter = new MapMatchParameter();// GPS预处理参数设置 parameter.setDatasetVector(gpsPoint); parameter.setTime("TimeInfo");// 时间戳,必设字段 // 5.GPS预处理,只能是单个数据集纠偏,如一个出租车的数据 DatasetVector[] point = analyst.prepareData(parameter, "prepareGPSPoint");
预处理数据转gps对象:
Map<Integer, Feature> allFeatures = datasetVector.getAllFeatures(); GPSData[] gpsDatas = new GPSData[allFeatures.size()]; int i = 0; for (Feature f : allFeatures.values()) { GPSData gpsData = new GPSData(); gpsData.setPoint(f.getGeometry().getInnerPoint()); gpsData.setTimeValue((int) f.getInt64(timeinfo)); gpsDatas[i] = gpsData; i++; }
gps纠偏,找出最优点
Point2Ds result_t = analyst.traceRectify(data, 3);// 轨迹纠偏
结果展示:
纠偏前原始点位置
纠偏后gps点落在路网上
纠偏后的gps坐标点可以正常叠加到地图上,也可以用其做轨迹构建或用于实时路况的计算等等分析。
完成工程下载链接RectifyGPSPoint.rar