com.supermap.analyst.networkanalyst
类 MapMatching

java.lang.Object
  继承者 com.supermap.analyst.networkanalyst.MapMatching

public class MapMatching
extends java.lang.Object

基于HMM(隐式马尔科夫链)的地图匹配。

该方法是将轨迹点进行地图匹配。将轨迹点按照标识字段进行划分,按时间字段进行排序和分割轨迹,找到每条轨迹最可能的经过路线。目的是基于轨迹点还原真实路径。


构造方法摘要
MapMatching()
          构造一个新的地图匹配对象。
 
方法摘要
 DatasetVector batchMatch(DatasetVector sourceDataset, java.lang.String idField, java.lang.String timeField, double splitTimeMilliseconds, Datasource outputDatasource, java.lang.String outputDatasetName, java.lang.String resultTrackIndexField)
          对数据集进行地图匹配,结果保存为点数据。
 MapMatchingResult batchMatch(java.util.List<TrackPoint> coordinates)
          地图匹配结果。
 void dispose()
          释放该对象所占用的资源。
 double getMaxLimitedSpeed()
          返回最大限制速度。
 double getMeasurementError()
          返回轨迹点误差值。
 PathAnalystSetting getPathAnalystSetting()
          返回最佳路径分析参数。
 MapMatchingLikelyResult[] match(TrackPoint coordinate, boolean isNewTrack)
          实时地图匹配结果。
 MapMatching setMaxLimitedSpeed(double value)
          设置最大限制速度。
 MapMatching setMeasurementError(double value)
          设置轨迹点误差值。
 boolean setPathAnalystSetting(PathAnalystSetting setting)
          设置最佳路径分析参数。
 
从类 java.lang.Object 继承的方法
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

MapMatching

public MapMatching()
构造一个新的地图匹配对象。

方法详细信息

setPathAnalystSetting

public boolean setPathAnalystSetting(PathAnalystSetting setting)
设置最佳路径分析参数。

参数:
setting - 最佳路径分析参数设置。

getPathAnalystSetting

public PathAnalystSetting getPathAnalystSetting()
返回最佳路径分析参数。

返回:
最佳路径分析参数。

setMeasurementError

public MapMatching setMeasurementError(double value)
设置轨迹点误差值。比如 GPS误差值,单位为米。如果轨迹点到最近道路的距离超出误差值,则认为轨迹点非法。所以,设定一个合理的误差值对地图匹配的结果有直接影响,如果得到的轨迹点精度高,设置 一个较小的值可以有效提升性能,例如,15米。默认值为 30米。

参数:
value - 轨迹点误差值。

getMeasurementError

public double getMeasurementError()
返回轨迹点误差值。

返回:
轨迹点误差值。

getMaxLimitedSpeed

public double getMaxLimitedSpeed()
返回最大限制速度。

返回:
最大限制速度。

setMaxLimitedSpeed

public MapMatching setMaxLimitedSpeed(double value)
设置最大限制速度。单位为km/h。对相邻两个点计算出来的速度值大于指定的限制速度时,则认为这两个点不可达,即没有有效的道路相通。默认值为 150 km/h。

参数:
value - 最大限制速度。

dispose

public void dispose()
释放该对象所占用的资源。当调用该方法之后,此对象不再可用。


batchMatch

public MapMatchingResult batchMatch(java.util.List<TrackPoint> coordinates)
地图匹配结果。

参数:
coordinates - 待匹配轨迹点。
示例:
 public void  testBatch(Datasource datasource) {
        //打开工作空间或者数据源,得到网络数据集
        DatasetVector edgeDataset = (DatasetVector) datasource.getDatasets().get("SH_Small");
        DatasetVector DatasetPoint = (DatasetVector) datasource.getDatasets().get("shanghai");
        //设置SCC文件路径
        String filePath = "/MapMatch_SH_Small.ssc";
        //设置路径规划环境
        SSCPathAnalystSetting SSCSetting = new SSCPathAnalystSetting();
        SSCSetting.setNetworkDataset(edgeDataset);
        SSCSetting.setSSCFilePath(filePath);
        SSCSetting.setTolerance(0.1);
        // GPS预处理参数设置
        MapMatching mapmatch = new MapMatching();
        mapmatch.setPathAnalystSetting(SSCSetting);
        mapmatch.setMaxLimitedSpeed(150);
        mapmatch.setMeasurementError(100);
        //从数据集中获取轨迹点
        java.util.List coordinates = this.getTrackPointFromDataset(DatasetPoint, "Time");
        //进行地图匹配
        MapMatchingResult res = mapmatch.batchMatch(coordinates);
        // 释放分析对象
        SSCSetting.dispose();
        mapmatch.dispose();
    }    
 //从数据集中获取轨迹点
     private java.util.List getTrackPointFromDataset(DatasetVector dataset, String s) {
         java.util.List points = new ArrayList();
         // 点集合
         if (dataset.getType() == DatasetType.POINT) {
             int count = dataset.getRecordCount();
             Recordset recordset = dataset.getRecordset(false, CursorType.STATIC);
             recordset.moveFirst();
             for (int i = 0; i < count; i++) {
                 TrackPoint point = new TrackPoint();
                 Point2D pt = recordset.getGeometry().getInnerPoint();
                 point.setPoint(pt);
                 point.setTime((Date) recordset.getFieldValue(s));
                 points.add(point);
                 recordset.moveNext();
             }
             recordset.dispose();
             return points;
         }
         return null;
     } 
 

