前段时间Noah.终于走到了开源阶段,很多朋友对Noah.已开源的部分进行了使用测评,也有很多老铁为Noah.添砖加瓦。感受到了大家的热情,我们也如约发布了Noah.新的车位电池模块更新。
功能介绍:
本次发布的车位电池主要的功能由圈地排位和沿路排位两部分。其中圈地排位是在符合标准的情况下,在给定区域内尽可能多地排布车位。而沿路排位则是在符合消防标准情况下,沿着道路进行沿街车位排布。我们可以先看一下效果。
是不是感觉电脑屏幕看起来更加满了?(开心!)
如何操作:
新的车位模块继承旧有的车位功能,架构在开源体系的STEP6阶段,连接方式如图所示,同时可以附加线框连入停车场区域接口,按照需求的形态生成停车场。
输入端:
停车场用地默认接入STEP4中附属空地输出端。
建筑用地默认接入STEP3建筑用地输出端。
避让用线默认接入STEP3建筑层线输出端(可接入一个List Item 取首项,这样更快)。
道路外沿默认接入STEP3道路外沿输出端。
请大家复制链接,PC端前往论坛下载
http://www.ncf-china.com/forum.php?mod=viewthread&tid=55195&page=1&extra=#pid415726
请大家复制链接,PC端前往论坛下载
逻辑介绍
圈地排位部分电池如图
整个逻辑分为四部分:
STEP1:对输入线框进行筛选判定,剔除短边、尖锐角、以及面积不足阈值的线框,防止后续操作失败。
STEP2:对输入线框进行分类,对应单路单排、单路双排、环形排布、以及环形+内部排布四种排布方式。核心逻辑是按照其外嵌矩形最短边长度来分类,当然,内部还构建了一些电池组用于防凹形、尖角带来的offset失败从而影响分类结果等奇奇怪怪的bug。
STEP3:对各自分类进行操作。具体逻辑在各自封包中均有阐述。
STEP4:数据整理与输出。
经过了多轮debug的过程,现在圈地排位功能可以支持较多场景,只需给出闭合的多段线框,即可生成符合逻辑并且车位尽可能多的运算结果
沿路排位部分电池如图
由于车位部分在整个流程的末尾,树形数据大多都是经过一系列改动,很多列表的特征值并未保存下来,同时也有一部分数据进行了合并,导致这一部分运算量很大,所以这部分最重要的是尽可能简化运算量,达到快的目的。
沿路排位的算法是先提取道路/地块的边缘,然后分别向地块内部offset横排和竖排两个距离。同时将需要避让的部分向外offset一个防火间距,形成避让区域。用这个区域对offset的线框进行切割,就可得出三种类型的线:不能排车位的、可以沿着其横排车位的、可以沿着其竖排车位的。然后再将车位对应上去即可。
这种算法用线代替了车位,使原来需要4*N个点的布尔运算只用三点代替即可。极大的减少了运算量。尤其在不能进行列表运算,只能拍平运算的时候,可以提升十数倍的速度。
可调参数:
圈地排位部分:
面积阈值(限制最小用地面积)
边长阈值(限制最小边长)
车道宽度
车位尺寸(2.5*5.5)
环绕绿化带宽度
沿路排位部分:
退让(防火)距离
车位尺寸(竖向停车2.5*5.5)横向 (2.5*8)
写在最后:
这个封包算上大改和重写大概经历了5-6次的重大更新变动,里面有很多小惊喜。尤其是在简化运算量和增加运算速度上,下了很大功夫。例如梯度运算、多层布尔计算筛选数据等疯狂减少运算量的算法体现在了整个流程中。同时对于如何在整个运算末端修复树形数据、提升运算量,也有了新解决方案。当然,在整个过程中也碰到了很多bug,尤其是在数据结构整理时会出现的数据错位,以及双层数据错位,着实也让开发者头疼了很久。当然,最后写完了运行起来也成就感满满。希望更多朋友们加入Noah.开源计划,大家一起进步,共同构建一个开源、开放的平台!
——LYF
领取专属 10元无门槛券
私享最新 技术干货