如何以高性能方式绘制大量折线?

问题描述 投票:-2回答:1

我想在地图上显示公共交通线路。我通过找到关联的关系-方式-站点或stop_position的点,从OSM收集了此信息。我从那一点构造编码的折线,稍后再显示。

可能很多。我有一点与超过20.000条线有关。

我如何以表演的方式显示它?

我尝试直接在地图上绘画,但是UI冻结。我尝试在不同的图层上绘画,但随后UI也冻结了。我尝试在不同的线程(ui线程和普通线程)中进行绘制,但是随后得到了不同的异常。

也许一个问题是,我不仅画了可见的线条,而且还画了所有的线条。但是在较低的缩放级别下,我仍然会遇到可见线过多的问题。

您能为我提供一些解决该问题的提示吗?

我的最后一种方法是这样的(它包含一些自定义功能,但希望这个想法很明确)。目前,它正在ui线程上运行,我知道这是一个问题,但是您能做些不同吗?

//p is a place which contains references to some place-specific information, which can be route data

var polylineList = ArrayList<PolylineOptions>()
for (refIndex in p.getReferences().indices) {
    if (p.getReferences().get(refIndex).getData() != null) {
        val data = p.getReferences().get(refIndex).getData() as Route
        if (data != null) {
            val polyLines: List<String> = data.polylines

            for (plIndex in polyLines.indices) {
                var polyLinePositions = PolylineUtils.decode(polyLines.get(plIndex), 5)
                var ll: ArrayList<LatLng> = ArrayList()
                for (pos in polyLinePositions) {
                    ll.add(LatLng(pos.latitude, pos.longitude))
                }
                var options = PolylineOptions()
                    .addAll(ll)
                    .color(fillColor)
                    .width(4f)
                    .alpha(0.75f)
                polylineList.add(options)
            }
        }
    }
}
mMapboxMap!!.addPolylines(polylineList)

经过编码的折线列表可能看起来像这样,如果列表很多,这只会成为问题:

