GraphHopper调研笔记



一、 GraphHopper

GraphHopper是一种快速且内存有效的Java导航引擎,默认使用OSM和GTFS数据,也可导入其他的数据源。支持CH(Contraction Hierarchies)、A*、Dijkstra算法。

1、应用介绍

graphhopper有以下几种常见的地图应用:

(1) 把一个GPS点垂直投影到最近的道路上

(2)根据输入的两个GPS点进行路径规划,支持设置起点的离开方向和终点的到达方向

(3)根据一个GPS点和给定的时间范围给出等时圈的点

2、功能介绍

2.1 创建地图

2.1.1 示例代码

ghLoc是OSM格式的地图路径

cachePath是读取OSM地图之后的地图缓存,下次可以直接使用缓存中的地图

static GraphHopper createGraphHopperInstance(String ghLoc,String cachePath) {
        GraphHopper hopper = new GraphHopper();
        // OSM 文件路径
        hopper.setOSMFile(ghLoc);
        // 读取完OSM数据之后会构建路线图,此处配置图的存储路径
        hopper.setGraphHopperLocation(cachePath);
        hopper.setProfiles(new Profile("car").setVehicle("car").setWeighting("fastest").setTurnCosts(false));
        hopper.importOrLoad();
        return hopper;
    }

2.2点投影到路上的Node

2.2.1 示例代码

        EncodingManager encodingManager = hopper.getEncodingManager();
        BooleanEncodedValue accessEnc = encodingManager.getBooleanEncodedValue(VehicleAccess.key("car"));
        DecimalEncodedValue speedEnc = encodingManager.getDecimalEncodedValue(VehicleSpeed.key("car"));

        // snap some GPS coordinates to the routing graph and build a query graph
        FastestWeighting weighting = new FastestWeighting(accessEnc, speedEnc);
        Snap snap = hopper.getLocationIndex().findClosest(24.48183200, 118.18120700, new 			                       DefaultSnapFilter(weighting, encodingManager.getBooleanEncodedValue(Subnetwork.key("car"))));
        System.out.println(snap.getClosestNode());
        BaseGraph baseGraph = hopper.getBaseGraph();
        NodeAccess nodeAccess = baseGraph.getNodeAccess();
        double lon = nodeAccess.getLon(4312);
        double lat = nodeAccess.getLat(4312);
        System.out.println(lon+","+lat+";");

2.3路径规划

2.3.1示例代码

public static void routing(GraphHopper hopper, String from, String to) {
        String[] fromPoint = from.split(",");
        double fromLon = Double.parseDouble(fromPoint[0]);
        double fromLat = Double.parseDouble(fromPoint[1]);
        String[] toPoint = to.split(",");
        double toLon = Double.parseDouble(toPoint[0]);
        double toLat = Double.parseDouble(toPoint[1]);

        // simple configuration of the request object
        GHRequest req = new GHRequest(fromLat, fromLon, toLat, toLon).
                // note that we have to specify which profile we are using even when there is only one like here
                        setProfile("car").
                // define the language for the turn instructions
                        setLocale(Locale.CHINA);
        GHResponse rsp = hopper.route(req);

        // handle errors
        if (rsp.hasErrors())
            throw new RuntimeException(rsp.getErrors().toString());

        // use the best path, see the GHResponse class for more possibilities.
        ResponsePath path = rsp.getBest();

        // 导航结果点位集合
        PointList pointList = path.getPoints();
        // 总距离 m
        double distance = path.getDistance();
        // 总耗时 ms
        long timeInMs = path.getTime();

        System.out.println("路线点位: ");

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < pointList.size(); ++i) {
            if (i > 0) {
                sb.append("; ");
            }
            sb.append(pointList.getLon(i));
            sb.append(',');
            sb.append(pointList.getLat(i));
            if (pointList.is3D()) {
                sb.append(',');
                sb.append(pointList.getEle(i));
            }
        }
        System.out.println(sb.toString()+"\n------------------------");
        System.out.println("总距离: " + distance + ", 总用时: " + timeInMs);


        Translation tr = hopper.getTranslationMap().getWithFallBack(Locale.CHINA);
        InstructionList il = path.getInstructions();
        // iterate over all turn instructions
        for (Instruction instruction : il) {
            System.out.println("distance " + instruction.getDistance() + " for instruction: " + instruction.getTurnDescription(tr));
        }
    }

