gpt4 book ai didi

openstreetmap - OpenStreetMap路由-Java Swing应用程序

转载 作者:行者123 更新时间:2023-12-01 06:56:34 24 4
gpt4 key购买 nike

我是OSM的新手。我必须为我的MSc项目构建一个Java App。在此项目中,我的应用程序需要从OSM(XML格式)下载原始数据,进行解析以将其显示在我的应用程序上。之后,我必须在我的应用程序上部署路由服务。老实说,我以前从未做过,所以现在我很困惑。你们有什么想法或源代码可以帮助我吗?请你帮助我好吗?

非常感谢。

最佳答案

您可以使用piccolo2d这样的2d绘图框架来渲染地图。
对于路线选择,您将需要构建graph来描述地图上的道路/道路,它们的连接方式以及所代表的距离。在地图上选择起点和终点之后,可以使用A star之类的算法来帮助您找到两点之间的最短路径。

一些详细信息:

OSM XML转储由三类实体组成(比这要复杂得多:有关详细信息,请参见official docs):

  • 节点:代表地图上的单个点,由经度和纬度定义。这些要么代表着显着的特征(种类繁多,但例如:商店,古老的纪念碑,小径上的大门等),或者是道路的一部分。
  • 方式:表示地图上的多边形。这些由节点的有序列表(由id引用)构成,可以表示线性事物,例如道路和路径(与您的路由问题相关),还可以表示边界区域,例如田野或森林边界,市区,湖泊的形状,河流等。
  • 关系:我不会在这里解决,但是您可以在官方文档中找到更多有关这些的信息。

  • 以上三种节点类型中的每一种都将以“标签”的形式与它们关联的其他数据,这些标签是键值(字符串)对,用于指定由节点/方式表示的实体的类型。可以找到一个常规列表 here和一个用于路由 here的列表。从OSM网站上获取的示例代表了一条本地小路(在本例中为德国):
    <!-- The nodes representing points along the way -->
    <node id="298884269" lat="54.0901746" lon="12.2482632" ... />
    <node id="261728686" lat="54.0906309" lon="12.2441924" ... />
    ...
    <node id="298884272" lat="54.0901447" lon="12.2516513" ... />

    <!-- A way, built of the points above, with a tag
    declaring it to be an unclassified road -->
    <way id="26659127" ...>
    <nd ref="292403538"/>
    <nd ref="298884289"/>
    ...
    <nd ref="261728686"/>
    <tag k="highway" v="unclassified"/>
    </way>



    两条道路相交的地方(例如两条道路相交时),它们将在相交点共享一个公共节点。

    要过滤生成路由图所需的数据,您需要:
  • 读取感兴趣区域的XML,至少读取节点和方式。
  • 过滤掉,仅保留基于其标签的所需方式(例如,其中k =“highway”等)。
  • 过滤掉除其余相关方法引用的节点以外的所有节点。

  • 仅隔离了所需的信息之后,您就需要从OSM格式转换为更适合路由的格式。尽管如上所述的OSM图可用于路由,但将地图表示为每个路线的起点和终点的节点集合以及路线之间的任何交点和代表交点之间路径的一组边线会更有效,以及它们的长度。

    例如,您可能想要转换以下内容(以相交的方式a-b,c-d,e-f):

    到更像:

    仅保留末端节点和相交节点的位置。在此表示形式中,您已从3种方式转换为路由图中的8条边线(ax,cx,xe,ed,xy,ey,yf,yb),每个边线具有关联的距离,该距离是通过沿着方式,累积距离:(例如,斧头:200m,ey:350m等)。请注意,您将需要计算经度/纬度空间中相邻点之间的距离,可以在其中找到公式 here

    您可以使用自己的数据结构或使用诸如 JGraphTJung的第三方图形库来表示此数据。从这里开始,路由是(为简单起见,假设剩余的节点集已足够细化以表示所有必需的起点/终点),选择一个代表旅程开始的节点即可,该节点代表最后,并使用A-star之类的算法(如上所述)来计算最短路径。

    据我所知,唯一的不足是,我提到的两个库都没有实现A-star。但是,您可以通过以较低的速度运行Dijkstra的最短路径(在两个库中都存在)来获得正确的结果-然后在对概念更有信心时自己实施A-star。

    为了使所有这些变得更加有趣:您可以使用估计的行驶时间(而不考虑距离)(考虑道路上的平均速度)。或者您可以根据路线的理想性来修改距离:骑自行车时,请减少交通流量较小的道路的距离,以选择更长但更安全的路线。另外,徒步旅行时,可以降低穿过特别风景区或地标(例如古迹或酒吧)附近路径的距离。

    鉴于OSM数据已经有不错的现有路由服务(例如 Cloudmade),您想要这样做的主要原因是为了使用您自己的自定义距离度量...

    关于openstreetmap - OpenStreetMap路由-Java Swing应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11127852/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com