"polyLines" : [
    "pwl`Cvnen]RHTD", 
    "jyl`Cfjen]y@nC", 
    "fxl`Cxhen]H@D@B@B@BBBF@D@R", 
    "fxl`Cxhen]TSXOVS`@_@", 
    "n|l`Cjden]CFYl@", 
    "z|l`Cxcen]KP", 
    "r}l`Cfcen]GDEDID", 
    "f}l`Cbcen]CCAC?C?E?C@E", 
    "b}l`Cfben]?I?KA]", 
    "h|l`Cx~dn]JTJb@", 
    "x{l`C~}dn]NX", 
    "pml`Chvbn]@\\F`AHnAHlAFp@R~BHv@DTBNBHDLFPLXFR^v@Rh@HXHVDZBP@R@NBVJrA@f@@f@JlAFtALtBTlDRlCd@hHRxBDTD`@F\\FPDLDLHRL\\JRP`@BF", 
    "lml`Cnubn]BX", 
    "dzm`Ct~~m]}@pAqAdB}@lAiE`F[b@_A`A_Ax@UPSPYXc@^UVWVa@b@Y\\a@`@WZ[\\SXOPQXYd@GHOVS\\S\\MT{@vAq@dAq@`AKRGLKPGPQ`@]bAw@xBKZMd@I\\E^Ir@WlCI|@M~@Mn@g@tBa@rBMh@Mr@Y|ACTMjACVAV?X@X@r@BfADx@FvBBZBZPfBD\\BZHx@LjAL|@ZxBLv@Jt@Dn@", 
    "tzm`C|}~m]OV", 
    "ppn`Cxz}m]e@b@a@f@_@`@k@l@g@n@y@`AIJKRKPGJEJM\\KXGNCNGXQh@M\\Sh@Sf@k@pA_ArBcAfC_AnB]f@QX", 
    "`qn`Cdz}m]OR", 
    "vco`Czb}m]QHOF[LUJWNi@\\UPWRSROTe@l@Y\\y@`AQTQ`@S`@Qf@IRUn@Yn@CDUf@Q^M^S^MRSX", 
    "lho`Cta}m]c@DSBMBy@NKB", 
    "~vp`Cfy|m]IB]Ja@Hc@Hg@Fc@F_@Fc@HI@q@Hc@HO@k@Hk@HYDUBeAN_@FYD[DeALsBTWDy@Na@Do@Hk@Ju@HM@OBM@O@_@@a@?[AQ?[AKAU@o@CWAa@Bk@F", 
    "twp`C~x|m]UF", 
    "dnq`Cdp|m]m@JcAVa@J]HaAPq@P}@Ry@Rq@PoAf@oAf@[J]N_@NED", 
    "z`t`Cj}{m]YDmE`@aAJq@DcAJcBP_CTcAJk@FsANqBRaAHm@Fm@He@F]F_@D{@R}@XQFc@Tq@Z{@d@q@Zs@X]Jk@LWDY@eABgA?gA?e@?W?W@W@]Dg@FsAPuBVkBVe@He@Hw@PcAT", 
    "rat`Cf}{m]WB", 
    "bkt`Cf}{m]MGOESE]Ea@A_@@_@BmALo@F", 
    "vkt`Cp}{m]SI", 
    "vvt`Cfe|m][Uc@YgCaBiCyAMI", 
    "rwt`Cve|m]GCGCECEC", 
    "vbx`Cpj}m]m@YeCiBa@Wm@]q@YeA]MCsBm@k@OUGaAU]GIAEAKAy@IYGYEc@IgAYm@OaBm@aBo@i@Sa@UaDuAm@Y{@[IC{B{@kAc@a@IYKaAa@[KKI]Ik@Ws@[OG_A_@eA[u@[SGUCu@GYAU?QAW?O?Q?[?c@Bg@FsAJe@AYAsAIa@AY?WAo@?_@BSAe@?O?O?k@Ei@Ge@Ie@IgAWYIs@Oo@QUIYI", 
    "nqk`Cbwin]\\dBV~A\\pCRzAXzAv@|CT|@Hr@Jp@Dt@Bt@@p@DfB?dA@j@Cn@CVETc@fDSrAGj@CPAR_@fS?l@@l@B\\D\\P`ATx@b@vAJ\\Pb@L`@L`@H\\BR?P?F?HALCRIb@Sv@GREVARCR?R@XBN@JBJHp@^nCPjATlAJZJNLPNLNLRJVHZBn@?`A?jA?`@@ZHZNTLRPNRh@x@h@~@h@x@h@z@`BnCPVfBhBdAdAfAhA~@nA~@tArBzCvAdCHLHJLLNJTL`@N\\JdBh@z@\\z@ZnBr@~Ad@h@NtBt@^RlBhAxA`AhGlERNVLh@Zd@TTJRFh@Hh@Hb@Dx@J~AVfCf@zDz@HBpAX`ANnAV`ARtAXr@LvARJ@fBFpAJj@Bn@BZAXAr@I", 
    "z`p`Cfron]JA", 
    "fap`Cdron]FArDu@bAUpCWlFi@bCQhCOvBKnCOrKk@lIc@tIc@`FWxDSzAKzAIjEUpE_@vCa@h@I|@OfBWjB[pBWrCe@fAUp@Sz@c@ZS^UfC}Bx@u@\\[^UTMXId@K`AO", 
    "jrt`Cjrnn]XE", 
    "dst`Cdrnn]`Fi@xAW|@YhAe@xCaAbDqA`Bo@nA]`Ae@xB{ArCiBrCcB~D{BpAq@f@[dBgAxA{@^]b@e@Xe@Pg@Ha@F[Fg@?m@YgDCkA?oAD}A@k@F_@FYJa@pAsCJa@JaABU?M?KCYE[Go@A[AO@M@[B_@X_B`AcEz@oETuALwAHoAHmCLu@Jo@Li@Pc@X{@H_@Dc@PwCPaCLu@Nw@Vm@|@aBXs@Pq@xAqEt@yB~@{D^sBV{APm@Pi@Na@Tc@HKFKJKJId@_@", 
    "`tw`Cxoin]XS", 
    "ztw`Cdoin]VOz@s@`@]LSLUh@yAd@_BPm@Rm@Na@\\iAFQDSJe@X}BLmBJ_Bt@_Jr@iHP{Ap@mELw@Dk@?m@CsC?O?O@M@MBODKFQP_@Xm@DQLi@J{@PkCHgDBcAJkDDkAJeAf@wDNqAB[?_@EYIa@Oe@Ws@_@y@Ww@Ia@CQCQAyA@k@@Y@KBSH[To@^eAPa@F[F[FYDY@[AcA", 
    "nmx`Cjeen]?O?S", 
    "nmx`Cfden]@cA@SBUDKBIFQHOHMJOf@y@Vo@Pw@RgATsBFgA@q@?]E]UgCK_B?[BU@MDSFUP_@R_@p@qAfA_CrBqEpAkCx@yAfDeJ`@eAVm@~AsD`@q@^w@Ja@Hs@Z{C\\gCN{A@Mh@kFH{@PkBb@yE^oEjB{T@YBc@?QAQ?SCUEUEUSq@Sq@{@_CEOAM?M?YHs@Hs@Ny@Jy@Jq@@Y?Y?UCUKk@Om@Ok@Qa@Oe@Ia@w@aJYsDEYCQCOOq@Ok@yA{E{@yCaA_DeAaDWc@Wg@}@iAe@s@a@s@i@mA_B}DKSMQMQOQk@c@sAu@yDeBo@UcBk@oF_BCAAA", 
    "fcx`Czj}m]OI", 
    "hul`Ctqfn]SSUi@QYQ_@M]ISs@oCYoAG]Ac@@g@@c@Fe@Hk@xAyF~AsGF_@FODSLe@FQNUNQ", 
    "pwl`Cvnen]kAbE}@pCSp@Qp@Kj@E`@", 
    "`pl`Cj~en]RJXF", 
    "dwl`Ctyfn]@N", 
    "rvl`Cn~fn]@MBKDQF_@", 
    "pul`Cd`gn]FMDIJS", 
    "pul`Cd`gn]KHMJ[Rc@Ti@Vy@`@QHq@^}Av@[R_@VsBzAw@l@YTUTMPMP_@l@OVQZSZQZO\\O\\O`@KXK\\Uv@i@lBg@rBENeAvEwAzGcAvEMv@Mx@MnAMtBCZAN"
]
android performance line mapbox paint
1个回答
0
投票

我认为这个问题没有那么糟糕,因为添加大量注释是一个普遍的问题。对于Markers,解决方案是众所周知的:聚类。

关键点之一是只绘制高缩放级别中可见的内容。在低缩放级别(可见更多线)中,多义线简化了,从线中删除点可以降低复杂度。

仍然是一个问题,如果一条路由有2000行,经过简化,您仍然有2000行。

因此,另一点是使线条变得简洁。线条的方向不一定相同,因此您可能需要转弯一些线条以将它们附加到后续的线条上。这样,您可以减少(简化的)行数,并且性能要好得多。

感谢您的努力。

© www.soinside.com 2019 - 2024. All rights reserved.