测试类

public static void main(String[] args) {
        String osmFilePath = "D:\\work\\CODE\\soft2study/GraphHopper_study/xiamen.osm";
        //加载地图
        GraphHopper hopper = createGraphHopperInstance(osmFilePath);
        String from = "118.15531256,24.51429705";
        String to = "118.08894888,24.47891989";
        routing(hopper, from, to);
    }

2.4等时圈计算

2.3.1示例代码

2.3.2结果示例

官网的等时圈示例

在这里插入图片描述

厦门以软三为中心点 15分钟驾车的等时圈示例,红色为100m的网格端点,绿色为等时圈的点

在这里插入图片描述

3、graphhopper应用与公共交通

谷歌推出了通用公交数据标准GTFS,主要是使用固定的文本格式和字符对公交数据进行标准化

General Transit Feed Specification

它是一个可预见的中转站位置和时间的结构化数据列表。

3.1.组成元素

agency.txt (机构,运行商)必须
stops.txt (站点,出入口)必须 对应公交站点
routes.txt (路线)必须 对应公交线路
trips.txt (路趟----每一趟车)必须 对应公交时刻表

如果把route表示每一条线路,那么trip就是跑在每一个线路上的车。
比如同是地铁5号线,3点一班车,5点一班车,那么就是两个trip表示。还有上下行车次,区间车等等情况。

frequencies.txt (频率)可选

引入频率,更好的表示trip,如频率表示:7am~9am 每3分钟一趟车。而Trip直接引用frequency即可。

calendar.txt (日历)必须

日历的作用是定义trip的生效日期,比如一个trip规定一个车,在工作日是一个频率,在周末是另一个频率,日期参数就很有用了。

calendar_dates.txt (日历-日期)可选

日期的特殊情况-----节假日,在日期规定了每个工作日都是一个频率,但是偏偏周一是清明节(放假),那么这一天也是按照周末的频率来的。calendar_dates定义假期,当假期与calendar有重叠,会以calendar_dates为准。

stop_times.txt (停车-时间)必须

这是一个与trip相关的表,表示站点的到站时间,离站时间,上下车属性等等。

fare_rules.txt (票价-规定)可选

公交必定是要收费的,这个表规定收费规则。

fare_attributes.txt (票价-属性)可选

表示收费的具体规则对应的钱是多少。

shapes.txt (形状)可选

一般地图信息,都会存储一个形状信息,用于展示(渲染),形状是用经纬度点组成的数组来表示的。

transfers.txt (转车)可选

4、利用源码本地搭建graphhopper

下载源码,源码中有一个web项目,有一个Application

在这里插入图片描述

根据官网上的指导说明,需要增加两个参数,一个是server 一个是配置文件

public static void main(String[] args) throws Exception {
        args = new String[2];
        args[0] = "server";
        args[1]="config.yml";
        new GraphHopperApplication().run(args);
    }

重点是配置文件config.yml,下载的源码中有一个config-example.yml,复制重命名为自己的配置文件,我这里命名为config.yml

修改了地图的路径和缓存的路径

  # OpenStreetMap input file PBF or XML, can be changed via command line -Ddw.graphhopper.datareader.file=some.pbf
  datareader.file: "core/files/xiamen.osm"
  # Local folder used by graphhopper to store its data
  graph.location: target/isochrone-graph-cache

其中datareader.file 表示地图的路径,我这里用的osm的格式

graph.location 表示地图加载之后缓存到本地的路径

完成上面的配置之后,启动GraphHopperApplication,看到了graphhopper的图形

