com.supermap.analyst.networkanalyst

类 MapMatching

  • java.lang.Object
    • com.supermap.data.InternalHandle
      • com.supermap.data.InternalHandleDisposable
        • com.supermap.analyst.networkanalyst.MapMatching
  • 所有已实现的接口:
    IDisposable


    public class MapMatching
    extends com.supermap.data.InternalHandleDisposable
    基于HMM(隐式马尔科夫链)的地图匹配。

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

    • 构造器详细资料

      • 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(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;
             }
         
      • batchMatch

        public DatasetVector batchMatch(DatasetVector sourceDataset,
                                        String idField,
                                        String timeField,
                                        double splitTimeMilliseconds,
                                        Datasource outputDatasource,
                                        String outputDatasetName,
                                        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();
            }
         
      • match

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

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

        参数:
        coordinate - 待匹配轨迹点。
        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();
            }
         

Copyright © 2021–2024 SuperMap. All rights reserved.