OpenStreetMap:获取公园的所有入口
OpenStreetMap: Get all entrances in a park
我从 Openstreetmap 中提取了一些国家公园。但现在我想知道入口在哪里。 Openstreetmap 有一些标签,但并不经常使用。
所以我认为:进入国家公园的入口是一条穿过该公园边界的道路。一定是真的:你要去公园。我能想到的唯一缺点是它可能是员工专用的私家路之类的,但这应该占很小的比例。
那么找到这些点的最佳方法是什么?
我的猜测:我知道公园的边界。所以我可以下载那个公园里的所有道路。然后我可以对公园内所有道路的所有路段使用“Ray casting algorithm”,看看它是否越过边界。当它出现时:那是一条通往公园的路。
但是,这可能会非常慢。如果你的公园很大,里面有很多路,检查所有路段可能需要很长时间。
有没有更巧妙的方法?
现代计算机速度非常快。射线投射算法相当便宜。除非你需要检查数十亿个点,否则这应该不是什么大问题。
一个简单的优化是对公园边界线段进行排序。如果您沿 y 轴投射光线,则将它们按最低的 x 坐标排序。
每检查一个点,当线段的最低x坐标大于该点的x坐标时,可以停止检查。
您可以使用 overpass turbo 来完成此任务:以下解决方案将识别与国家公园关系的边界相交的所有道路。
在立交桥 Turbo 中试试吧! http://overpass-turbo.eu/s/aSN
只需导航至您感兴趣的区域并点击 "Run"。
以下是此查询工作原理的简要说明:
// restrict search to current bounding box
[bbox:{{bbox}}];
// get all relations with tag boundary = national_park
rel[boundary=national_park];
// get all ways in this relation and store it in inputset boundaryways
way(r)->.boundaryways;
// now get all highway ways, which intersect our ways in boundaryways
way[highway](around.boundaryways:0);
// exclude ways with tag highway=* which are part of the boundary relation
(._; - way.boundaryways[highway];);
// print result
out geom;
我从 Openstreetmap 中提取了一些国家公园。但现在我想知道入口在哪里。 Openstreetmap 有一些标签,但并不经常使用。
所以我认为:进入国家公园的入口是一条穿过该公园边界的道路。一定是真的:你要去公园。我能想到的唯一缺点是它可能是员工专用的私家路之类的,但这应该占很小的比例。
那么找到这些点的最佳方法是什么?
我的猜测:我知道公园的边界。所以我可以下载那个公园里的所有道路。然后我可以对公园内所有道路的所有路段使用“Ray casting algorithm”,看看它是否越过边界。当它出现时:那是一条通往公园的路。
但是,这可能会非常慢。如果你的公园很大,里面有很多路,检查所有路段可能需要很长时间。
有没有更巧妙的方法?
现代计算机速度非常快。射线投射算法相当便宜。除非你需要检查数十亿个点,否则这应该不是什么大问题。
一个简单的优化是对公园边界线段进行排序。如果您沿 y 轴投射光线,则将它们按最低的 x 坐标排序。 每检查一个点,当线段的最低x坐标大于该点的x坐标时,可以停止检查。
您可以使用 overpass turbo 来完成此任务:以下解决方案将识别与国家公园关系的边界相交的所有道路。
在立交桥 Turbo 中试试吧! http://overpass-turbo.eu/s/aSN
只需导航至您感兴趣的区域并点击 "Run"。
以下是此查询工作原理的简要说明:
// restrict search to current bounding box
[bbox:{{bbox}}];
// get all relations with tag boundary = national_park
rel[boundary=national_park];
// get all ways in this relation and store it in inputset boundaryways
way(r)->.boundaryways;
// now get all highway ways, which intersect our ways in boundaryways
way[highway](around.boundaryways:0);
// exclude ways with tag highway=* which are part of the boundary relation
(._; - way.boundaryways[highway];);
// print result
out geom;