在这里插入图片描述在这里插入图片描述

看到了最下面的Started… 表示启动成功

在浏览器中输入:http://localhost:8989/

在这里插入图片描述

空白一大片,F12查看原因,发现是在国内请求OpenStreedMap失败的原因。

路径规划的API

http://localhost:8989/route?point=24.51429705,118.15531256&point=24.47891989,118.08894888&profile=car&type=json&points_encoded=false
API参数说明参考https://blog.csdn.net/haochajin/article/details/99963678
返回的结果示例:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/18438.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

25000 字详解 23 种设计模式(多图 + 代码)

25000 字详解 23 种设计模式&#xff08;多图 代码&#xff09; 目录 创建型模式结构型模式行为型模式总结 前言 一直想写一篇介绍设计模式的文章&#xff0c;让读者可以很快看完&#xff0c;而且一看就懂&#xff0c;看懂就会用&#xff0c;同时不会将各个模式搞混。 设计…

前端项目的通用优化策略

一、虚拟滚动 当我们开发的时候&#xff0c;遇到大数据加载&#xff0c;页面卡顿的问题应该如何处理&#xff1f;大多数情况下&#xff0c;我们都是尽量通过分页的方式处理这类问题&#xff0c;但是总有一些特殊的情况我们必须把数据全部加载到前端进行处理。我曾经遇到过一个…

MySQL入门

创建数据库 用CREATE DATABASE关键字&#xff08;也可以小写但建议关键字用大写方便区分&#xff09;创建一个名为“mydatabase”的数据库。 CREATE DATABASE mydatabase; 如果名称和关键字相撞&#xff0c;可以用Esc键下面的反引号括起来&#xff08;关键字会显示蓝色&#…

kafka安装及配置

1. 下载 下载地址&#xff1a;Apache Kafka 我这里下载的是 3.2.1 版本。 2. 上传并解压 上传到 linux 下的 /home/software/ 目录下&#xff0c;然后解压 kafka_2.13-3.2.1.tgz 包到/usr/local/ cd /home/software tar -zxvf kafka_2.13-3.2.1.tgz -C /usr/local # -C 选…

处理日期和时间的 chrono 库

C11 中提供了日期和时间相关的库 chrono&#xff0c;通过 chrono 库可以很方便地处理日期和时间&#xff0c;为程序的开发提供了便利。chrono 库主要包含三种类型的类&#xff1a;时间间隔duration、时钟clocks、时间点time point。 1. Ratio 时间精度(节拍) std::chrono::ra…

【PHP在线定制商城网站源码V3.0】开源的DIY在线定制商城系统+在线礼品定制

源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/87637177 PHP在线定制商城网站源码&#xff0c;免费开源、免费下载。本商城基于mycncart开发。安装成功后即可浏览&#xff0c;你可以在后台->安装扩展功能上传安装插件&#xff0c;在代码调整中点击刷…

zlmediakit 新增可以使用硬件加速的转码http api接口方法

根据项目需求&#xff0c;我们需要使用硬件解码的方式进行网络摄像头数据帧的解析&#xff0c;给到算法模块使用 1、通过ffmpeg命令实验&#xff0c;ffmpeg -i IPC_URL -f rtsp rtsp://*/live 该命令默认是使用cpu进行解码的&#xff0c;我们需要使用GPU进行解码。 2、ffmpe…

如何进行DNS优化

在互联网时代&#xff0c;网站的访问速度直接影响着用户体验和转化率。而DNS(Domain Name System)作为域名解析系统&#xff0c;负责将域名转换为IP地址&#xff0c;是网站访问速度的重要因素之一。因此&#xff0c;DNS优化成为了提升网站速度的重要手段之一。 DNS优化到底是什…

API接口的对接流程和注意事项

一、对接API数据接口的步骤通常包括以下几个部分&#xff1a; 了解API&#xff1a;首先需要详细了解API的基本信息、请求格式、返回数据格式、错误码等相关信息。可以查看API的官方文档或者使用API探索工具。同时&#xff0c;还需要明确数据请求的频率和使用权限等限制。 ​​测…

