java+postgis实现根据两点生成模拟轨迹gps数据

java+postgis实现根据两点生成模拟轨迹gps数据


前言

在我们开发系统过程中少不了需要制造一些测试数据用来检验功能的正确性,同时在功能演示给客户坐汇报也需要用到一些测试模拟真实的数据来展示效果,但是我们如果手动去制作这些测试数据就会很耗时耗力,通过代码的方式去自动生成测试数据就显得比较重要了。

常见的测试数据文本描述类型的制造起来相对容易,但是我们如果需要制造出模拟一辆或者多辆车的行驶轨迹GPS点位数据就比较麻烦,首先得保证数据是在道路上面且道路具有连贯性,其次需要保证移动的位置和方向以及每次行驶的距离具有真实性,这样难度就比较大了,下文就来实现如何快速生成这种比较难以手动制造的车辆行驶轨迹的模拟GPS点位数据。


一、实现流程

1.请求参数

points:点位信息,可以设置途径点,多个点位用分号隔开,格式:起点;途径点;终点
timeInterval:间隔时间 用来控制模拟数据的计算点位 单位秒
speed:平均速度 用来控制模拟数据的计算点位 单位KM/H
randomBase:用来控制数据点位的随机起伏基数,动态调整模拟出来的点位效果

2.功能流程

发送请求 —》根据点位信息查询路径规划数据 —》根据路径规划线(基于graphHopper实现可以参照之前的文章实现)路数据进行插值计算遍历获取到轨迹点位 —》生成结果geojson轨迹点位数据

3.postgis重要使用函数介绍

ST_LineInterpolatePoint:返回沿直线在分数位置处插补的点。

函数结构:第一个参数为线的空间几何数据,第二个参数是一个介于0和1之间的浮点数,表示点所在的线长度的分数。返回一个点几何对象。
geometry ST_LineInterpolatePoint(geometry a_linestring, float8 a_fraction);

4.生成的GPS模拟轨迹点位效果图

在这里插入图片描述

二、具体代码

1.核心代码

代码如下(示例):

 public JSONObject generateTrackData(String points, Double timeInterval, Double speed,Double randomBase) {
        JSONObject result = new JSONObject();
        result.put("type","FeatureCollection");
        JSONArray features = new JSONArray();
        List<GHPoint> GHpoints = new ArrayList<>();
        String[] pointsz = points.split(";", -1);
        // 遍历同时检查点位 如果超出中国范围的点位直接处理掉
        for (int i = 0; i < pointsz.length; i++) {
            GHpoints.add(GHPoint.fromStringLonLat(pointsz[i]));
        }
        // 请求对象的简单配置
        GHRequest req = new GHRequest(GHpoints).setProfile("car").setLocale(Locale.CHINA);
        // 获取返回结果
        GHResponse rsp = graphHopper.route(req);
        // handle errors
        if (rsp.hasErrors())
            throw new RuntimeException(rsp.getErrors().toString());
        // 获取返回的路线数据 然后根据路线生成对应轨迹点
        ResponsePath path = rsp.getBest();
        // 全路径的点、距离(米)和时间(毫秒)
        PointList routePointList = path.getPoints();
        //获取到总路线长度距离 单位米
        double routeDistance = path.getDistance();
        String routeWkt = routePointList.toLineString(true).toString();
        // 根据参数计算传入间隔时间每次行驶距离 单位米
        double distanceOneS = timeInterval * speed / 3600 * 1000;
        //获取到模拟生成的点位个数
        int pointCount = (int) Math.ceil(routeDistance / distanceOneS);
        double percent = 0.0;
        for(int i = 0;i <pointCount;i++){
            double dl = 1.0 / pointCount;
            Map<String, Object> feature = new HashMap<>();
            double bl = Math.random() * randomBase;
            if(Math.random()<0.5 && dl+(bl*-1) > 0 ){
                bl += bl*-1;
            }
            percent +=  dl + bl;
            if(percent <= 1){
                // 赋值 空间字段
                Map<String, Object> geometry = new HashMap<>();
                String sql = "SELECT ST_x(ST_LineInterpolatePoint(geom, " + percent + ")) as x,ST_y(ST_LineInterpolatePoint(geom, " + percent + ")) as y FROM (SELECT ST_GeomFromText('" + routeWkt + "',4326) as geom) As insert_point ;";
                Map<String, Object> xy = jdbcTemplate.queryForMap(sql);
                double lng = (double) xy.get("x");
                double lat = (double) xy.get("y");
                double[] location = new double[2];
                location[0] = lng;
                location[1] = lat;
                geometry.put("type", "Point");
                geometry.put("coordinates", location);
                feature.put("geometry",geometry );
                feature.put("type","Feature" );
                features.add(feature);
            }
        }
        result.put("features",features);
        return result;
    }

总结

以上就是实现生成模拟轨迹GPS数据的整体流程,可以根据具体使用场景去完善,目前随机生成点位这块还有优化空间。

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
在这个系统中,采用了后端技术栈,其中包括了使用了Springboot作为基础技术框架,Mybatis-plus作为操作数据库的ORM框架,flywaydb作为自动管理数据组件,postgis-jdbc作为postgis数据库的支持驱动,spring-boot-admin作为springboot的监控组件,shiro作为开源安全认证框架。 系统中的乡镇数据是通过将湖南省的所有乡镇信息导入到空间数据PostGIS实现的。具体的导入操作可以使用PostGIS自带的客户端工具进行,具体的操作方式可以参考相关资料或者博文。 在数据库中,乡镇数据的物理结构可以通过执行给定的SQL语句查询。该SQL语句创建了一个名为"biz_hn_town"的表,包含了gid、gml_id、name、layer、code、grade和geom等字段,其中geom字段是存储乡镇地理位置信息的几何数据类型。此外,该表还创建了一个名为"biz_hn_town_geom_idx"的索引和一个名为"biz_hn_town_pkey"的主键。 因此,通过springboot和postgis,可以实现乡镇数据的管理,包括数据的导入和查询等操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [基于Leaflet的乡镇行政区划在WebGIS中的可视化工具实践](https://blog.csdn.net/yelangkingwuzuhu/article/details/130588732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值