我们明智地在城市中漫步:在我提供服务时,我们建立了有趣的步行路线

UPD:由于主题进展顺利,并且表明对此类服务有需求,因此我将对其进行进一步开发。 我启动了VKontakte公众来收集反馈并发布更新信息https://vk.com/sightsafari

城市不熟悉的区域,少量的闲暇时间以及需要(或渴望)步行到达地铁/酒店/火车站-可能每个人至少都有一次陷入这种情况。 同时,一方面,我想看到一些美丽而有趣的地方,但另一方面,有限的时间并不能使我偏离直接路线太多。

如果附近没有大家都知道的主要景点,而在互联网上进行短暂搜索之后,这些景点可能会包含在您的路线中,则情况将更加复杂。 如果您被困在一些Kupchino中怎么办,而您只听说过最好不要被困在那儿? 我们必须继续导航,希望在途中会有一些有趣的事情。 但是,流行的导航员仅考虑距离和旅行时间,而没有考虑路线的趣味性。 我遇到了更多项目,试图考虑步行路线的便利性(绕过嘈杂的高速公路),但是我不仅要舒适地走,而且还希望看到美丽。



经过一番思考,我决定自己承担这项任务。 与往常一样,该算法的总体思路很简单,但细节在于细节。 在航行的情况下,小事可能非常重要,并且有健康危险,因为当导航员将他带到一个半废弃的工业区的荒野中寻找一个小的纪念标志时,任何游客都不太可能会高兴(工作一旦发生) 。

该算法的描述和示例工作已被删减,链接位于末尾。

主要思想


我最初的想法是:下载“开放街道地图”地图,进行分析,为行人撕裂所有可能有趣的物体的信息(我们仍然必须决定他们的清单),并在它们周围绘制一些缓冲区。 我们正在寻找具有一些标准框架的方法,其中包括构建导航图的过程,以使在这些区域中边缘的权重降低,从而使行人路线对它们的吸引力降低。

言归正传。 为了找到方法,我们使用了GraphHopper库,该库可以从包装箱中读取OSM地图,为不同类型的运输工具(汽车,行人,自行车)建立路线,并具有几种不同的算法来查找方法(简单搜索,搜索替代路线,各种加速,优化选项) ),并且可以预处理导航图以加快搜索速度(城市中的基本搜索可以在几毫秒内非常快速地工作)。 在我的工作示例中,选择了我的祖国圣彼得堡-在这里我可以自己评估所构造路线的质量和趣味性。

结果,该算法的基本版本在膝盖上粘在一起了两个晚上,然后沿着耙子和细小的东西开始了一段激动人心的旅程,其中恶魔被发现并躺在那里,我将在后面讨论。

游客对象和OSM问题


在开放式街道地图中,每个对象都是一个几何体(节点,道路或关系),外加许多键值字符串对。

这是OSM中的冬宫:



问题在于,由于OSM是可以由参与者打开和编辑的地图,因此标准化在两条腿上都是la脚。 要指定相同类型的对象,可以使用一组不同的标签和一组不同的对象组合,其中一些标签被视为“规范”标签,并在Wiki上进行了描述,但仍然有很多选择,既可以选择也可以是坦率错误,但仍然可以使用。 结果,任何与OSM一起工作的代码(尤其是任何导航器和渲染器)都必须考虑到所有这些问题,并包含一堆代码来处理这种特殊情况。

例如,正如许多制图者认为的那样,标记Highway = unspecified并不意味着“某种类型的未知类型的道路”,而是根据欧洲分类的非常特殊的道路类型,但是由于名称的缘故,它们在任何地方都可以模制。 此外,这种类型的道路假定存在行人路缘或人行道,因此,导航员会沿着行人路建立人行路线,而行人不会去圣彼得堡这样的真实道路(这是街道的行车道)。 或另一个示例:addr:housename我们有时使用标记作为建筑物的名称,例如,出于某种原因,宫殿广场上的General Staff建筑物的西翼便以此标记命名。 尽管OSM指南指出,仅应在使用名称而不是门牌号的国家(在日本似乎是这种情况)中使用它,对于官方建筑物名称,请使用名称标签等。

惹恼我的另一个时刻是绿色区域的标记。 为此,有两个不同的标签:休闲=公园和土地=草。 在地图上,它们看起来几乎相同:只是一个绿色区域,颜色略有不同。 结果,它们可以根据需要混合在一起。 因此,街道行车道之间的分隔草坪经常成为“公园”,并开始吸引远足小径。

在构建和分析路线时,必须亲自发现所有这些细微差别。
作为行人感兴趣的一组对象,最终选择了以下列表:

  • 被标记为旅游业的旅游景点
  • 绿地。 休闲=公园,花园。 经过一番商议,增加了土地用途=墓地。 一方面有一个马马虎虎的吸引力,另一方面,例如在圣彼得堡的瓦西里耶夫斯基岛上,唯一的大型绿色地带是公墓,当地人代替公园来使用,但那里没有真正的公园。
  • 水:河流,湖泊,池塘。 那里杂乱无章的水,水路标签和一堆重复的值。 在炎热的日子里沿着海滨长廊散步真是太好了。 无论如何,我还是这么想,直到我尝试对斯摩棱斯克进行处理-突然发现在河岸深处,这不是一个像我们圣彼得堡一样美丽的堤防,而是一片茂密和乱抛垃圾的荒地,行人宁愿远离它。 但是到目前为止,还不可能完全从地图上区分这些情况。
  • 具有历史意义的历史建筑和结构。 他们通常只是美丽
  • 镇上带有便利标签的其他小物件。 它有很多含义,我只选择了少数几个,例如,一个街钟(时钟)-它通常很漂亮,宗教建筑(place_of_worship),每个人的街头艺术品(涂鸦)和其他一些
  • 人行道和广场公路=行人

在研究过程中,我意识到除了吸引行人的正面区域外,还必须添加排斥行人的负面区域。 到目前为止,此列表包括:

  • 建筑物土地利用=建筑。 行人不高兴在脚手架下行走,在施工现场飞扬的灰尘中
  • 工业区和车库土地使用量=工业区,车库。 就在那时,这种与行人机构的细微差别发生了(我们在Lenmographmash工业区的旷野中对它进行了测试(我们在ITMO设计与城市化研究所对在平躺道路上行走的学生进行了测试,然后写了评论,作为对彼得格勒区步行舒适性研究的一部分)。 事实证明,在那里并没有用这个标签标记整个季度(通常是在标记大型工业区时这样做),但是每个建筑物都是独立的。
  • 理想情况下,我也想让行人远离尘土飞扬,嘈杂,有很多汽车且通常无视的宽阔的城市高速公路。 但是到目前为止,还不可能明确地检测到它们。 在OSM中,基本上只有车道数,但是这个标准还不够(许多重要的旅游街,例如Nevsky Prospect,也是多车道)

同一张Lenpolygraphmash,在荒野的某个地方包含印刷机的纪念碑,而我的算法将可怜的学生拖到了那里



景点的重要性


显然,景点是不同的。 这里有举世闻名的大型物件-像圣彼得堡的艾菲尔铁塔或圣以撒大教堂,吸引了众多游客,而为了参观,人们可以像个钩子。 还有一些小型的,小镇的装饰品-一些街头艺术品,院子里的小雕塑,人们只愿意一路上看到,而又不想将它们拖到远处。 为了正确构造有趣且便捷的路线,有必要学习如何区分景点的不同类别,而OSM中我们所拥有的只是一个确定的几何形状和一组标签。 我必须想出一套经验法则来分配兴趣点的“重要性”,以进一步确定图中权重的变化。

最初,重要性为零,如果满足以下条件,则重要性增加:

  • 如果有历史标记,则+3-只有重要的历史建筑物才具有,即使不是全部
  • +3,表示存在维基百科或wikidata标签。 通常只有重要的对象才有自己的Wiki页面。
  • +1表示存在链接或URL-同样,并非每个人都有自己的网站,但通常,此标记会引向某些目录的页面,并且小对象也拥有它
  • 每个名称标签+1。 名称可以通过多种方式设置,历史名称或翻译成其他语言的名称可以有各种old_name。 同样,许多名称的存在表明该对象足够重要(因为有人厌倦了将其全部放下)
  • 建筑:建筑-建筑风格,通常会贴在各种美丽的建筑古迹上

该列表是根据经验确定的,至少可以使您将冬宫与郊区的无名涂鸦区分开。 结果,重要性0意味着一些当地的无名小物件(一小片绿色的植物,涂鸦),大约3-4个已经很有趣了(教堂,可以坐下来放松的广场),接近10个城市级景点开始了,同一个冬宫。

该列表并不完美,并且严重依赖于OSM数据,而OSM数据通常是不完整的。 例如,纳尔瓦之门最初只有一个重要的单元,因为除了名称之外,什么都没有贴。 我必须亲自去OSM,并添加名称,样式,制造年份,高度(以正确确定能见度,下一步计划)等。 总的来说,这样做还有一个公共利益-为了提高路线的质量,我不时去OSM并在那里放下丢失的标签,然后其他导航器或程序可以使用它们。

影响范围


景点大小不一。 小型雕塑的观看距离应不超过5-7米。 从20到30,可以看到青铜骑士。 圣以撒大教堂是市中心最高的建筑之一,在200-300年之间就可以清晰地看到(据我所知,游客不必走近,但从这个距离欣赏美景是相当舒适的,甚至可以看到距涅瓦河另一岸一公里的距离,但没有详细信息)。 如何确定景点应影响行人路线的距离?

远处的青铜骑士和圣以撒大教堂的圆顶



首先,我建立了可见性的经验半径。 它们依赖于有关吸引力的所有可用信息,并将其转换为四个半径之一:小30米,中100,大250和大350米。

相距不远的是河流和公园的能见度。 我为他们设置了30米,即 大约相当于公园长廊或街道的宽度。 由于从远处看公园是毫无意义的,因此您需要靠近公园。

可见性的类型由以下规则确定:

  • 点对象(即由Point OSM类型指定的对象)的可见性较小,通常是小的纪念碑和街道艺术品
  • 但是指向并带有历史标记的是Medium,因为 这些通常是高座上的大型纪念碑,例如同一座青铜骑士
  • 小于20 * 20米(道路或关系)的区域为中等
  • 更多-大
  • 如果对象具有标签高度(以米为单位的高度)或建筑物:水平(楼层数),则在超过50米的高度处被认为是巨大的-这是专门为以撒和从远处可见的其他大型大教堂和建筑物而制成的

但是出现了一个问题:在圣彼得堡历史中心密集发展的情况下,采用半径的幼稚方法行不通,因为位于后院的一些寺庙的真实可见区域要小得多,实际上只有在对面的路段才能看到。 我必须开始构建诚实的(几乎是)可见性多边形。

圣凯瑟琳教堂坐落在院子的后院,四周四面都是房屋:



首先,有必要确定障碍。 好了,一切都很简单,我从OSM数据中读取并读取了带有建筑标签的所有多边形。 这些将是阻碍我们可见性的多边形。 然后,他编写了一个简单的朴素算法,用于使用光线跟踪为点的可见性构造多边形。 我不需要那里的高精度,每点十二条射线就足够了。 首先,我毫不费力地得出了地标几何形状的质心,但这对于长(长和窄)建筑物并没有给出最佳结果。 因此,将来,对于大型景点,我开始求三点-质心和最远离它的两个点,并且在外边界处彼此相距最远。 我为什么不诚实地建立可见性? 因为如果构造点的可见区域的算法很简单(我们让光线从所有方向射出点,查看它们穿过最近的障碍物的位置,将这些点连接起来),那么要建立边缘(最后是多边形)的真实可见性要困难得多(第一个首要决定-建立肋骨两端的可见度并结合-显然是错误的)。

结果是一个很好的近似值。 它的构建不完美,但是对于行人导航的需求,这种精度对我们来说足够了。 唯一的问题是,它没有考虑建筑物的高度,即 任何小型展位都会挡住我们对五层钟楼的视野。 但是没有什么可做的-OSM数据并不总是包含许多楼层,并且要在3D模式下构建可见性体积要困难得多。 虽然也许我会回到这一点。

为该教堂和附近的教堂构造可见性多边形



路线之美以及如何增加路线


因此,我们学会了考虑景点的重要性和知名度,并且似乎已经开始建立良好的路线。 无论如何,在我在圣彼得堡中心地区进行测试时,情况确实如此,那里每平方公里的美容密度非常高。

但是,有一点值得远离中心,这时该算法突然开始意识到其无能为力。 他建造的路线开始与最短的路线重合。 由于猫在这些区域有很多视线,因此它们的位置彼此相距很远,因此,当使用组合的“美丽+距离”度量搜索路径时,第一项的贡献几乎为零,因此,该算法仅建立了最短的路线。

当然,人们总是会说:“我们不是那样,这是我们无聊的城市”,但这不是很正确。 因此,我想知道如何评估构建的路线以及如何对其进行改进。 立即想到的最简单的解决方案是,通过将钩子插入到任何遗漏的兴趣点来扩展路线。

现在,在以下情况下:a)路线所有景点的重要性的总和比某个值小一公里,或者b)用户自己选择构建最有趣的路线,我的算法会尝试对其进行改进。 为此,构建初始路线,在其周围放置一个缓冲区(其厚度由长度决定,该路线越长-允许挂钩执行的时间越长),在该缓冲区内搜索得分大于2的几个新景点(尚未包含在路线中)(我们不希望每公里用钩子钩住没有命名的公共花园),并从起点到此中间目标,再从中间目标到目的地,铺设新路线。 同时,还要控制长度,因此,我们得到的路线的长度不得超过起点和终点之间最短路径的两倍。