match

public MapMatchingLikelyResult[] match(TrackPoint coordinate,
                                       boolean isNewTrack)
实时地图匹配结果。

注意:需要至少两个轨迹点才能进行实时地图匹配分析。

参数:
coordinates - 待匹配轨迹点。
isNewTrack - 是否开启新的轨迹。
示例:
 //从数据集中获取轨迹点    
    private java.util.List getTrackPointFromDataset(DatasetVector dataset, String s) {
        java.util.List points = new ArrayList();
        // 点集合
        if (dataset.getType() == DatasetType.POINT) {
            int count = dataset.getRecordCount();
            Recordset recordset = dataset.getRecordset(false, CursorType.STATIC);
            recordset.moveFirst();
            for (int i = 0; i < count; i++) {
                TrackPoint point = new TrackPoint();
                Point2D pt = recordset.getGeometry().getInnerPoint();
                point.setPoint(pt);
                point.setTime((Date) recordset.getFieldValue(s));
                points.add(point);
                recordset.moveNext();
            }
            recordset.dispose();
            return points;
        }
        return null;
    } 
 public void testMatch() {
        // 0、打开工作空间或者数据源,得到网络数据集
        Datasource datasource = datasources.open(getDatasourceConnectionInfo());
        DatasetVector edgeDataset = (DatasetVector) datasource.getDatasets().get("TJ_Small");
        DatasetVector DatasetPoint = (DatasetVector) datasource.getDatasets().get("tianjin");
        //设置SCC文件路径
        String filePath = "/MapMatch_TJ_Small.ssc";
        //设置路径规划环境
        SSCPathAnalystSetting SSCSetting = new SSCPathAnalystSetting();
        SSCSetting.setNetworkDataset(edgeDataset);
        SSCSetting.setSSCFilePath(filePath);
        SSCSetting.setTolerance(0.1);
        // GPS预处理参数设置
        MapMatching mapmatch = new MapMatching();
        mapmatch.setPathAnalystSetting(SSCSetting);
        mapmatch.setMaxLimitedSpeed(150);
        mapmatch.setMeasurementError(30);
        //从数据集中获取轨迹点
        java.util.List coordinates = this.getTrackPointFromDataset(DatasetPoint, "Time");
        //进行实时地址匹配
        for (int i = 0; i < DatasetPoint.getRecordCount(); i++) {
            MapMatchingLikelyResult[] res = mapmatch.match(coordinates.get(i), false);
        }
        // 释放分析对象
        SSCSetting.dispose();
        mapmatch.dispose();
    }            
 

batchMatch

public DatasetVector batchMatch(DatasetVector sourceDataset,
                                java.lang.String idField,
                                java.lang.String timeField,
                                double splitTimeMilliseconds,
                                Datasource outputDatasource,
                                java.lang.String outputDatasetName,
                                java.lang.String resultTrackIndexField)
对数据集进行地图匹配,结果保存为点数据。

参数:
sourceDataset - 原始轨迹点数据集。
idField - 轨迹的 ID 字段,相同 ID 值相同的轨迹点属于一条轨迹,比如手机号、车牌号等。没有指定 ID 字段时,数据集中所有点将归类为一条轨迹。
timeField - 轨迹点的时间字段,必须为时间或时间戳类型字段。
splitTimeMilliseconds - 分割轨迹的时间间隔,如果时间相邻的两个点的时间间隔大于指定的分割轨迹的时间间隔,则会从两个点间分割轨迹。
outputDatasource - 保存结果数据集的数据源。
outputDatasetName - 结果数据集名称。
resultTrackIndexField - 保存轨迹索引的字段,轨迹分割后,一条轨迹可能分割为多条子轨迹,resultTrackIndexField 将会保存子轨迹的索引值,值从1开始。 因为结果数据集会保存源轨迹点数据集的所有字段,所以必须确保 resultTrackIndexField 字段值在源轨迹点数据集中是没有被占用。
返回:
结果轨迹点数据集,正确匹配到道路上的轨迹点。
示例:
 public void testbatchMatch(Datasource datasource) {
        // 0、打开工作空间或者数据源,得到网络数据集
        DatasetVector edgeDataset = (DatasetVector) datasource.getDatasets().get("SD_linyi");
        DatasetVector DatasetPoint = (DatasetVector) datasource.getDatasets().get("linyi");
       //设置SCC文件路径
       String filePath = "/MapMatch_SD_linyi.ssc";
        //设置路径规划环境
        SSCPathAnalystSetting SSCSetting = new SSCPathAnalystSetting();
        SSCSetting.setNetworkDataset(edgeDataset);
        SSCSetting.setSSCFilePath(filePath);
       SSCSetting.setTolerance(0.1);
       // GPS预处理参数设置
       MapMatching mapmatch = new MapMatching();
       mapmatch.setPathAnalystSetting(SSCSetting);
        mapmatch.setMaxLimitedSpeed(150);
       mapmatch.setMeasurementError(30);
        //进行地图匹配
        DatasetVector newDataset = mapmatch.batchMatch(DatasetPoint, "NewField", "Time", 3600000, datasource,
                "del_resultSD", "TrackIndex");
       // 释放分析对象
       SSCSetting.dispose();
       mapmatch.dispose();
    }