leetcode:环形链表(详解)

前言&#xff1a;内容包括-题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读&#xff0c;拓展问题 题目&#xff1a; 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&…

C语言:指针求解鸡兔同笼问题

题目&#xff1a;鸡兔同笼问题 要求&#xff1a;使用自定义函数void calc(int h, int f,int *c,int *r) 求解鸡兔同笼问题。 h 表示总的头数&#xff0c;f 表示总的脚数。 例子&#xff1a; 输入&#xff1a; 5 16 输出&#xff1a; 2 3 分析&#xff1a; 在该代码中&a…

WxGL应用实例:绘制高精度的3D太阳系模型

文章目录 1 坐标系的选择1.1 黄道坐标系1.2 三维空间直角坐标系 2 使用JPL星历表计算轨道2.1 日期时间2.2 特定时刻天体的位置2.3 天体运行轨道 3 太阳系模型3. 1 太阳和八大行星全家福3.2 时间、距离和半径的缩放3.3 黄道坐标系模型 天何所沓&#xff1f;十二焉分&#xff1f;…

AI歌手——超简单一键运用ACE Studio来训练模拟真人唱歌

目录 1.安装ACE Studio 2.打开ACE Studio 3.导入midi或音频 4.调试音频 5.调整人物音色音高 6.调整歌词 7.自动添加呼吸​编辑 8.成品演示&#xff08;周杰伦の稻香——鲤阮&#xff09; 1.安装ACE Studio 安装地址 ACE Studio | Create Limitless Vocals with AI (t…

RK3568平台开发系列讲解(Linux内存篇)Linux内存管理框架

🚀返回专栏总目录 文章目录 一、内核态内存分配二、用户态内存分配三、内存篇章更新哪些内容沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们一起将整个内存管理的体系串起来。 对于内存的分配需求,可能来自内核态,也可能来自用户态。 一、内核态内存分配…

年后准备进腾讯的可以看看....

大家好~ 最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;今天特意分享一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友想去腾讯的可以好好刷一刷&#xff0c;还是挺有必要的&#xff0c;它几乎涵盖了所有的软件测试技术栈&#xff0c;非常珍贵&#xff0c;肝完进大厂&a…

Eplan2022 复制已有的宏文件生成新的原理图宏文件

下图所示为wago的787-722稳压电源&#xff0c;我们可以从官网下载到相应的eplan宏文件并导入数据源库。但是能下载到eplan宏文件的只是少部分公司的部件。那么没有宏文件的部件该怎么办&#xff1f; 接下来以明纬开关电源 NDR-120-24为例&#xff0c;创建一个宏文件。选择【主数…

基于springboot的医院信管系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

晶振概述及工作原理

晶振在电路板中随处可见&#xff0c;只要用到处理器的地方就必定有晶振的存在&#xff0c;即使没有外部晶振&#xff0c;芯片内部也有晶振。 晶振概述 晶振一般指晶体振荡器。晶体振荡器是指从一块石英晶体上按一定方位角切下薄片&#xff08;简称为晶片&#xff09;&#xf…

tensorflow GPU训练环境布置

tensorflow GPU训练环境布置 一、显卡驱动安装1.1 如何处理**Failed to initialize NVML: Driver/library version mismatch的问题**1.2 卸载旧的版本1.3 驱动安装 1.3.1 利用apt 安装1.3.2 手动安装 二、安装CUDA2.1 确定CUDA版本2.2 下载文件1. 找匹配版本2. 选合适的平台 2…

数据结构学习

1. 数据结构概述 数据结构是计算机存储、组织数据的方式&#xff1b;通常情况下&#xff0c;选好数据结构可以带来更高的运行或者执行效率。数据结构的优良直接影响着我们程序的性能&#xff1b;常用的数据结构有&#xff1a;数组&#xff08;Array&#xff09;、栈&#xff0…