该算法的第一个版本(左侧)无法找到有趣的东西并建立了最短路径。 但是带有中间吸引力的版本(在右侧)中包含DOT KV-19 ,它位于路线的右下角(在此缩放级别上,它不可见,但是服务会在列表中显示它,并允许您通过单击名称在地图上找到它) 。



同一个地堡。 总的来说,在库普钦诺,有足够的与列宁格勒防卫有关的物体,因为在那里,城市的防御线通过了:



当然,出于他认为微不足道的考虑,行人绝不会同意绕道而行。 这就是为什么该服务显示的是与最短路线相比的路线长度以及景点列表,只有用户可以决定他是否对这种路线感兴趣。 另外,还有一个滑块可让您减少(反之亦然增加)最大允许钩数。

. - «» . . , , . , . «» ( ), , .

. , , . . . . , ( ), , . , — . . . , , .


sightsafari.city
( OSM-, ), , . : , , , — .

. , :



. , , , .



. , .



: ( ) « » . , , , .



结论


-, ( ). , . , ( ), - .

— , , , ( , , ), - . - OSM, - , ( , , 2-3 , ).

UPD: , , , , , , --, , , , , , , . , .

UPD 2: OSM, , ( , ), , . - , ( ) - , ( ).

UPD 3: , https://vk.com/public168028574

Source: https://habr.com/ru/post/zh-CN414433/


All Articles