从点和路径构造图节点和边

时间:2018-01-13 17:59:35

标签: geospatial openstreetmap graph-theory graph-algorithm spatial

我有一个xml文件(openstreetmap导出文件),它有两种类型的元素叫做node(它不是图形的节点)和way(图中的路径)。每个点都有一个64位标识符和坐标,每个路径都有一个64位标识符和一个点引用列表。例如:

<node id="1" lat="..." lon="..." />
<node id="2" lat="..." lon="..." />
<node id="3" lat="..." lon="..." />
<node id="4" lat="..." lon="..." />
<node id="5" lat="..." lon="..." />
<node id="6" lat="..." lon="..." />
<node id="7" lat="..." lon="..." />
<node id="8" lat="..." lon="..." />
<node id="9" lat="..." lon="..." />
<node id="10" lat="..." lon="..." />
<node id="11" lat="..." lon="..." />
<node id="12" lat="..." lon="..." />
<node id="13" lat="..." lon="..." />
<node id="14" lat="..." lon="..." />
<way>
    <nd ref="1" />
    <nd ref="2" />
    <nd ref="3" />
    <nd ref="4" />
    <nd ref="5" />
</way>
<way>
    <nd ref="6" />
    <nd ref="7" />
    <nd ref="2" />
    <nd ref="8" />
</way>
<way>
    <nd ref="9" />
    <nd ref="10" />
    <nd ref="4" />
    <nd ref="11" />
</way>
<way>
    <nd ref="6" />
    <nd ref="12" />
    <nd ref="9" />
    <nd ref="14" />
</way>
<way>
    <nd ref="5" />
    <nd ref="13" />
    <nd ref="14" />
</way>

如何使用上述数据构建图形?

对于上面的例子,输出应该如下:

<node id="1" lat="..." lon="..." />
<node id="2" lat="..." lon="..." />
<node id="4" lat="..." lon="..." />
<node id="8" lat="..." lon="..." />
<node id="9" lat="..." lon="..." />
<node id="11" lat="..." lon="..." />
<node id="14" lat="..." lon="..." />
<edge>
     <n1 ref="1" />
     <n2 ref="2" />
</edge>
<edge>
     <n1 ref="2" />
     <n2 ref="4" />
</edge>
<edge>
     <n1 ref="2" />
     <n2 ref="9" />
</edge>
<edge>
     <n1 ref="2" />
     <n2 ref="8" />
</edge>
<edge>
     <n1 ref="4" />
     <n2 ref="11" />
</edge>
<edge>
     <n1 ref="4" />
     <n2 ref="9" />
</edge>
<edge>
     <n1 ref="4" />
     <n2 ref="9" />
</edge>

是否有可以解决此问题的软件或算法?

感谢。

1 个答案:

答案 0 :(得分:1)

如果您习惯使用Java,请考虑查看Atlas。 Atlas是OSM数据的内存表示,允许您创建一个类似上面描述的图形。它还将为您提供连接,路由和空间搜索的API。

这是我们的测试实现的一个常见模式,它显示了如何从.osm文件创建Atlas。代码段:

public class TestAtlasTestRule extends CoreTestRule 
{
    @TestAtlas(loadFromJosmOsmResource = "yourOsmFile.osm")
    private Atlas yourAtlasFile;

    public Atlas getAtlasFile()
    {
        return this.yourAtlasFile;
    }
}