Skip to content

Instantly share code, notes, and snippets.

@ariesmcrae
Last active October 11, 2023 12:02
Show Gist options
  • Save ariesmcrae/578dac505c98583cb65882f43f874693 to your computer and use it in GitHub Desktop.
Save ariesmcrae/578dac505c98583cb65882f43f874693 to your computer and use it in GitHub Desktop.
Typescript: How to decode google maps encoded polylines

npm i @mapbox/polyline

npm i -D @types/mapbox__polyline

import * as polyline from '@mapbox/polyline';

/**
* coords is encoded using the Google Maps algorithm for polyline encoding. See
* https://developers.google.com/maps/documentation/utilities/polylinealgorithm
* Use this for decoding https://www.npmjs.com/package/@mapbox/polyline
*/
async function main(): Promise<void> {
  const googleMapsEncodedPolyline = [
    {
      coords:
        'hqytD{~r{YJLLJ|@l@lA`AbAh@TLb@NZBXAn@Mh@Q`@IXGn@AX?p@Jd@Jz@^B@|@ZB@`@Px@VZJ`@@z@DV@\\BlIZlDXfCPnB\\B@nCj@x@XfFfB@@t@R~Af@fBb@j@H??x@Nz@Rn@Ph@JhB^bBTnALn@LL@F@^?Z@F@hAFlCBjC@R?zA@lCBlABfBBX@bABR@~@@p@BT@p@@VA^@vB@X?p@?`AAJ?L@\\?dA?dACH?zB?bD@d@@dBAdD@|B?nL@T?`E@jB@F?Z?nC?dB@D?jB@fC@nA@t@?vA?rD@rD@dIBbA?d@@bA@vA?~A@zA@xLCnACdC@vEBvNHbD@xIKjBCbCEnCCb@?|J@fBAl@?tFAr@CbA?x@CL?J?h@?~BDR@jB?t@?xA?d@AbA?@?f@Al@?`C?F?Z?x@AbB@T?v@AhE@L?N?b@?d@?bDAL?zD@|@@rDBT?bIBb@?tC?dB?rD?tE?zF?nL@bC?vBClECrG?pA?dC?N?xA?~BAj@?H?zF?xB@`F?fJ@zF@^?rCAbCArAAzF?nB?nD?\\?tCAb@AnCAjB@lB?lC@lC@pC@jFEL?vLAZ?~G@rD@vE@zA?zB?zEAT?H?~IC^?v@AzAA|HIh@?D?n@?j@@hA?nB@bA?fBAf@?J?|LAD?vFBhABnEDbDAzB?rBBpEBtB?bE?nE?n@AV?P?dE?tC?bB?bIAjB?jB?~EAZ?dAAhJCB?^AbC?rA?bL?rA?~F@fB?pDApJAlEEjECn@?bHHfDBrAAdEAr@?p@?f@?`MGpJIdEDX?L?x@@tBBN?~BFjBDL?F?zIBlA?X?Z?P@PAn@?dA@`AAtCBr@A|D@F?zHAhC?lAA`A?lC?F?rDDfABn@@fIEt@AjBEjBC~GKbIM~GKDAlFHB?@?fCHvC@`CBZAx@?F?fC@rD@bA?^?F?nCAjB@V?fCAzAAzDEtA@rAA`B?nBC^@@?tACvADf@@nCDvAB@?~B?tABB?^?bDC~CE~AC^AvAAN?tB?rB?R?z@?~@AfA?b@?tB?`BA~@ArACvAKxBQ`@ElAS\\EHCf@GnEy@lAQtAM\\Ef@Ex@C~@Bx@DjBNdALtANfEb@p@FlBPfBLTBf@@z@BzAFjBJvDHF?lBFfDFT@L?pA?pA@B?J?jKDtABpB@hFB`EDf@?hBBtDAnDAf@?dDE|DEjAAb@EfDKrDGz@CbC?lAAt@?nHB`A@~DA`EA`LA^ApLCtMChB?jCAB?rLBnELz@BN?f@?bFGlGIvA?xDF~ABxHJhCD`GJlCB`@?pBDd@?|A?rCBfB?B?lACx@CtBGfBG^?lAArA?tDAr@Ab@?z@AzCC\\?vA?X?v@@NBt@D|@Hn@BfA@v@?zB@~BBx@@~B@\\AbEEtCAnAApBAvBAbEEpBEnACbCGf@CbACzBGz@Av@AxBA~@?z@@dCBdCBrD@`IAfJ?rDApFTnAF^BdADbBD@?`@Bl@@nDB@?tE?p@?nB?pA?dBA^?d@?pBBlB@bA?nB@fF@dGDt@?dEB`B?z@y@Z[JQHQDQH]J_@DOBE@I@G?G?G?EACCCCCCEOKMKEIKUEOEe@AM?_@Bu@AWC]Gs@?AIq@EWGw@Ck@?{@?_@?S@QD_AF_@He@F_@He@Ho@Ho@Ly@He@DYDWFYFWBEDO`@s@rAoBdB}Ar@m@vAiArCsBl@e@nA}@vBaAb@QfCcAnA_@PCfAKbBCpBDZ@jKl@D?pF\\~EZ|DVdAJt@Fd@@`@?n@B\\B\\Df@LVHHBVHx@VvBv@bBl@lBb@|@R\\FlALrCR`ABrBHxFV`BPTB`Cb@~ARhCTnEZbBFP?b@@r@?h@AtCKF?nE]pGu@bB[f@Md@O^S`@W^YtAoAvDqDbA_AfAq@`Bw@pCaA`FmBDATEh@QTKNGl@_@pA_AHIl@i@RQb@Yf@a@`Ai@PIBAn@Q`AUb@Ib@MTEpC]TGPIJE\\IPIFGJKBCNWPS@AVYTS^a@r@q@h@e@^Y\\[\\a@Za@PULUt@mANQPYR]L[J[r@yC`@oAn@wAJSP[RUX[\\c@T[@C`@a@X[v@_AX]j@k@XUFINSX]f@g@X[DGVUT[X_@\\m@NSt@gAtCsD~B_CjDeCRMf@S^Q^QrAq@PKRKn@[VKRIpAs@`Ag@`@SHE|@o@bAm@ZOh@Qb@SpBkAJGbB{@|BkAvAs@nAu@v@a@\\QnBy@LGhC{AfAm@`DcBnCwAj@[tAm@rEaCnBeAfC{Ad@W`B{@HEd@WrAm@tGiDlKsFd@WJGr@]xA}@|F{C~Ay@l@_@rA}@HGPQh@s@`AiAz@_ANUdFoGFITWh@w@Xc@d@{@\\s@FOPm@TgAFORq@BGPe@h@}ApAgDn@gBXs@BGfAgDDMf@yBTgAHi@NmA?C`@eCF]`AaGLgALm@v@kCRw@Ng@DKDKNUd@w@Zg@z@iALQpAmAXMRKTEd@ChEu@rGk@nHe@jJ]`CElEGJ@H?d@@D?LEDGHIdAyAX[HGTM^MFCb@KLCx@G\\?pA@Z@R?ZDNBVFJ@D@RFh@\\b@TLDr@N~AXD@b@J@?lB^TFnA`@v@`@LHn@h@\\Xd@b@~AtB`@h@NNRNBBt@h@f@b@NHBBTJh@NJ@J@p@@T?TATAHAvAQj@Gf@?H@JDLFDBD@~Af@pAn@LHf@ZLJr@h@FDFFd@h@^ZjAr@hC|Av@j@^TfCfBh@j@\\VfAv@ZRVLND^JXFXJZJHDfAd@pAp@NFRFJBd@PZHJ@r@@lCDbADhAB`BBVCf@AD?\\EJ?\\@J@HBRNFDHHFJJVNl@HZLr@Nj@Tv@JZLZ\\x@n@hBj@jAJVNVX`@PNBBRLNHXJZJ`Bd@tCr@nAZ`@LHDNFLHZVLHHF`BfAdAv@l@^FDx@d@hC~AVNLFf@JNBZDpAJL@|@@rDF@?^@F@XHp@TNDnDj@xGbAP?@?XBxBJ~ABX@jAAj@CbALl@LzAh@XFL@pBDh@APARAVC^AhDCD@z@BZD^H\\NNHZPHDFBl@XJB@@NBp@HL@x@NLBL@f@@X@zA?fB\\nIbCrBl@~ErAzA`@`@Jl@ZTFTDV@`@D`@Hd@FzCd@JBtA`@JDj@^j@Z\\R@@\\T|@j@h@`@JHJDXJ~C~@hAZbBj@vAf@j@\\hA~@pAlAbAvAJLPV~@bAZ`@\\d@Xb@BFLPhAvA`@b@LJNLh@ZVRJJHHNVHNTTJJb@\\nAfAd@ZVNLF|Bt@HBX@`BCbBCF?NCPAb@AdAAXAJA^CHALEPEHCHKb@q@h@k@pAcBHI^a@b@a@^a@x@cATYFGv@k@HGXOPItAg@h@OLEn@Or@QnAc@TIVGJErAa@p@Un@Mv@Mx@Mj@MdAQTEjBMTE\\K\\OZMz@_@PGPMPK^WVUVY`@[FE`@KJAlAIt@If@Kj@MFClA_@`@KVERAh@AZ@n@BR?ZA^Ct@OTIHC\\MZOnBq@fEuAh@QFCrBs@TGLCFAv@GtAGhAIj@KJADCLGlAg@lAc@jAa@xAi@ZQ`@WPMRQRQLMPU@Af@w@JMFI~@eAfAeBj@w@PSNY\\o@DGh@o@LQt@y@\\c@DGBCrCuDNOZ[LMZSf@]l@]~@k@n@m@pAaAd@Wt@a@FCrA{@vBkAZOHAFAVCN?h@AvBSrAGB?f@GtFYbCOzAG`BKd@E`@GvB]HC~CYbBG^CB?rDCrDEpBChCCtEET?XBLBVJZLPDt@RdB\\^F\\FPFPH\\ZrA`A\\RHDTL`@Xr@v@\\\\@DDLJ`@ZxANl@FV\\fBHn@BX@DBPFLb@n@@@TZh@f@DDLJzB|ANHLF\\JHB^Dh@JF@N?b@Dz@Dn@BlCDvFJjADbABR?R?n@Af@CZCf@ETC`@G@AdAUd@InEg@x@KLCnCg@REHAd@KZGdAMfAGj@If@AP@L@^@\\Bn@H^DbABv@B|@HH?r@Bj@@jBNX@lBDb@BhAAt@ALA^AhBUZIXOd@[DEDChAe@nCyAHCHGRI^Sb@UxCiABAXSDCd@[zA}@h@[FEf@]`@c@\\]FG`@e@DEzAwA^c@VU\\c@pAmBpCyH`EoIfCaEJMb@i@NORSfAy@LMV[xCcDtEcFlAoA^]lEyDnCyCh@c@HIZYf@c@t@w@n@s@DCXUj@m@|@s@^UHEHEpDwCn@c@TQHEBAh@c@nAy@~AoA^Wh@]nBy@XKLG@?JCNAhAGBAr@MLCLA`AGl@Aj@@T?n@AdAIvCUr@GF?t@IhBMb@El@Q^I~Bk@pBy@fAWXI`Aa@TKJCLEfASVIjAe@v@Yr@[hBu@~DcB\\Kv@QTI@?LGnBy@bAg@VK^Sz@a@^Qd@Sf@YJGn@YrAu@|@a@RKl@_@NKVMVK^SJEVKJCLCLAb@AF?v@G\\?tBBL@j@Hf@HTHHB\\H\\Np@PT@RAz@Kt@YzAe@TMLI@CJCfA]nAq@BCHCh@Q\\Sb@YXYHG\\Sf@i@@Ah@]LIjAqANUDIRe@`@eAHY^kAf@sADKDKZm@j@yA@Eh@y@Xm@Xa@DKLUh@y@f@w@HKRa@FKr@cAn@s@X[TUJIb@YHKrB{BJIDEb@]rAgAh@m@rAeAHI`@Y\\Uv@g@j@c@`@[b@Y^Yp@c@TQLGHCBAd@KJEb@QLGXINAh@EJADAv@SJAt@GVGv@GjDSL?x@@h@@^@f@FN@N@rABtAFrABp@@P@H?^GLAl@Az@IV?fA@~AClA@F?h@?`AA`AI^CtAQrAKLAn@GLCt@STGp@Q^Qp@W^QLEz@ULExAk@VK~@a@rAk@dAg@^SHGt@m@h@m@d@aAp@y@r@iBf@uAd@eBZiB`@cC^iAfIkMf@u@vEgH|BkDr@w@ZSVI|Cq@`C_@fDa@~B_@z@I^MRKHGFGp@cArA_D`CaGpAuCdCwF^{@dA{C\\oA\\yCpAeLp@uGj@wFLoAlAaMRyBf@gFx@sFb@eBb@}A\\u@p@s@dA{@fAm@LGv@QNCvAKt@EdES~BKhGa@fIg@VCd@Ar@C~@AnDQpDQnFWlAErCU|Fc@^CxFg@d@M`CaAhHwCbCaAnOkG|EeC~BkA~BmA\\Q~@m@zFwDxEcEn@k@zC_C\\WjCqBz@k@f@S~@Kj@Ef@CvABbDHrCJpCEB?'
    }
  ];

  const encodedPolyline = googleMapsEncodedPolyline[0].coords;
  const decodedPolyline: number[][] = polyline.decode(encodedPolyline);

  decodedPolyline.forEach((coordinate, index) => {
    const [latitude, longitude] = coordinate;
    console.log(`Coordinate ${index + 1}: Latitude = ${latitude}, Longitude = ${longitude}`);
  });
}

(async () => {
  await main();
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment