OSM 获取方式的来源和目的地
OSM get source and destination of way
我在 Java 中使用 Osmosis 框架编写代码,特别是用于 Java 的 OsmosisReader,用于 OSM 处理。
为此,我需要将 OSM 的路径转换为路径源和目标之间的边。
例如,采取这种方式:
<way id='155117788' timestamp='2021-11-04T10:33:53Z' uid='1935374' user='alxm' visible='true' version='16' changeset='113364120'>
<nd ref='985633394' />
<nd ref='5329510726' />
<nd ref='7203635659' />
<nd ref='5329510348' />
<nd ref='5329510364' />
<nd ref='5329510331' />
<nd ref='5329510322' />
<nd ref='5329508418' />
<nd ref='5329510351' />
<nd ref='5329510360' />
<nd ref='5329510663' />
<nd ref='5329510698' />
<nd ref='5329510730' />
<nd ref='6453015430' />
<nd ref='7264736136' />
<nd ref='5329510752' />
<nd ref='5329510751' />
<nd ref='5329510674' />
<nd ref='5329510688' />
<nd ref='5329510408' />
<nd ref='5329510709' />
<nd ref='5329510414' />
<nd ref='5329510382' />
<nd ref='5329510384' />
<nd ref='5329510795' />
<nd ref='5329510794' />
<nd ref='5329510656' />
<nd ref='5329510358' />
<nd ref='5329510359' />
<nd ref='5329510653' />
<nd ref='5329510381' />
<nd ref='5329510654' />
<nd ref='6819115285' />
<nd ref='992691843' />
<tag k='highway' v='secondary' />
<tag k='name:en' v='Ron Nachman' />
<tag k='name:etymology:wikidata' v='Q361323' />
<tag k='oneway' v='yes' />
<tag k='ref' v='4775' />
<tag k='surface' v='asphalt' />
</way>
如何查看哪个节点是路径的源头,哪个节点是目的地?
OpenStreetMap 数据库中的所有方式都有方向。这是由引用节点的顺序定义的:它们是从开始到结束的顺序。
就其本身而言,这个方向没有意义——它只取决于制图器开始绘制的位置。但是道路上的某些标签是指道路的方向。如果这些标签出现在路上,您需要考虑方向。
这些标签的示例出现在 OSM wiki 的文档中:
如果您要为路由创建边缘,您还应该考虑...
- ...可以在与其他路径共享的任何节点处留下路径,而不仅仅是在第一个和最后一个节点处。因此,路由图中的 OSM 路和边之间没有 1:1 关系。
- ... turn restrictions 可以防止共享节点的一些转弯。
- ...可能的行进方向取决于您的交通方式(例如,一条道路可能是汽车的单行道,但 two-way for bicycles)。
- ...除了您的交通方式之外,其他因素也会影响行进方向,例如可逆单程的时间。然而,这是很多专业的路由引擎都无法完全支持的。
我在 Java 中使用 Osmosis 框架编写代码,特别是用于 Java 的 OsmosisReader,用于 OSM 处理。
为此,我需要将 OSM 的路径转换为路径源和目标之间的边。
例如,采取这种方式:
<way id='155117788' timestamp='2021-11-04T10:33:53Z' uid='1935374' user='alxm' visible='true' version='16' changeset='113364120'>
<nd ref='985633394' />
<nd ref='5329510726' />
<nd ref='7203635659' />
<nd ref='5329510348' />
<nd ref='5329510364' />
<nd ref='5329510331' />
<nd ref='5329510322' />
<nd ref='5329508418' />
<nd ref='5329510351' />
<nd ref='5329510360' />
<nd ref='5329510663' />
<nd ref='5329510698' />
<nd ref='5329510730' />
<nd ref='6453015430' />
<nd ref='7264736136' />
<nd ref='5329510752' />
<nd ref='5329510751' />
<nd ref='5329510674' />
<nd ref='5329510688' />
<nd ref='5329510408' />
<nd ref='5329510709' />
<nd ref='5329510414' />
<nd ref='5329510382' />
<nd ref='5329510384' />
<nd ref='5329510795' />
<nd ref='5329510794' />
<nd ref='5329510656' />
<nd ref='5329510358' />
<nd ref='5329510359' />
<nd ref='5329510653' />
<nd ref='5329510381' />
<nd ref='5329510654' />
<nd ref='6819115285' />
<nd ref='992691843' />
<tag k='highway' v='secondary' />
<tag k='name:en' v='Ron Nachman' />
<tag k='name:etymology:wikidata' v='Q361323' />
<tag k='oneway' v='yes' />
<tag k='ref' v='4775' />
<tag k='surface' v='asphalt' />
</way>
如何查看哪个节点是路径的源头,哪个节点是目的地?
OpenStreetMap 数据库中的所有方式都有方向。这是由引用节点的顺序定义的:它们是从开始到结束的顺序。
就其本身而言,这个方向没有意义——它只取决于制图器开始绘制的位置。但是道路上的某些标签是指道路的方向。如果这些标签出现在路上,您需要考虑方向。
这些标签的示例出现在 OSM wiki 的文档中:
如果您要为路由创建边缘,您还应该考虑...
- ...可以在与其他路径共享的任何节点处留下路径,而不仅仅是在第一个和最后一个节点处。因此,路由图中的 OSM 路和边之间没有 1:1 关系。
- ... turn restrictions 可以防止共享节点的一些转弯。
- ...可能的行进方向取决于您的交通方式(例如,一条道路可能是汽车的单行道,但 two-way for bicycles)。
- ...除了您的交通方式之外,其他因素也会影响行进方向,例如可逆单程的时间。然而,这是很多专业的路由引擎都无法完全支持的。