用Java组件对出租车GPS采集点进行纠偏

随着技术发展,如今对出租车的运营管理也非常精准,运营公司后台通过实时接收出租车的位置信息,对出租车进行运营调度及安全管理。在位置信息数据的处理方面就离不开gis数据基础处理功能与空间分析功能。本文对位置数据的前期预处理做一个详细的讲解。

  • 数据准备:
  1. 原始上海出租车位置信息数据Taxi_105作为示例,依次为出租车id,采集时间,经度,纬度,速度,方向角,是否载客,如图一
  2. 点数据集模板,用于存储点对象
  3. 上海区域的网络数据集BuildNetwork,用于纠偏gps点坐标。
  • Java组件包:
    基础包com.supermap.data.jar,导航模块包com.supermap.analyst.navigation.jar
  • 处理步骤:
  1. 按行读取位置信息数据
InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
while ((lineTxt = bufferedReader.readLine()) != null)
{
	makeRecord(lineTxt);
}
  1. 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);
		}
	}
  1. 用网络数据BuildNetwork构建导航模型文件ssc,注"道路等级"为必填字段,且为整型,且值不为空
  2. 加载导航模型及分析环境:
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);
  1. 设置gps点预处理参数:
MapMatchParameter parameter = new MapMatchParameter();// GPS预处理参数设置
		parameter.setDatasetVector(gpsPoint);
		parameter.setTime("TimeInfo");// 时间戳,必设字段
		// 5.GPS预处理,只能是单个数据集纠偏,如一个出租车的数据
		DatasetVector[] point = analyst.prepareData(parameter, "prepareGPSPoint");
  1. 预处理数据转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++;
		}
  1. gps纠偏,找出最优点
Point2Ds result_t = analyst.traceRectify(data, 3);// 轨迹纠偏
  • 结果展示:
  1. 纠偏前原始点位置
  2. 纠偏后gps点落在路网上
  • 纠偏后的gps坐标点可以正常叠加到地图上,也可以用其做轨迹构建或用于实时路况的计算等等分析。
  • 完成工程下载链接RectifyGPSPoint.rar