城市可移动性分析工具。

drogi的Python项目详细描述


德罗吉

这是什么东西?

我在这里的目标是建立一个工具来分析城市地图的步行性,驾驶性,自行车性等等。它的最终目的是生成大量数据,并创建一种简单的方法来可视化给定区域中的基础设施故障点。

所有这些都是本着新城市主义、城市复兴、可持续发展和减少汽车依赖的精神,如果你有这种倾向,你可以在网上的其他地方阅读这些概念。

它应该怎么工作?

获取数据

谢天谢地,这一部分相当直截了当。在GeoFabrik GmbH's site我们可以获取openstreetmap.osm数据作为方便的提取。但就本自述文件而言,我们不会,至少现在不会。取而代之的是,我手动获取了一个邻居的摘录,它更小,从某种意义上说,这意味着我对所看到的东西有了更亲密的领域知识。

处理数据

正如我所提到的,我打算用这个东西来生成数据。出于这个原因,我决定围绕workrun的概念来设计它,这个概念将包括逐块获取数据,将数据粘在一起,生成一个城市大小的图形,并反复遍历。从所有的步行路径中出现的模式可以用来推断推论。 WorkRun类的使用方式如下:

importdrogiBOUNDS_DICT={"Lublin":(51.1942,22.4145,51.3040,22.6665),"lublin_small":(51.2380,22.5509,51.2514,22.5743),"new_york":(40.7002,-74.0212,40.7105,-74.0007),}lublin=drogi.WorkRun("Lublin",num_of_trips=0)

内部正在发生的是.osm映射的可步行方式被转换成shapely.LineString对象,然后从这些对象构建一个以字典表示的图。这种表示对于python来说是非常标准的,下图:

graph example

变成:

graph={'A':['B','C'],'B':['A','C','D'],'C':['A','B','D','E'],'D':['B','C'],'E':['C']}

我们只使用两个(latitude, longitude)元组,而不是一个字母字符串。

可视化

为了看到可视化的图形,我们将其绘制在画布上,由Canvas类的实例表示。以下呼叫:

new_york=drogi.WorkRun("new_york")my_canvas=drogi.Canvas(new_york.way_map.bounds_to_fetch)new_york.way_map.render_on_canvas(my_canvas,color="black",aa=True,linewidth=0.7,alpha=1)my_canvas.save("new_york.png",dpi=150)

生成以下图像:

lublin_small

遍历图表

让我们进行一次又一次的工作,这次是一些旅行,通过该地区,和一个新的画布。

new_run=drogi.WorkRun("lublin_small",num_of_trips=100)new_canvas=drogi.Canvas(bounds)

为了弄清楚哪个走道比其他走道更受欢迎,我们可以把它们画成半不透明的。我们还将调整线条,使它们看起来更轻一些。您可以自定义它,因为render_on_canvas函数使用matplotlib的Line2D对象。

new_run.way_map.render_on_canvas(new_canvas,color="black",aa=True,linewidth=0.7,alpha=0.5)fortripinnew_run.list_of_trips:trip.path.render_on_canvas(new_canvas,color="red",aa=True,linewidth=1,alpha=0.1)new_canvas.save("lublin_with_paths.png",dpi=150)

结果如下:

lublin_with_paths

我说“像这样”是因为每次旅行的出发地和目的地都是随机选择的,所以每次旅行都有可能是独一无二的。

寻找障碍

现在让我们假设我们想知道哪些地区是最大的罪犯在减少附近的步行能力。这样的地区可能是一条河流、一条无法通行的高速公路或一个大工厂。 这可以通过仔细查看Obstacle类来实现,该类的实例保存在每个Path对象内的列表中。 任何使路径偏离完美直线的区域都被视为障碍物,如下所示:

obstacles

现在假设我们对这些区域进行阴影处理以获得大量路径。我们得到的是一张地图,上面显示了这个城市的一些难以接近的地方。我们试试吧。

BOUNDS_DICT={"bigger_test":(51.21,22.50,51.28,22.605)}new_run=drogi.WorkRun("bigger_test",num_of_trips=20000)my_canvas=drogi.Canvas(new_run.way_map.bounds_to_fetch)new_run.way_map.render_on_canvas(my_canvas,color="black",aa=False,linewidth=0.1,alpha=0.2)fortripinnew_run.list_of_trips:trip.path.render_on_canvas(my_canvas,color="blue",aa=False,linewidth=0.1,alpha=0.01)forobstacleintrip.path.obstacles:obstacle.render_on_canvas(my_canvas,color="red",alpha=0.005,linewidth=0,edgecolor=None)my_canvas.save("bigger_test.png")

在单核上停留45分钟后,请注意:

bigger_test

有了这个,我们可以开始得出一些严肃的结论。

未来版本:

  • 在感兴趣的地点之间行走,而不是随机点
  • 分层画布渲染
  • 通过argparse模块的cli接口

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
初始化UserDefinedJavaClass Pentaho数据集成时发生java错误   java无法连接到Tibco JMS服务器   java getNumberOfCameras()始终返回0   java为什么我会得到“导入无法解析”,即使我可以在构建路径中找到类?   如何从ubuntu上的命令行使用maven运行java应用程序?   amazon web services如何在Java项目IDE IntelliJ中连接AWS neptune数据库   使用Java中的Google Drive SDK API显示文件列表   使用SharedReference的许多用户的java登录   java如何使用接口在两个活动之间进行通信   java我的框架占用了大部分可用空间   用Java实现swing显示BASH结果   如何转换有时会向Java8流/lambda添加转换值的循环?   如何使用基于JDK11的Java应用程序使用Java soap web服务   如何在Java中使用PDFBox突出显示特定的单词或句子   java Android Studio:将图像保存在SD卡中   java Maven tomcat插件:tomcat7:run还是tomcat7:runwar?   通过十六进制改变swing Java Gui颜色   java如何存储在60位字符串和int的数组中