@itwin/core-frontend 4.4.0-dev.28 → 4.4.0-dev.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/request/utils.d.ts +18 -0
- package/lib/cjs/request/utils.d.ts.map +1 -0
- package/lib/cjs/request/utils.js +45 -0
- package/lib/cjs/request/utils.js.map +1 -0
- package/lib/cjs/tile/map/ArcGisUtilities.d.ts.map +1 -1
- package/lib/cjs/tile/map/ArcGisUtilities.js +5 -0
- package/lib/cjs/tile/map/ArcGisUtilities.js.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -1
- package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js +61 -39
- package/lib/cjs/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts +6 -0
- package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
- package/lib/cjs/tile/map/MapLayerImageryProvider.js +47 -7
- package/lib/cjs/tile/map/MapLayerImageryProvider.js.map +1 -1
- package/lib/cjs/tile/map/WmsCapabilities.d.ts.map +1 -1
- package/lib/cjs/tile/map/WmsCapabilities.js +1 -15
- package/lib/cjs/tile/map/WmsCapabilities.js.map +1 -1
- package/lib/cjs/tile/map/WmsUtilities.d.ts +7 -0
- package/lib/cjs/tile/map/WmsUtilities.d.ts.map +1 -1
- package/lib/cjs/tile/map/WmsUtilities.js +22 -0
- package/lib/cjs/tile/map/WmsUtilities.js.map +1 -1
- package/lib/cjs/tile/map/WmtsCapabilities.d.ts.map +1 -1
- package/lib/cjs/tile/map/WmtsCapabilities.js +2 -16
- package/lib/cjs/tile/map/WmtsCapabilities.js.map +1 -1
- package/lib/esm/request/utils.d.ts +18 -0
- package/lib/esm/request/utils.d.ts.map +1 -0
- package/lib/esm/request/utils.js +40 -0
- package/lib/esm/request/utils.js.map +1 -0
- package/lib/esm/tile/map/ArcGisUtilities.d.ts.map +1 -1
- package/lib/esm/tile/map/ArcGisUtilities.js +5 -0
- package/lib/esm/tile/map/ArcGisUtilities.js.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -1
- package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js +61 -39
- package/lib/esm/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/MapLayerImageryProvider.d.ts +6 -0
- package/lib/esm/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
- package/lib/esm/tile/map/MapLayerImageryProvider.js +48 -8
- package/lib/esm/tile/map/MapLayerImageryProvider.js.map +1 -1
- package/lib/esm/tile/map/WmsCapabilities.d.ts.map +1 -1
- package/lib/esm/tile/map/WmsCapabilities.js +1 -15
- package/lib/esm/tile/map/WmsCapabilities.js.map +1 -1
- package/lib/esm/tile/map/WmsUtilities.d.ts +7 -0
- package/lib/esm/tile/map/WmsUtilities.d.ts.map +1 -1
- package/lib/esm/tile/map/WmsUtilities.js +22 -0
- package/lib/esm/tile/map/WmsUtilities.js.map +1 -1
- package/lib/esm/tile/map/WmtsCapabilities.d.ts.map +1 -1
- package/lib/esm/tile/map/WmtsCapabilities.js +2 -16
- package/lib/esm/tile/map/WmtsCapabilities.js.map +1 -1
- package/package.json +18 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WmtsCapabilities.js","sourceRoot":"","sources":["../../../../src/tile/map/WmtsCapabilities.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,wDAAwD;AACxD,mDAAyF;AACzF,0CAA8D,CAAC,qCAAqC;AAEpG,IAAK,YA0BJ;AA1BD,WAAK,YAAY;IACf,gDAAgC,CAAA;IAChC,kEAAkD,CAAA;IAClD,0DAA0C,CAAA;IAC1C,sDAAsC,CAAA;IACtC,oDAAoC,CAAA;IACpC,sCAAsB,CAAA;IACtB,wCAAwB,CAAA;IACxB,sCAAsB,CAAA;IACtB,wCAAwB,CAAA;IACxB,oDAAoC,CAAA;IACpC,gDAAgC,CAAA;IAChC,8CAA8B,CAAA;IAC9B,sDAAsC,CAAA;IACtC,kDAAkC,CAAA;IAClC,oEAAoD,CAAA;IACpD,wCAAwB,CAAA;IACxB,0EAA0D,CAAA;IAC1D,sDAAsC,CAAA;IACtC,oEAAoD,CAAA;IACpD,wDAAwC,CAAA;IACxC,0CAA0B,CAAA;IAC1B,sDAAsC,CAAA;IACtC,0CAA0B,CAAA;IAC1B,gEAAgD,CAAA;AAElD,CAAC,EA1BI,YAAY,KAAZ,YAAY,QA0BhB;AAED,IAAK,YAoBJ;AApBD,WAAK,YAAY;IACf,mBAAmB;IACnB,mDAAmC,CAAA;IACnC,mCAAmB,CAAA;IACnB,iDAAiC,CAAA;IAEjC,kDAAkC,CAAA;IAClC,oDAAoC,CAAA;IACpC,4DAA4C,CAAA;IAE5C,gDAAgC,CAAA;IAChC,gDAAgC,CAAA;IAChC,8DAA8C,CAAA;IAC9C,8CAA8B,CAAA;IAC9B,sDAAsC,CAAA;IACtC,8DAA8C,CAAA;IAE9C,mDAAmC,CAAA;IACnC,6CAA6B,CAAA;IAC7B,yCAAyB,CAAA;AAC3B,CAAC,EApBI,YAAY,KAAZ,YAAY,QAoBhB;AAED;EACE;AACF,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,mHAAiD,CAAA;IACjD,6EAA4D,CAAA;AAC9D,CAAC,EAHW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAGxB;AAED;;;;GAIG;AACH,KAAK,UAAU,MAAM,CAAC,GAAW,EAAE,WAAqC;IACtE,MAAM,OAAO,GAAmB;QAC9B,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,CAAC;QACb,IAAI,EAAE,WAAW;KAClB,CAAC;IACF,OAAO,IAAA,iBAAO,EAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,qBAAqB,GAAG,CAAC,IAAa,EAAE,aAAqB,EAAE,WAAoB,EAAE,EAAE;IAE3F,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;QACtB,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,WAAW,CAAC;KAC9C;;QACC,OAAO,WAAW,CAAC;AAEvB,CAAC,CAAC;AAEF;;GAEG;AACH,IAAiB,cAAc,CA0Z9B;AA1ZD,WAAiB,cAAc;IAC7B,MAAa,qBAAqB;QAShC,YAAY,IAAa;YACvB,IAAI,CAAC,QAAQ,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC;YAC1E,IAAI,CAAC,WAAW,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC;YAChF,IAAI,CAAC,kBAAkB,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,yBAAyB,CAAC,CAAC;YAC9F,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;YAEpE,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;YACzE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvB,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;gBAC9E,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACnB,KAAK,MAAM,WAAW,IAAI,OAAO,EAAE;oBACjC,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC;oBAC5C,IAAI,WAAW;wBACb,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;iBACnC;aACF;YAED,IAAI,CAAC,iBAAiB,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,wBAAwB,CAAC,CAAC;YAE5F,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;QACpE,CAAC;KACF;IA9BY,oCAAqB,wBA8BjC,CAAA;IAED,MAAa,iBAAiB;QAE5B,IAAW,eAAe,KAA4B,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAGrF,IAAW,cAAc,KAA4B,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QAGnF,IAAW,OAAO,KAA4B,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE7D,aAAa,CAAC,EAAW;YAC/B,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACpD,IAAI,CAAC,QAAQ;gBACX,OAAO;YAET,IAAI,QAAQ,CAAC,WAAW,KAAK,YAAY,CAAC,eAAe,EAAE;gBACzD,IAAI,CAAC,gBAAgB,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;aAC3C;iBAAM,IAAI,QAAQ,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO,EAAE;gBACxD,IAAI,CAAC,QAAQ,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;aACnC;iBAAM,IAAI,QAAQ,CAAC,WAAW,KAAK,YAAY,CAAC,cAAc,EAAE;gBAC/D,IAAI,CAAC,eAAe,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;aAC1C;QACH,CAAC;QAED,YAAY,IAAa;YACvB,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;YAC3E,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;gBACxB,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE;oBAC1B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;iBACxB;aACF;QACH,CAAC;KACF;IAhCY,gCAAiB,oBAgC7B,CAAA;IAED,MAAa,OAAO;QASlB,YAAY,IAAa;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACvD,IAAI,GAAG;gBACL,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC;YAEvB,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;YAC7E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzB,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC/D,IAAI,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,YAAY,CAAC,sBAAsB,CAAC,EAAE;oBACtE,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC;oBAC5F,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;wBAC5B,IAAI,CAAC,QAAQ,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;qBACpF;iBACF;aACF;QACH,CAAC;KACF;IAzBY,sBAAO,UAyBnB,CAAA;IAED,MAAa,SAAS;QAGpB,IAAW,UAAU,KAA4B,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAE3E,IAAW,WAAW,KAA4B,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAE7E,YAAY,IAAa;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,IAAI;gBACN,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YAEnB,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAC/D,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAC1B,OAAO;YAET,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YACtE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAClC,OAAO;YAET,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACrE,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;gBAClB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;gBAEtB,KAAK,MAAM,OAAO,IAAI,GAAG,EAAE;oBACzB,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;iBAC9C;aACF;YAED,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YACvE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;gBAEvB,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE;oBAC3B,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;iBAChD;aACF;QACH,CAAC;KACF;IAtCY,wBAAS,YAsCrB,CAAA;IAED,MAAa,QAAQ;QAInB,YAAY,IAAa;YAHT,WAAM,GAAY,EAAE,CAAC;YACrB,mBAAc,GAAoB,EAAE,CAAC;YAGnD,SAAS;YACT,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,KAAK,EAAE;gBACT,KAAK,MAAM,SAAS,IAAI,KAAK;oBAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;aAC1C;YAED,gBAAgB;YAChB,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,CAAC;YAC9D,IAAI,GAAG,EAAE;gBACP,KAAK,MAAM,OAAO,IAAI,GAAG;oBACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;aACxD;QAEH,CAAC;QAEM,oCAAoC;YACzC,MAAM,aAAa,GAAoB,EAAE,CAAC;YAC1C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBAClC,IAAI,GAAG,CAAC,iBAAiB,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,mCAAmC,CAAC;oBAClG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAE1B,mFAAmF;gBACnF,kGAAkG;qBAC7F,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;uBAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,gBAAgB,GAAG,aAAa,CAAC,6BAA6B,CAAC,GAAG,CAAC;uBAC9F,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAE7E,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YACH,OAAO,aAAa,CAAC;QACvB,CAAC;QAEM,kCAAkC;YACvC,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAChF,CAAC;KACF;IAzCY,uBAAQ,WAyCpB,CAAA;IAED,MAAa,KAAK;QAIhB,kBAAkB;QAElB,YAAY,IAAa;YALT,cAAS,GAAY,KAAK,CAAC;YAMzC,IAAI,CAAC,IAAI;gBACP,OAAO;YAET,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YACjD,IAAI,SAAS;gBACX,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;YAEtD,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;YACpE,IAAI,CAAC,UAAU,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAChF,CAAC;KACF;IAjBY,oBAAK,QAiBjB,CAAA;IAED,MAAa,WAAW;QAItB,YAAY,IAAa;YACvB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC;YAEjD,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC;YACjF,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC;YACjF,IAAI,WAAW,IAAI,WAAW,EAAE;gBAC9B,MAAM,gBAAgB,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxE,MAAM,gBAAgB,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxE,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;oBACxG,IAAI,CAAC,KAAK,GAAG,uBAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;aACvH;QACH,CAAC;KACF;IAhBY,0BAAW,cAgBvB,CAAA;IAED,MAAa,mBAAmB;QAI9B,YAAY,IAAa;YAEvB,IAAI,CAAC,UAAU,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAE5D,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAE7D,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU;gBAChG,IAAI,CAAC,MAAM,GAAG,uBAAO,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACrH,CAAC;KACF;IAhBY,kCAAmB,sBAgB/B,CAAA;IAED,MAAa,iBAAiB;QAI5B,YAAY,IAAa;YAFT,wBAAmB,GAAG,IAAI,KAAK,EAAuB,CAAC;YAIrE,IAAI,CAAC,aAAa,GAAG,qBAAqB,CAAC,IAAI,EAAE,eAAe,EAAE,EAAE,CAAE,CAAC;YAEvE,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,CAAC;YAC9E,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,CAAC;gBAC7F,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE;oBACnC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;iBAC9D;aACF;QACH,CAAC;KACF;IAhBY,gCAAiB,oBAgB7B,CAAA;IAED,MAAa,aAAa;QAQxB,YAAY,IAAa;YAFT,eAAU,GAAiB,EAAE,CAAC;YAG5C,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,iBAAiB,CAAC,CAAC;YAC/E,IAAI,UAAU;gBACZ,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;;gBAE7B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAE1C,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;YACpE,IAAI,CAAC,QAAQ,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC;YAE1E,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;YACnF,IAAI,YAAY;gBACd,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;;gBAEjC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAE7C,IAAI,CAAC,iBAAiB,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,wBAAwB,EAAE,EAAE,CAAE,CAAC;YAEjG,cAAc;YACd,wGAAwG;YACxG,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;YAC7E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAE7D,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE;gBAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;aAC1C;QACH,CAAC;KACF;IApCY,4BAAa,gBAoCzB,CAAA;IAED,MAAa,UAAU;QAWrB,YAAY,IAAa;YACvB,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;YACnF,IAAI,UAAU;gBACZ,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;;gBAE7B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAE1C,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;YACpE,IAAI,CAAC,QAAQ,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,eAAe,CAAC,CAAC;YAE1E,oBAAoB;YACpB,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;YACzF,IAAI,CAAC,UAAU;gBACb,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC/D,IAAI,CAAC,gBAAgB,GAAG,CAAC,UAAU,CAAC;YAEpC,kBAAkB;YAClB,MAAM,aAAa,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,oBAAoB,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5H,IAAI,aAAa,EAAE,MAAM,KAAK,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC3D,IAAI,CAAC,aAAa,GAAG,uBAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAExE,aAAa;YACb,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,gBAAgB,CAAC,CAAC;YAC7E,IAAI,CAAC,SAAS;gBACZ,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACxD,IAAI,CAAC,SAAS,GAAG,CAAC,SAAS,CAAC;YAE5B,cAAc;YACd,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,iBAAiB,CAAC,CAAC;YAC/E,IAAI,CAAC,UAAU;gBACb,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACzD,IAAI,CAAC,UAAU,GAAG,CAAC,UAAU,CAAC;YAE9B,eAAe;YACf,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC;YACjF,IAAI,CAAC,WAAW;gBACd,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACxD,IAAI,CAAC,WAAW,GAAG,CAAC,WAAW,CAAC;YAEhC,gBAAgB;YAChB,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;YACnF,IAAI,CAAC,YAAY;gBACf,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACzD,IAAI,CAAC,YAAY,GAAG,CAAC,YAAY,CAAC;QACpC,CAAC;KACF;IAzDY,yBAAU,aAyDtB,CAAA;IAED,MAAa,KAAK;QAUhB,YAAY,IAAa;YAHT,WAAM,GAAY,EAAE,CAAC;YACrB,uBAAkB,GAAwB,EAAE,CAAC;YAI3D,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;YACnF,IAAI,UAAU;gBACZ,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;;gBAE7B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAE1C,IAAI,CAAC,KAAK,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;YACpE,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAEpD,cAAc;YACd,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;YAC/E,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;gBACxB,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAErD,IAAI,gBAAsC,EAAE,gBAAsC,CAAC;YACnF,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,uBAAuB,CAAC,CAAC;YAC7E,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnB,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtH,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;aACvH;YAED,IAAI,gBAAgB,EAAE,MAAM,KAAK,CAAC,IAAI,gBAAgB,EAAE,MAAM,KAAK,CAAC;gBAClE,IAAI,CAAC,gBAAgB,GAAG,4BAAiB,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;YAE5I,8FAA8F;YAC9F,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE;gBACzH,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;gBACrC,IAAI,KAAK;oBACP,IAAI,CAAC,gBAAgB,GAAG,4BAAiB,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;oBAE5G,IAAI,CAAC,gBAAgB,GAAG,4BAAiB,CAAC,aAAa,EAAE,CAAC;aAC7D;YAED,QAAQ;YACR,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBACpB,KAAK,MAAM,SAAS,IAAI,KAAK;oBAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;aAC1C;YAED,oBAAoB;YACpB,uGAAuG;YACvG,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC;YAE3F,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAE7D,KAAK,MAAM,IAAI,IAAI,iBAAiB;gBAClC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,CAAC;KACF;IA9DY,oBAAK,QA8DjB,CAAA;AACH,CAAC,EA1ZgB,cAAc,GAAd,sBAAc,KAAd,sBAAc,QA0Z9B;AACD,gBAAgB;AAChB,MAAa,gBAAgB;IAS3B,YAAY,MAAgB;QAE1B,MAAM,YAAY,GAAG,MAAM,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;QACjE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7B,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;YAE/D,yBAAyB;YACzB,MAAM,qBAAqB,GAAG,UAAU,CAAC,oBAAoB,CAAC,YAAY,CAAC,4BAA4B,CAAC,CAAC;YACzG,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC;gBAClC,IAAI,CAAC,qBAAqB,GAAG,IAAI,cAAc,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;YAElG,sBAAsB;YACtB,MAAM,kBAAkB,GAAG,UAAU,CAAC,oBAAoB,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;YACnG,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC;gBAC/B,IAAI,CAAC,kBAAkB,GAAG,IAAI,cAAc,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;YAExF,WAAW;YACX,MAAM,OAAO,GAAG,UAAU,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;YAC5D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;gBACpB,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3D;IACH,CAAC;IAEM,MAAM,CAAC,aAAa,CAAC,eAAuB;QACjD,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACnE,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,WAAqC,EAAE,WAAqB,EAAE,WAAqC;QACzI,IAAI,CAAC,WAAW,EAAE;YAChB,MAAM,MAAM,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5D,IAAI,MAAM,KAAK,SAAS;gBACtB,OAAO,MAAM,CAAC;SACjB;QAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,uBAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QACzD,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,WAAW,EAAE;YACf,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC5C,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;oBACpC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChE,CAAC,CAAC,CAAC;SACJ;QAED,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,CAAC;QACrE,IAAI,CAAC,eAAe;YAClB,OAAO,SAAS,CAAC;QAEnB,MAAM,YAAY,GAAG,gBAAgB,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QACrE,IAAI,YAAY;YACd,gBAAgB,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAE7D,OAAO,YAAY,CAAC;IACtB,CAAC;;AAhEc,mCAAkB,GAAG,IAAI,GAAG,EAAwC,CAAC;AADzE,4CAAgB","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Views\r\n */\r\n\r\nimport { Point2d, Range2d } from \"@itwin/core-geometry\";\r\nimport { request, RequestBasicCredentials, RequestOptions } from \"../../request/Request\";\r\nimport { MapCartoRectangle, WmsUtilities } from \"../internal\"; // WmsUtilities needed for getBaseUrl\r\n\r\nenum OwsConstants {\r\n ABSTRACT_XMLTAG = \"ows:Abstract\",\r\n ACCESSCONSTRAINTS_XMLTAG = \"ows:AccessConstraints\",\r\n ALLOWEDVALUES_XMLTAG = \"ows:AllowedValues\",\r\n BOUNDINGBOX_XMLTAG = \"ows:BoundingBox\",\r\n CONSTRAINT_XMLTAG = \"ows:Constraint\",\r\n DCP_XMLTAG = \"ows:DCP\",\r\n FEES_XMLTAG = \"ows:Fees\",\r\n GET_XMLTAG = \"ows:Get\",\r\n HTTP_XMLTAG = \"ows:HTTP\",\r\n IDENTIFIER_XMLTAG = \"ows:Identifier\",\r\n KEYWORDS_XMLTAG = \"ows:Keywords\",\r\n KEYWORD_XMLTAG = \"ows:Keyword\",\r\n LOWERCORNER_XMLTAG = \"ows:LowerCorner\",\r\n OPERATION_XMLTAG = \"ows:Operation\",\r\n OPERATIONSMETADATA_XMLTAG = \"ows:OperationsMetadata\",\r\n POST_XMLTAG = \"ows:Post\",\r\n SERVICEIDENTIFICATION_XMLTAG = \"ows:ServiceIdentification\",\r\n SERVICETYPE_XMLTAG = \"ows:ServiceType\",\r\n SERVICETYPEVERSION_XMLTAG = \"ows:ServiceTypeVersion\",\r\n SUPPORTEDCRS_XMLTAG = \"ows:SupportedCRS\",\r\n TITLE_XMLTAG = \"ows:Title\",\r\n UPPERCORNER_XMLTAG = \"ows:UpperCorner\",\r\n VALUE_XMLTAG = \"ows:Value\",\r\n WGS84BOUNDINGBOX_XMLTAG = \"ows:WGS84BoundingBox\"\r\n\r\n}\r\n\r\nenum XmlConstants {\r\n // Operations names\r\n GETCAPABILITIES = \"GetCapabilities\",\r\n GETTILE = \"GetTile\",\r\n GETFEATUREINFO = \"GetFeatureInfo\",\r\n\r\n MATRIXWIDTH_XMLTAG = \"MatrixWidth\",\r\n MATRIXHEIGHT_XMLTAG = \"MatrixHeight\",\r\n SCALEDENOMINATOR_XMLTAG = \"ScaleDenominator\",\r\n\r\n TILEHEIGHT_XMLTAG = \"TileHeight\",\r\n TILEMATRIX_XMLTAG = \"TileMatrix\",\r\n TILEMATRIXSETLINK_XMLTAG = \"TileMatrixSetLink\",\r\n TILEWIDTH_XMLTAG = \"TileWidth\",\r\n TOPLEFTCORNER_XMLTAG = \"TopLeftCorner\",\r\n WELLKNOWNSCALESET_XMLTAG = \"WellKnownScaleSet\",\r\n\r\n CONSTRAINT_NAME_FILTER = \"Encoding\",\r\n STYLE_ISDEFAULT = \"IsDefault\",\r\n XLINK_HREF = \"xlink:href\",\r\n}\r\n\r\n/** @internal\r\n*/\r\nexport enum WmtsConstants {\r\n GOOGLEMAPS_LEVEL0_SCALE_DENOM = 559082264.0287178,\r\n GOOGLEMAPS_COMPATIBLE_WELLKNOWNNAME = \"googlemapscompatible\",\r\n}\r\n\r\n/**\r\n * fetch XML from HTTP request\r\n * @param url server URL to address the request\r\n * @internal\r\n */\r\nasync function getXml(url: string, credentials?: RequestBasicCredentials): Promise<string> {\r\n const options: RequestOptions = {\r\n timeout: 20000,\r\n retryCount: 2,\r\n auth: credentials,\r\n };\r\n return request(url, \"text\", options);\r\n}\r\n\r\n/**\r\n * Utility function to extract an element' text content\r\n * @return An element's text content, default to provided defaultTest value if no text is available.\r\n * @param url server URL to address the request\r\n * @internal\r\n */\r\nconst getElementTextContent = (elem: Element, qualifiedName: string, defaultText?: string) => {\r\n\r\n const tmpElem = elem.getElementsByTagName(qualifiedName);\r\n if (tmpElem.length > 0) {\r\n return tmpElem[0].textContent ?? defaultText;\r\n } else\r\n return defaultText;\r\n\r\n};\r\n\r\n/** Encapsulation of the capabilities for an WMTS server\r\n * @internal\r\n */\r\nexport namespace WmtsCapability {\r\n export class ServiceIdentification {\r\n public readonly abstract?: string;\r\n public readonly accessConstraints?: string;\r\n public readonly fees?: string;\r\n public readonly serviceType?: string;\r\n public readonly serviceTypeVersion?: string;\r\n public readonly title?: string;\r\n public readonly keywords?: string[];\r\n\r\n constructor(elem: Element) {\r\n this.abstract = getElementTextContent(elem, OwsConstants.ABSTRACT_XMLTAG);\r\n this.serviceType = getElementTextContent(elem, OwsConstants.SERVICETYPE_XMLTAG);\r\n this.serviceTypeVersion = getElementTextContent(elem, OwsConstants.SERVICETYPEVERSION_XMLTAG);\r\n this.title = getElementTextContent(elem, OwsConstants.TITLE_XMLTAG);\r\n\r\n const keywords = elem.getElementsByTagName(OwsConstants.KEYWORDS_XMLTAG);\r\n if (keywords.length > 0) {\r\n const keyword = keywords[0].getElementsByTagName(OwsConstants.KEYWORD_XMLTAG);\r\n this.keywords = [];\r\n for (const keyworkElem of keyword) {\r\n const keyWordText = keyworkElem.textContent;\r\n if (keyWordText)\r\n this.keywords.push(keyWordText);\r\n }\r\n }\r\n\r\n this.accessConstraints = getElementTextContent(elem, OwsConstants.ACCESSCONSTRAINTS_XMLTAG);\r\n\r\n this.fees = getElementTextContent(elem, OwsConstants.FEES_XMLTAG);\r\n }\r\n }\r\n\r\n export class OperationMetadata {\r\n private _getCapabilities?: Operation;\r\n public get getCapabilities(): Operation | undefined { return this._getCapabilities; }\r\n\r\n private _getFeatureInfo?: Operation;\r\n public get getFeatureInfo(): Operation | undefined { return this._getFeatureInfo; }\r\n\r\n private _getTile?: Operation;\r\n public get getTile(): Operation | undefined { return this._getTile; }\r\n\r\n private readOperation(op: Element) {\r\n const nameAttr = op.attributes.getNamedItem(\"name\");\r\n if (!nameAttr)\r\n return;\r\n\r\n if (nameAttr.textContent === XmlConstants.GETCAPABILITIES) {\r\n this._getCapabilities = new Operation(op);\r\n } else if (nameAttr.textContent === XmlConstants.GETTILE) {\r\n this._getTile = new Operation(op);\r\n } else if (nameAttr.textContent === XmlConstants.GETFEATUREINFO) {\r\n this._getFeatureInfo = new Operation(op);\r\n }\r\n }\r\n\r\n constructor(elem: Element) {\r\n const operation = elem.getElementsByTagName(OwsConstants.OPERATION_XMLTAG);\r\n if (operation.length > 0) {\r\n for (const op of operation) {\r\n this.readOperation(op);\r\n }\r\n }\r\n }\r\n }\r\n\r\n export class HttpDcp {\r\n public readonly url?: string;\r\n public readonly constraintName?: string;\r\n\r\n // For simplicity of use we create a 'static' encoding property instead of having\r\n // a generic constraint data model.\r\n // We make sure the constraint name is 'encoding' related.\r\n public readonly encoding?: string;\r\n\r\n constructor(elem: Element) {\r\n const url = elem.getAttribute(XmlConstants.XLINK_HREF);\r\n if (url)\r\n this.url = url ?? \"\";\r\n\r\n const constraint = elem.getElementsByTagName(OwsConstants.CONSTRAINT_XMLTAG);\r\n if (constraint.length > 0) {\r\n this.constraintName = constraint[0].getAttribute(\"name\") ?? \"\";\r\n if (this.constraintName?.endsWith(XmlConstants.CONSTRAINT_NAME_FILTER)) {\r\n const allowedValues = constraint[0].getElementsByTagName(OwsConstants.ALLOWEDVALUES_XMLTAG);\r\n if (allowedValues.length > 0) {\r\n this.encoding = getElementTextContent(allowedValues[0], OwsConstants.VALUE_XMLTAG);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n export class Operation {\r\n public readonly name?: string;\r\n private _getDcpHttp?: HttpDcp[];\r\n public get getDcpHttp(): HttpDcp[] | undefined { return this._getDcpHttp; }\r\n private _postDcpHttp?: HttpDcp[];\r\n public get postDcpHttp(): HttpDcp[] | undefined { return this._postDcpHttp; }\r\n\r\n constructor(elem: Element) {\r\n const name = elem.getAttribute(\"name\");\r\n if (name)\r\n this.name = name;\r\n\r\n const dcp = elem.getElementsByTagName(OwsConstants.DCP_XMLTAG);\r\n if (!dcp || dcp.length === 0)\r\n return;\r\n\r\n const dcpHttp = dcp[0].getElementsByTagName(OwsConstants.HTTP_XMLTAG);\r\n if (!dcpHttp || dcpHttp.length === 0)\r\n return;\r\n\r\n const get = dcpHttp[0].getElementsByTagName(OwsConstants.GET_XMLTAG);\r\n if (get.length > 0) {\r\n this._getDcpHttp = [];\r\n\r\n for (const getItem of get) {\r\n this._getDcpHttp?.push(new HttpDcp(getItem));\r\n }\r\n }\r\n\r\n const post = dcpHttp[0].getElementsByTagName(OwsConstants.POST_XMLTAG);\r\n if (post.length > 0) {\r\n this._postDcpHttp = [];\r\n\r\n for (const postItem of post) {\r\n this._postDcpHttp?.push(new HttpDcp(postItem));\r\n }\r\n }\r\n }\r\n }\r\n\r\n export class Contents {\r\n public readonly layers: Layer[] = [];\r\n public readonly tileMatrixSets: TileMatrixSet[] = [];\r\n\r\n constructor(elem: Element) {\r\n // Layers\r\n const layer = elem.getElementsByTagName(\"Layer\");\r\n if (layer) {\r\n for (const layerElem of layer)\r\n this.layers.push(new Layer(layerElem));\r\n }\r\n\r\n // TileMatrixSet\r\n const tms = elem.querySelectorAll(\"Contents > TileMatrixSet\");\r\n if (tms) {\r\n for (const tmsElem of tms)\r\n this.tileMatrixSets.push(new TileMatrixSet(tmsElem));\r\n }\r\n\r\n }\r\n\r\n public getGoogleMapsCompatibleTileMatrixSet(): TileMatrixSet[] {\r\n const googleMapsTms: TileMatrixSet[] = [];\r\n this.tileMatrixSets.forEach((tms) => {\r\n if (tms.wellKnownScaleSet?.toLowerCase().includes(WmtsConstants.GOOGLEMAPS_COMPATIBLE_WELLKNOWNNAME))\r\n googleMapsTms.push(tms);\r\n\r\n // In case wellKnownScaleSet was not been set properly, infer from scaleDenominator\r\n // Note: some servers are quite inaccurate in their scale values, hence I used a delta value of 1.\r\n else if (tms.tileMatrix.length > 0\r\n && Math.abs(tms.tileMatrix[0].scaleDenominator - WmtsConstants.GOOGLEMAPS_LEVEL0_SCALE_DENOM) < 1\r\n && (tms.supportedCrs.includes(\"3857\") || tms.supportedCrs.includes(\"900913\"))\r\n )\r\n googleMapsTms.push(tms);\r\n });\r\n return googleMapsTms;\r\n }\r\n\r\n public getEpsg4326CompatibleTileMatrixSet(): TileMatrixSet[] {\r\n return this.tileMatrixSets.filter((tms) => tms.supportedCrs.includes(\"4326\"));\r\n }\r\n }\r\n\r\n export class Style {\r\n public readonly isDefault: boolean = false;\r\n public readonly title?: string;\r\n public readonly identifier?: string;\r\n // TODO: LegendURL\r\n\r\n constructor(elem: Element) {\r\n if (!elem)\r\n return;\r\n\r\n const isDefault = elem.getAttribute(\"isDefault\");\r\n if (isDefault)\r\n this.isDefault = isDefault.toLowerCase() === \"true\";\r\n\r\n this.title = getElementTextContent(elem, OwsConstants.TITLE_XMLTAG);\r\n this.identifier = getElementTextContent(elem, OwsConstants.IDENTIFIER_XMLTAG);\r\n }\r\n }\r\n\r\n export class BoundingBox {\r\n public readonly crs?: string;\r\n public readonly range?: Range2d;\r\n\r\n constructor(elem: Element) {\r\n this.crs = elem.getAttribute(\"crs\") ?? undefined;\r\n\r\n const lowerCorner = getElementTextContent(elem, OwsConstants.LOWERCORNER_XMLTAG);\r\n const upperCorner = getElementTextContent(elem, OwsConstants.UPPERCORNER_XMLTAG);\r\n if (lowerCorner && upperCorner) {\r\n const lowerCornerArray = lowerCorner?.split(\" \").map((x: string) => +x);\r\n const upperCornerArray = upperCorner?.split(\" \").map((x: string) => +x);\r\n if (lowerCornerArray && lowerCornerArray.length === 2 && upperCornerArray && upperCornerArray.length === 2)\r\n this.range = Range2d.createXYXY(lowerCornerArray[0], lowerCornerArray[1], upperCornerArray[0], upperCornerArray[1]);\r\n }\r\n }\r\n }\r\n\r\n export class TileMatrixSetLimits {\r\n public limits?: Range2d;\r\n public tileMatrix?: string;\r\n\r\n constructor(elem: Element) {\r\n\r\n this.tileMatrix = getElementTextContent(elem, \"TileMatrix\");\r\n\r\n const minTileRow = getElementTextContent(elem, \"MinTileRow\");\r\n const maxTileRow = getElementTextContent(elem, \"MaxTileRow\");\r\n const minTileCol = getElementTextContent(elem, \"MinTileCol\");\r\n const maxTileCol = getElementTextContent(elem, \"MaxTileCol\");\r\n\r\n if (minTileRow !== undefined && maxTileRow !== undefined && minTileCol !== undefined && maxTileCol)\r\n this.limits = Range2d.createXYXY(Number(minTileCol), Number(minTileRow), Number(maxTileCol), Number(maxTileRow));\r\n }\r\n }\r\n\r\n export class TileMatrixSetLink {\r\n public readonly tileMatrixSet: string;\r\n public readonly tileMatrixSetLimits = new Array<TileMatrixSetLimits>();\r\n\r\n constructor(elem: Element) {\r\n\r\n this.tileMatrixSet = getElementTextContent(elem, \"TileMatrixSet\", \"\")!;\r\n\r\n const tileMatrixLimitsRoot = elem.getElementsByTagName(\"TileMatrixSetLimits\");\r\n if (tileMatrixLimitsRoot.length > 0) {\r\n const tileMatrixLimits = tileMatrixLimitsRoot[0].getElementsByTagName(\"TileMatrixSetLimits\");\r\n for (const tmsl of tileMatrixLimits) {\r\n this.tileMatrixSetLimits.push(new TileMatrixSetLimits(tmsl));\r\n }\r\n }\r\n }\r\n }\r\n\r\n export class TileMatrixSet {\r\n public readonly identifier: string;\r\n public readonly title?: string;\r\n public readonly abstract?: string;\r\n public readonly supportedCrs: string;\r\n public readonly wellKnownScaleSet: string;\r\n public readonly tileMatrix: TileMatrix[] = [];\r\n\r\n constructor(elem: Element) {\r\n const identifier = getElementTextContent(elem, OwsConstants.IDENTIFIER_XMLTAG);\r\n if (identifier)\r\n this.identifier = identifier;\r\n else\r\n throw new Error(\"No Identifier found.\");\r\n\r\n this.title = getElementTextContent(elem, OwsConstants.TITLE_XMLTAG);\r\n this.abstract = getElementTextContent(elem, OwsConstants.ABSTRACT_XMLTAG);\r\n\r\n const supportedCrs = getElementTextContent(elem, OwsConstants.SUPPORTEDCRS_XMLTAG);\r\n if (supportedCrs)\r\n this.supportedCrs = supportedCrs;\r\n else\r\n throw new Error(\"No supported CRS found.\");\r\n\r\n this.wellKnownScaleSet = getElementTextContent(elem, XmlConstants.WELLKNOWNSCALESET_XMLTAG, \"\")!;\r\n\r\n // TileMatrix:\r\n // TileMatrix is mandatory on TileMatrixSet, if it doesn't exists, something is OFF with the capability.\r\n const tileMatrix = elem.getElementsByTagName(XmlConstants.TILEMATRIX_XMLTAG);\r\n if (tileMatrix.length === 0)\r\n throw new Error(\"No matrix set link found for WMTS layer\");\r\n\r\n for (const tm of tileMatrix) {\r\n this.tileMatrix.push(new TileMatrix(tm));\r\n }\r\n }\r\n }\r\n\r\n export class TileMatrix {\r\n public readonly identifier: string;\r\n public readonly title?: string;\r\n public readonly abstract?: string;\r\n public readonly scaleDenominator: number;\r\n public readonly topLeftCorner: Point2d;\r\n public readonly tileWidth: number;\r\n public readonly tileHeight: number;\r\n public readonly matrixWidth: number;\r\n public readonly matrixHeight: number;\r\n\r\n constructor(elem: Element) {\r\n const identifier = getElementTextContent(elem, OwsConstants.IDENTIFIER_XMLTAG, \"\");\r\n if (identifier)\r\n this.identifier = identifier;\r\n else\r\n throw new Error(\"No Identifier found.\");\r\n\r\n this.title = getElementTextContent(elem, OwsConstants.TITLE_XMLTAG);\r\n this.abstract = getElementTextContent(elem, OwsConstants.ABSTRACT_XMLTAG);\r\n\r\n // Scale denominator\r\n const scaleDenom = getElementTextContent(elem, XmlConstants.SCALEDENOMINATOR_XMLTAG, \"\");\r\n if (!scaleDenom)\r\n throw new Error(\"No scale denominator found on TileMatrix.\");\r\n this.scaleDenominator = +scaleDenom;\r\n\r\n // Top left corner\r\n const topLeftCorner = getElementTextContent(elem, XmlConstants.TOPLEFTCORNER_XMLTAG, \"\")?.split(\" \").map((x: string) => +x);\r\n if (topLeftCorner?.length !== 2)\r\n throw new Error(\"No TopLeftCorner found on TileMatrix.\");\r\n this.topLeftCorner = Point2d.create(topLeftCorner[0], topLeftCorner[1]);\r\n\r\n // Tile Width\r\n const tileWidth = getElementTextContent(elem, XmlConstants.TILEWIDTH_XMLTAG);\r\n if (!tileWidth)\r\n throw new Error(\"No tile width found on TileMatrix.\");\r\n this.tileWidth = +tileWidth;\r\n\r\n // Tile Height\r\n const tileHeight = getElementTextContent(elem, XmlConstants.TILEHEIGHT_XMLTAG);\r\n if (!tileHeight)\r\n throw new Error(\"No tile height found on TileMatrix.\");\r\n this.tileHeight = +tileHeight;\r\n\r\n // Matrix Width\r\n const matrixWidth = getElementTextContent(elem, XmlConstants.MATRIXWIDTH_XMLTAG);\r\n if (!matrixWidth)\r\n throw new Error(\"No tile width found on TileMatrix.\");\r\n this.matrixWidth = +matrixWidth;\r\n\r\n // Matrix Height\r\n const matrixHeight = getElementTextContent(elem, XmlConstants.MATRIXHEIGHT_XMLTAG);\r\n if (!matrixHeight)\r\n throw new Error(\"No tile height found on TileMatrix.\");\r\n this.matrixHeight = +matrixHeight;\r\n }\r\n }\r\n\r\n export class Layer {\r\n public readonly identifier: string;\r\n public readonly title?: string;\r\n public readonly abstract?: string;\r\n public readonly format?: string;\r\n public readonly wsg84BoundingBox?: MapCartoRectangle;\r\n public readonly boundingBox?: BoundingBox;\r\n public readonly styles: Style[] = [];\r\n public readonly tileMatrixSetLinks: TileMatrixSetLink[] = [];\r\n\r\n constructor(elem: Element) {\r\n\r\n const identifier = getElementTextContent(elem, OwsConstants.IDENTIFIER_XMLTAG, \"\");\r\n if (identifier)\r\n this.identifier = identifier;\r\n else\r\n throw new Error(\"No Identifier found.\");\r\n\r\n this.title = getElementTextContent(elem, OwsConstants.TITLE_XMLTAG);\r\n this.format = getElementTextContent(elem, \"Format\");\r\n\r\n // BoundingBox\r\n const boundingBox = elem.getElementsByTagName(OwsConstants.BOUNDINGBOX_XMLTAG);\r\n if (boundingBox.length > 0)\r\n this.boundingBox = new BoundingBox(boundingBox[0]);\r\n\r\n let lowerCornerArray: number[] | undefined, upperCornerArray: number[] | undefined;\r\n const bbox = elem.getElementsByTagName(OwsConstants.WGS84BOUNDINGBOX_XMLTAG);\r\n if (bbox.length > 0) {\r\n lowerCornerArray = getElementTextContent(bbox[0], OwsConstants.LOWERCORNER_XMLTAG)?.split(\" \").map((x: string) => +x);\r\n upperCornerArray = getElementTextContent(bbox[0], OwsConstants.UPPERCORNER_XMLTAG)?.split(\" \").map((x: string) => +x);\r\n }\r\n\r\n if (lowerCornerArray?.length === 2 && upperCornerArray?.length === 2)\r\n this.wsg84BoundingBox = MapCartoRectangle.fromDegrees(lowerCornerArray[0], lowerCornerArray[1], upperCornerArray[0], upperCornerArray[1]);\r\n\r\n // If we could not initialized WSG84 bounding box, attempt to initialized it from Bounding Box\r\n if (!this.wsg84BoundingBox && (this.boundingBox?.crs?.includes(\"EPSG:4326\") || this.boundingBox?.crs?.includes(\"CRS:84\"))) {\r\n const range = this.boundingBox.range;\r\n if (range)\r\n this.wsg84BoundingBox = MapCartoRectangle.fromDegrees(range.low.x, range.low.y, range.high.x, range.high.y);\r\n else\r\n this.wsg84BoundingBox = MapCartoRectangle.createMaximum();\r\n }\r\n\r\n // Style\r\n const style = elem.getElementsByTagName(\"Style\");\r\n if (style.length > 0) {\r\n for (const styleElem of style)\r\n this.styles.push(new Style(styleElem));\r\n }\r\n\r\n // TileMatrixSetLink\r\n // TileMatrixSetLink is mandatory on Layer, if it doesn't exists, something is OFF with the capability.\r\n const tileMatrixSetLink = elem.getElementsByTagName(XmlConstants.TILEMATRIXSETLINK_XMLTAG);\r\n\r\n if (tileMatrixSetLink.length === 0)\r\n throw new Error(\"No matrix set link found for WMTS layer\");\r\n\r\n for (const tmsl of tileMatrixSetLink)\r\n this.tileMatrixSetLinks.push(new TileMatrixSetLink(tmsl));\r\n }\r\n }\r\n}\r\n/** @internal */\r\nexport class WmtsCapabilities {\r\n private static _capabilitiesCache = new Map<string, WmtsCapabilities | undefined>();\r\n\r\n public readonly version?: string;\r\n public readonly serviceIdentification?: WmtsCapability.ServiceIdentification;\r\n public readonly contents?: WmtsCapability.Contents;\r\n\r\n public readonly operationsMetadata?: WmtsCapability.OperationMetadata;\r\n\r\n constructor(xmlDoc: Document) {\r\n\r\n const capabilities = xmlDoc.getElementsByTagName(\"Capabilities\");\r\n if (capabilities.length !== 0) {\r\n const capability = capabilities[0];\r\n this.version = capability.getAttribute(\"version\") ?? undefined;\r\n\r\n // Service Identification\r\n const serviceIdentification = capability.getElementsByTagName(OwsConstants.SERVICEIDENTIFICATION_XMLTAG);\r\n if (serviceIdentification.length > 0)\r\n this.serviceIdentification = new WmtsCapability.ServiceIdentification(serviceIdentification[0]);\r\n\r\n // Operations metadata\r\n const operationsMetadata = capability.getElementsByTagName(OwsConstants.OPERATIONSMETADATA_XMLTAG);\r\n if (operationsMetadata.length > 0)\r\n this.operationsMetadata = new WmtsCapability.OperationMetadata(operationsMetadata[0]);\r\n\r\n // Contents\r\n const content = capability.getElementsByTagName(\"Contents\");\r\n if (content.length > 0)\r\n this.contents = new WmtsCapability.Contents(content[0]);\r\n }\r\n }\r\n\r\n public static createFromXml(xmlCapabilities: string): WmtsCapabilities | undefined {\r\n const parser = new DOMParser();\r\n const xmlDoc = parser.parseFromString(xmlCapabilities, \"text/xml\");\r\n return new WmtsCapabilities(xmlDoc);\r\n }\r\n\r\n public static async create(url: string, credentials?: RequestBasicCredentials, ignoreCache?: boolean, queryParams?: {[key: string]: string}): Promise<WmtsCapabilities | undefined> {\r\n if (!ignoreCache) {\r\n const cached = WmtsCapabilities._capabilitiesCache.get(url);\r\n if (cached !== undefined)\r\n return cached;\r\n }\r\n\r\n const tmpUrl = new URL(WmsUtilities.getBaseUrl(url));\r\n tmpUrl.searchParams.append(\"request\", \"GetCapabilities\");\r\n tmpUrl.searchParams.append(\"service\", \"WMTS\");\r\n if (queryParams) {\r\n Object.keys(queryParams).forEach((paramKey) => {\r\n if (!tmpUrl.searchParams.has(paramKey))\r\n tmpUrl.searchParams.append(paramKey, queryParams[paramKey]);\r\n });\r\n }\r\n\r\n const xmlCapabilities = await getXml(tmpUrl.toString(), credentials);\r\n if (!xmlCapabilities)\r\n return undefined;\r\n\r\n const capabilities = WmtsCapabilities.createFromXml(xmlCapabilities);\r\n if (capabilities)\r\n WmtsCapabilities._capabilitiesCache.set(url, capabilities);\r\n\r\n return capabilities;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"WmtsCapabilities.js","sourceRoot":"","sources":["../../../../src/tile/map/WmtsCapabilities.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Views\r\n */\r\n\r\nimport { Point2d, Range2d } from \"@itwin/core-geometry\";\r\nimport { RequestBasicCredentials } from \"../../request/Request\";\r\nimport { MapCartoRectangle, WmsUtilities } from \"../internal\";\r\n\r\nenum OwsConstants {\r\n ABSTRACT_XMLTAG = \"ows:Abstract\",\r\n ACCESSCONSTRAINTS_XMLTAG = \"ows:AccessConstraints\",\r\n ALLOWEDVALUES_XMLTAG = \"ows:AllowedValues\",\r\n BOUNDINGBOX_XMLTAG = \"ows:BoundingBox\",\r\n CONSTRAINT_XMLTAG = \"ows:Constraint\",\r\n DCP_XMLTAG = \"ows:DCP\",\r\n FEES_XMLTAG = \"ows:Fees\",\r\n GET_XMLTAG = \"ows:Get\",\r\n HTTP_XMLTAG = \"ows:HTTP\",\r\n IDENTIFIER_XMLTAG = \"ows:Identifier\",\r\n KEYWORDS_XMLTAG = \"ows:Keywords\",\r\n KEYWORD_XMLTAG = \"ows:Keyword\",\r\n LOWERCORNER_XMLTAG = \"ows:LowerCorner\",\r\n OPERATION_XMLTAG = \"ows:Operation\",\r\n OPERATIONSMETADATA_XMLTAG = \"ows:OperationsMetadata\",\r\n POST_XMLTAG = \"ows:Post\",\r\n SERVICEIDENTIFICATION_XMLTAG = \"ows:ServiceIdentification\",\r\n SERVICETYPE_XMLTAG = \"ows:ServiceType\",\r\n SERVICETYPEVERSION_XMLTAG = \"ows:ServiceTypeVersion\",\r\n SUPPORTEDCRS_XMLTAG = \"ows:SupportedCRS\",\r\n TITLE_XMLTAG = \"ows:Title\",\r\n UPPERCORNER_XMLTAG = \"ows:UpperCorner\",\r\n VALUE_XMLTAG = \"ows:Value\",\r\n WGS84BOUNDINGBOX_XMLTAG = \"ows:WGS84BoundingBox\"\r\n\r\n}\r\n\r\nenum XmlConstants {\r\n // Operations names\r\n GETCAPABILITIES = \"GetCapabilities\",\r\n GETTILE = \"GetTile\",\r\n GETFEATUREINFO = \"GetFeatureInfo\",\r\n\r\n MATRIXWIDTH_XMLTAG = \"MatrixWidth\",\r\n MATRIXHEIGHT_XMLTAG = \"MatrixHeight\",\r\n SCALEDENOMINATOR_XMLTAG = \"ScaleDenominator\",\r\n\r\n TILEHEIGHT_XMLTAG = \"TileHeight\",\r\n TILEMATRIX_XMLTAG = \"TileMatrix\",\r\n TILEMATRIXSETLINK_XMLTAG = \"TileMatrixSetLink\",\r\n TILEWIDTH_XMLTAG = \"TileWidth\",\r\n TOPLEFTCORNER_XMLTAG = \"TopLeftCorner\",\r\n WELLKNOWNSCALESET_XMLTAG = \"WellKnownScaleSet\",\r\n\r\n CONSTRAINT_NAME_FILTER = \"Encoding\",\r\n STYLE_ISDEFAULT = \"IsDefault\",\r\n XLINK_HREF = \"xlink:href\",\r\n}\r\n\r\n/** @internal\r\n*/\r\nexport enum WmtsConstants {\r\n GOOGLEMAPS_LEVEL0_SCALE_DENOM = 559082264.0287178,\r\n GOOGLEMAPS_COMPATIBLE_WELLKNOWNNAME = \"googlemapscompatible\",\r\n}\r\n\r\n/**\r\n * Utility function to extract an element' text content\r\n * @return An element's text content, default to provided defaultTest value if no text is available.\r\n * @param url server URL to address the request\r\n * @internal\r\n */\r\nconst getElementTextContent = (elem: Element, qualifiedName: string, defaultText?: string) => {\r\n\r\n const tmpElem = elem.getElementsByTagName(qualifiedName);\r\n if (tmpElem.length > 0) {\r\n return tmpElem[0].textContent ?? defaultText;\r\n } else\r\n return defaultText;\r\n\r\n};\r\n\r\n/** Encapsulation of the capabilities for an WMTS server\r\n * @internal\r\n */\r\nexport namespace WmtsCapability {\r\n export class ServiceIdentification {\r\n public readonly abstract?: string;\r\n public readonly accessConstraints?: string;\r\n public readonly fees?: string;\r\n public readonly serviceType?: string;\r\n public readonly serviceTypeVersion?: string;\r\n public readonly title?: string;\r\n public readonly keywords?: string[];\r\n\r\n constructor(elem: Element) {\r\n this.abstract = getElementTextContent(elem, OwsConstants.ABSTRACT_XMLTAG);\r\n this.serviceType = getElementTextContent(elem, OwsConstants.SERVICETYPE_XMLTAG);\r\n this.serviceTypeVersion = getElementTextContent(elem, OwsConstants.SERVICETYPEVERSION_XMLTAG);\r\n this.title = getElementTextContent(elem, OwsConstants.TITLE_XMLTAG);\r\n\r\n const keywords = elem.getElementsByTagName(OwsConstants.KEYWORDS_XMLTAG);\r\n if (keywords.length > 0) {\r\n const keyword = keywords[0].getElementsByTagName(OwsConstants.KEYWORD_XMLTAG);\r\n this.keywords = [];\r\n for (const keyworkElem of keyword) {\r\n const keyWordText = keyworkElem.textContent;\r\n if (keyWordText)\r\n this.keywords.push(keyWordText);\r\n }\r\n }\r\n\r\n this.accessConstraints = getElementTextContent(elem, OwsConstants.ACCESSCONSTRAINTS_XMLTAG);\r\n\r\n this.fees = getElementTextContent(elem, OwsConstants.FEES_XMLTAG);\r\n }\r\n }\r\n\r\n export class OperationMetadata {\r\n private _getCapabilities?: Operation;\r\n public get getCapabilities(): Operation | undefined { return this._getCapabilities; }\r\n\r\n private _getFeatureInfo?: Operation;\r\n public get getFeatureInfo(): Operation | undefined { return this._getFeatureInfo; }\r\n\r\n private _getTile?: Operation;\r\n public get getTile(): Operation | undefined { return this._getTile; }\r\n\r\n private readOperation(op: Element) {\r\n const nameAttr = op.attributes.getNamedItem(\"name\");\r\n if (!nameAttr)\r\n return;\r\n\r\n if (nameAttr.textContent === XmlConstants.GETCAPABILITIES) {\r\n this._getCapabilities = new Operation(op);\r\n } else if (nameAttr.textContent === XmlConstants.GETTILE) {\r\n this._getTile = new Operation(op);\r\n } else if (nameAttr.textContent === XmlConstants.GETFEATUREINFO) {\r\n this._getFeatureInfo = new Operation(op);\r\n }\r\n }\r\n\r\n constructor(elem: Element) {\r\n const operation = elem.getElementsByTagName(OwsConstants.OPERATION_XMLTAG);\r\n if (operation.length > 0) {\r\n for (const op of operation) {\r\n this.readOperation(op);\r\n }\r\n }\r\n }\r\n }\r\n\r\n export class HttpDcp {\r\n public readonly url?: string;\r\n public readonly constraintName?: string;\r\n\r\n // For simplicity of use we create a 'static' encoding property instead of having\r\n // a generic constraint data model.\r\n // We make sure the constraint name is 'encoding' related.\r\n public readonly encoding?: string;\r\n\r\n constructor(elem: Element) {\r\n const url = elem.getAttribute(XmlConstants.XLINK_HREF);\r\n if (url)\r\n this.url = url ?? \"\";\r\n\r\n const constraint = elem.getElementsByTagName(OwsConstants.CONSTRAINT_XMLTAG);\r\n if (constraint.length > 0) {\r\n this.constraintName = constraint[0].getAttribute(\"name\") ?? \"\";\r\n if (this.constraintName?.endsWith(XmlConstants.CONSTRAINT_NAME_FILTER)) {\r\n const allowedValues = constraint[0].getElementsByTagName(OwsConstants.ALLOWEDVALUES_XMLTAG);\r\n if (allowedValues.length > 0) {\r\n this.encoding = getElementTextContent(allowedValues[0], OwsConstants.VALUE_XMLTAG);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n export class Operation {\r\n public readonly name?: string;\r\n private _getDcpHttp?: HttpDcp[];\r\n public get getDcpHttp(): HttpDcp[] | undefined { return this._getDcpHttp; }\r\n private _postDcpHttp?: HttpDcp[];\r\n public get postDcpHttp(): HttpDcp[] | undefined { return this._postDcpHttp; }\r\n\r\n constructor(elem: Element) {\r\n const name = elem.getAttribute(\"name\");\r\n if (name)\r\n this.name = name;\r\n\r\n const dcp = elem.getElementsByTagName(OwsConstants.DCP_XMLTAG);\r\n if (!dcp || dcp.length === 0)\r\n return;\r\n\r\n const dcpHttp = dcp[0].getElementsByTagName(OwsConstants.HTTP_XMLTAG);\r\n if (!dcpHttp || dcpHttp.length === 0)\r\n return;\r\n\r\n const get = dcpHttp[0].getElementsByTagName(OwsConstants.GET_XMLTAG);\r\n if (get.length > 0) {\r\n this._getDcpHttp = [];\r\n\r\n for (const getItem of get) {\r\n this._getDcpHttp?.push(new HttpDcp(getItem));\r\n }\r\n }\r\n\r\n const post = dcpHttp[0].getElementsByTagName(OwsConstants.POST_XMLTAG);\r\n if (post.length > 0) {\r\n this._postDcpHttp = [];\r\n\r\n for (const postItem of post) {\r\n this._postDcpHttp?.push(new HttpDcp(postItem));\r\n }\r\n }\r\n }\r\n }\r\n\r\n export class Contents {\r\n public readonly layers: Layer[] = [];\r\n public readonly tileMatrixSets: TileMatrixSet[] = [];\r\n\r\n constructor(elem: Element) {\r\n // Layers\r\n const layer = elem.getElementsByTagName(\"Layer\");\r\n if (layer) {\r\n for (const layerElem of layer)\r\n this.layers.push(new Layer(layerElem));\r\n }\r\n\r\n // TileMatrixSet\r\n const tms = elem.querySelectorAll(\"Contents > TileMatrixSet\");\r\n if (tms) {\r\n for (const tmsElem of tms)\r\n this.tileMatrixSets.push(new TileMatrixSet(tmsElem));\r\n }\r\n\r\n }\r\n\r\n public getGoogleMapsCompatibleTileMatrixSet(): TileMatrixSet[] {\r\n const googleMapsTms: TileMatrixSet[] = [];\r\n this.tileMatrixSets.forEach((tms) => {\r\n if (tms.wellKnownScaleSet?.toLowerCase().includes(WmtsConstants.GOOGLEMAPS_COMPATIBLE_WELLKNOWNNAME))\r\n googleMapsTms.push(tms);\r\n\r\n // In case wellKnownScaleSet was not been set properly, infer from scaleDenominator\r\n // Note: some servers are quite inaccurate in their scale values, hence I used a delta value of 1.\r\n else if (tms.tileMatrix.length > 0\r\n && Math.abs(tms.tileMatrix[0].scaleDenominator - WmtsConstants.GOOGLEMAPS_LEVEL0_SCALE_DENOM) < 1\r\n && (tms.supportedCrs.includes(\"3857\") || tms.supportedCrs.includes(\"900913\"))\r\n )\r\n googleMapsTms.push(tms);\r\n });\r\n return googleMapsTms;\r\n }\r\n\r\n public getEpsg4326CompatibleTileMatrixSet(): TileMatrixSet[] {\r\n return this.tileMatrixSets.filter((tms) => tms.supportedCrs.includes(\"4326\"));\r\n }\r\n }\r\n\r\n export class Style {\r\n public readonly isDefault: boolean = false;\r\n public readonly title?: string;\r\n public readonly identifier?: string;\r\n // TODO: LegendURL\r\n\r\n constructor(elem: Element) {\r\n if (!elem)\r\n return;\r\n\r\n const isDefault = elem.getAttribute(\"isDefault\");\r\n if (isDefault)\r\n this.isDefault = isDefault.toLowerCase() === \"true\";\r\n\r\n this.title = getElementTextContent(elem, OwsConstants.TITLE_XMLTAG);\r\n this.identifier = getElementTextContent(elem, OwsConstants.IDENTIFIER_XMLTAG);\r\n }\r\n }\r\n\r\n export class BoundingBox {\r\n public readonly crs?: string;\r\n public readonly range?: Range2d;\r\n\r\n constructor(elem: Element) {\r\n this.crs = elem.getAttribute(\"crs\") ?? undefined;\r\n\r\n const lowerCorner = getElementTextContent(elem, OwsConstants.LOWERCORNER_XMLTAG);\r\n const upperCorner = getElementTextContent(elem, OwsConstants.UPPERCORNER_XMLTAG);\r\n if (lowerCorner && upperCorner) {\r\n const lowerCornerArray = lowerCorner?.split(\" \").map((x: string) => +x);\r\n const upperCornerArray = upperCorner?.split(\" \").map((x: string) => +x);\r\n if (lowerCornerArray && lowerCornerArray.length === 2 && upperCornerArray && upperCornerArray.length === 2)\r\n this.range = Range2d.createXYXY(lowerCornerArray[0], lowerCornerArray[1], upperCornerArray[0], upperCornerArray[1]);\r\n }\r\n }\r\n }\r\n\r\n export class TileMatrixSetLimits {\r\n public limits?: Range2d;\r\n public tileMatrix?: string;\r\n\r\n constructor(elem: Element) {\r\n\r\n this.tileMatrix = getElementTextContent(elem, \"TileMatrix\");\r\n\r\n const minTileRow = getElementTextContent(elem, \"MinTileRow\");\r\n const maxTileRow = getElementTextContent(elem, \"MaxTileRow\");\r\n const minTileCol = getElementTextContent(elem, \"MinTileCol\");\r\n const maxTileCol = getElementTextContent(elem, \"MaxTileCol\");\r\n\r\n if (minTileRow !== undefined && maxTileRow !== undefined && minTileCol !== undefined && maxTileCol)\r\n this.limits = Range2d.createXYXY(Number(minTileCol), Number(minTileRow), Number(maxTileCol), Number(maxTileRow));\r\n }\r\n }\r\n\r\n export class TileMatrixSetLink {\r\n public readonly tileMatrixSet: string;\r\n public readonly tileMatrixSetLimits = new Array<TileMatrixSetLimits>();\r\n\r\n constructor(elem: Element) {\r\n\r\n this.tileMatrixSet = getElementTextContent(elem, \"TileMatrixSet\", \"\")!;\r\n\r\n const tileMatrixLimitsRoot = elem.getElementsByTagName(\"TileMatrixSetLimits\");\r\n if (tileMatrixLimitsRoot.length > 0) {\r\n const tileMatrixLimits = tileMatrixLimitsRoot[0].getElementsByTagName(\"TileMatrixSetLimits\");\r\n for (const tmsl of tileMatrixLimits) {\r\n this.tileMatrixSetLimits.push(new TileMatrixSetLimits(tmsl));\r\n }\r\n }\r\n }\r\n }\r\n\r\n export class TileMatrixSet {\r\n public readonly identifier: string;\r\n public readonly title?: string;\r\n public readonly abstract?: string;\r\n public readonly supportedCrs: string;\r\n public readonly wellKnownScaleSet: string;\r\n public readonly tileMatrix: TileMatrix[] = [];\r\n\r\n constructor(elem: Element) {\r\n const identifier = getElementTextContent(elem, OwsConstants.IDENTIFIER_XMLTAG);\r\n if (identifier)\r\n this.identifier = identifier;\r\n else\r\n throw new Error(\"No Identifier found.\");\r\n\r\n this.title = getElementTextContent(elem, OwsConstants.TITLE_XMLTAG);\r\n this.abstract = getElementTextContent(elem, OwsConstants.ABSTRACT_XMLTAG);\r\n\r\n const supportedCrs = getElementTextContent(elem, OwsConstants.SUPPORTEDCRS_XMLTAG);\r\n if (supportedCrs)\r\n this.supportedCrs = supportedCrs;\r\n else\r\n throw new Error(\"No supported CRS found.\");\r\n\r\n this.wellKnownScaleSet = getElementTextContent(elem, XmlConstants.WELLKNOWNSCALESET_XMLTAG, \"\")!;\r\n\r\n // TileMatrix:\r\n // TileMatrix is mandatory on TileMatrixSet, if it doesn't exists, something is OFF with the capability.\r\n const tileMatrix = elem.getElementsByTagName(XmlConstants.TILEMATRIX_XMLTAG);\r\n if (tileMatrix.length === 0)\r\n throw new Error(\"No matrix set link found for WMTS layer\");\r\n\r\n for (const tm of tileMatrix) {\r\n this.tileMatrix.push(new TileMatrix(tm));\r\n }\r\n }\r\n }\r\n\r\n export class TileMatrix {\r\n public readonly identifier: string;\r\n public readonly title?: string;\r\n public readonly abstract?: string;\r\n public readonly scaleDenominator: number;\r\n public readonly topLeftCorner: Point2d;\r\n public readonly tileWidth: number;\r\n public readonly tileHeight: number;\r\n public readonly matrixWidth: number;\r\n public readonly matrixHeight: number;\r\n\r\n constructor(elem: Element) {\r\n const identifier = getElementTextContent(elem, OwsConstants.IDENTIFIER_XMLTAG, \"\");\r\n if (identifier)\r\n this.identifier = identifier;\r\n else\r\n throw new Error(\"No Identifier found.\");\r\n\r\n this.title = getElementTextContent(elem, OwsConstants.TITLE_XMLTAG);\r\n this.abstract = getElementTextContent(elem, OwsConstants.ABSTRACT_XMLTAG);\r\n\r\n // Scale denominator\r\n const scaleDenom = getElementTextContent(elem, XmlConstants.SCALEDENOMINATOR_XMLTAG, \"\");\r\n if (!scaleDenom)\r\n throw new Error(\"No scale denominator found on TileMatrix.\");\r\n this.scaleDenominator = +scaleDenom;\r\n\r\n // Top left corner\r\n const topLeftCorner = getElementTextContent(elem, XmlConstants.TOPLEFTCORNER_XMLTAG, \"\")?.split(\" \").map((x: string) => +x);\r\n if (topLeftCorner?.length !== 2)\r\n throw new Error(\"No TopLeftCorner found on TileMatrix.\");\r\n this.topLeftCorner = Point2d.create(topLeftCorner[0], topLeftCorner[1]);\r\n\r\n // Tile Width\r\n const tileWidth = getElementTextContent(elem, XmlConstants.TILEWIDTH_XMLTAG);\r\n if (!tileWidth)\r\n throw new Error(\"No tile width found on TileMatrix.\");\r\n this.tileWidth = +tileWidth;\r\n\r\n // Tile Height\r\n const tileHeight = getElementTextContent(elem, XmlConstants.TILEHEIGHT_XMLTAG);\r\n if (!tileHeight)\r\n throw new Error(\"No tile height found on TileMatrix.\");\r\n this.tileHeight = +tileHeight;\r\n\r\n // Matrix Width\r\n const matrixWidth = getElementTextContent(elem, XmlConstants.MATRIXWIDTH_XMLTAG);\r\n if (!matrixWidth)\r\n throw new Error(\"No tile width found on TileMatrix.\");\r\n this.matrixWidth = +matrixWidth;\r\n\r\n // Matrix Height\r\n const matrixHeight = getElementTextContent(elem, XmlConstants.MATRIXHEIGHT_XMLTAG);\r\n if (!matrixHeight)\r\n throw new Error(\"No tile height found on TileMatrix.\");\r\n this.matrixHeight = +matrixHeight;\r\n }\r\n }\r\n\r\n export class Layer {\r\n public readonly identifier: string;\r\n public readonly title?: string;\r\n public readonly abstract?: string;\r\n public readonly format?: string;\r\n public readonly wsg84BoundingBox?: MapCartoRectangle;\r\n public readonly boundingBox?: BoundingBox;\r\n public readonly styles: Style[] = [];\r\n public readonly tileMatrixSetLinks: TileMatrixSetLink[] = [];\r\n\r\n constructor(elem: Element) {\r\n\r\n const identifier = getElementTextContent(elem, OwsConstants.IDENTIFIER_XMLTAG, \"\");\r\n if (identifier)\r\n this.identifier = identifier;\r\n else\r\n throw new Error(\"No Identifier found.\");\r\n\r\n this.title = getElementTextContent(elem, OwsConstants.TITLE_XMLTAG);\r\n this.format = getElementTextContent(elem, \"Format\");\r\n\r\n // BoundingBox\r\n const boundingBox = elem.getElementsByTagName(OwsConstants.BOUNDINGBOX_XMLTAG);\r\n if (boundingBox.length > 0)\r\n this.boundingBox = new BoundingBox(boundingBox[0]);\r\n\r\n let lowerCornerArray: number[] | undefined, upperCornerArray: number[] | undefined;\r\n const bbox = elem.getElementsByTagName(OwsConstants.WGS84BOUNDINGBOX_XMLTAG);\r\n if (bbox.length > 0) {\r\n lowerCornerArray = getElementTextContent(bbox[0], OwsConstants.LOWERCORNER_XMLTAG)?.split(\" \").map((x: string) => +x);\r\n upperCornerArray = getElementTextContent(bbox[0], OwsConstants.UPPERCORNER_XMLTAG)?.split(\" \").map((x: string) => +x);\r\n }\r\n\r\n if (lowerCornerArray?.length === 2 && upperCornerArray?.length === 2)\r\n this.wsg84BoundingBox = MapCartoRectangle.fromDegrees(lowerCornerArray[0], lowerCornerArray[1], upperCornerArray[0], upperCornerArray[1]);\r\n\r\n // If we could not initialized WSG84 bounding box, attempt to initialized it from Bounding Box\r\n if (!this.wsg84BoundingBox && (this.boundingBox?.crs?.includes(\"EPSG:4326\") || this.boundingBox?.crs?.includes(\"CRS:84\"))) {\r\n const range = this.boundingBox.range;\r\n if (range)\r\n this.wsg84BoundingBox = MapCartoRectangle.fromDegrees(range.low.x, range.low.y, range.high.x, range.high.y);\r\n else\r\n this.wsg84BoundingBox = MapCartoRectangle.createMaximum();\r\n }\r\n\r\n // Style\r\n const style = elem.getElementsByTagName(\"Style\");\r\n if (style.length > 0) {\r\n for (const styleElem of style)\r\n this.styles.push(new Style(styleElem));\r\n }\r\n\r\n // TileMatrixSetLink\r\n // TileMatrixSetLink is mandatory on Layer, if it doesn't exists, something is OFF with the capability.\r\n const tileMatrixSetLink = elem.getElementsByTagName(XmlConstants.TILEMATRIXSETLINK_XMLTAG);\r\n\r\n if (tileMatrixSetLink.length === 0)\r\n throw new Error(\"No matrix set link found for WMTS layer\");\r\n\r\n for (const tmsl of tileMatrixSetLink)\r\n this.tileMatrixSetLinks.push(new TileMatrixSetLink(tmsl));\r\n }\r\n }\r\n}\r\n/** @internal */\r\nexport class WmtsCapabilities {\r\n private static _capabilitiesCache = new Map<string, WmtsCapabilities | undefined>();\r\n\r\n public readonly version?: string;\r\n public readonly serviceIdentification?: WmtsCapability.ServiceIdentification;\r\n public readonly contents?: WmtsCapability.Contents;\r\n\r\n public readonly operationsMetadata?: WmtsCapability.OperationMetadata;\r\n\r\n constructor(xmlDoc: Document) {\r\n\r\n const capabilities = xmlDoc.getElementsByTagName(\"Capabilities\");\r\n if (capabilities.length !== 0) {\r\n const capability = capabilities[0];\r\n this.version = capability.getAttribute(\"version\") ?? undefined;\r\n\r\n // Service Identification\r\n const serviceIdentification = capability.getElementsByTagName(OwsConstants.SERVICEIDENTIFICATION_XMLTAG);\r\n if (serviceIdentification.length > 0)\r\n this.serviceIdentification = new WmtsCapability.ServiceIdentification(serviceIdentification[0]);\r\n\r\n // Operations metadata\r\n const operationsMetadata = capability.getElementsByTagName(OwsConstants.OPERATIONSMETADATA_XMLTAG);\r\n if (operationsMetadata.length > 0)\r\n this.operationsMetadata = new WmtsCapability.OperationMetadata(operationsMetadata[0]);\r\n\r\n // Contents\r\n const content = capability.getElementsByTagName(\"Contents\");\r\n if (content.length > 0)\r\n this.contents = new WmtsCapability.Contents(content[0]);\r\n }\r\n }\r\n\r\n public static createFromXml(xmlCapabilities: string): WmtsCapabilities | undefined {\r\n const parser = new DOMParser();\r\n const xmlDoc = parser.parseFromString(xmlCapabilities, \"text/xml\");\r\n return new WmtsCapabilities(xmlDoc);\r\n }\r\n\r\n public static async create(url: string, credentials?: RequestBasicCredentials, ignoreCache?: boolean, queryParams?: {[key: string]: string}): Promise<WmtsCapabilities | undefined> {\r\n if (!ignoreCache) {\r\n const cached = WmtsCapabilities._capabilitiesCache.get(url);\r\n if (cached !== undefined)\r\n return cached;\r\n }\r\n\r\n const tmpUrl = new URL(WmsUtilities.getBaseUrl(url));\r\n tmpUrl.searchParams.append(\"request\", \"GetCapabilities\");\r\n tmpUrl.searchParams.append(\"service\", \"WMTS\");\r\n if (queryParams) {\r\n Object.keys(queryParams).forEach((paramKey) => {\r\n if (!tmpUrl.searchParams.has(paramKey))\r\n tmpUrl.searchParams.append(paramKey, queryParams[paramKey]);\r\n });\r\n }\r\n\r\n const xmlCapabilities = await WmsUtilities.fetchXml(tmpUrl.toString(), credentials);\r\n if (!xmlCapabilities)\r\n return undefined;\r\n\r\n const capabilities = WmtsCapabilities.createFromXml(xmlCapabilities);\r\n if (capabilities)\r\n WmtsCapabilities._capabilitiesCache.set(url, capabilities);\r\n\r\n return capabilities;\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { RequestBasicCredentials } from "./Request";
|
|
2
|
+
/**
|
|
3
|
+
* Check whether or not one of the requested authentication method is listed in the HTTP 'WWW-Authenticate' response header
|
|
4
|
+
* @param headers Headers object
|
|
5
|
+
* @param query List of authentication method to lookup (case-insensitive)
|
|
6
|
+
* @note For CORS requests, the 'Access-Control-Expose-Headers' header from the server must make the 'WWW-Authenticate' available to the browser, otherwise this won't work.
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export declare function headersIncludeAuthMethod(headers: Headers, query: string[]): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Set the value of the 'Authorization' header with Basic authentication value
|
|
12
|
+
* scheme: 'Authorization: Basic <credentials>'
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export declare function setBasicAuthorization(headers: Headers, credentials: RequestBasicCredentials): void;
|
|
16
|
+
/** @internal */
|
|
17
|
+
export declare function setBasicAuthorization(headers: Headers, user: string, password: string): void;
|
|
18
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/request/utils.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEpD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAWnF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,uBAAuB,GAAG,IAAI,CAAC;AACpG,gBAAgB;AAChB,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { Base64EncodedString } from "@itwin/core-common";
|
|
6
|
+
/**
|
|
7
|
+
* Check whether or not one of the requested authentication method is listed in the HTTP 'WWW-Authenticate' response header
|
|
8
|
+
* @param headers Headers object
|
|
9
|
+
* @param query List of authentication method to lookup (case-insensitive)
|
|
10
|
+
* @note For CORS requests, the 'Access-Control-Expose-Headers' header from the server must make the 'WWW-Authenticate' available to the browser, otherwise this won't work.
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
export function headersIncludeAuthMethod(headers, query) {
|
|
14
|
+
const wwwAuthenticate = headers.get("WWW-authenticate");
|
|
15
|
+
const lowerCaseQuery = query.map(((value) => value.toLowerCase())); // not case-sensitive
|
|
16
|
+
if (wwwAuthenticate !== null) {
|
|
17
|
+
const authMethods = wwwAuthenticate.split(",").map(((value) => value.toLowerCase().trim()));
|
|
18
|
+
for (const queryValue of lowerCaseQuery) {
|
|
19
|
+
if (authMethods.includes(queryValue))
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
/** @internal */
|
|
26
|
+
export function setBasicAuthorization(headers, userOrCreds, password) {
|
|
27
|
+
let username;
|
|
28
|
+
let pwd;
|
|
29
|
+
if (typeof userOrCreds === "string") {
|
|
30
|
+
username = userOrCreds;
|
|
31
|
+
pwd = password;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
username = userOrCreds.user;
|
|
35
|
+
pwd = userOrCreds.password;
|
|
36
|
+
}
|
|
37
|
+
if (username !== undefined && pwd !== undefined)
|
|
38
|
+
headers.set("Authorization", `Basic ${Base64EncodedString.encode(`${username}:${pwd}`)}`);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/request/utils.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAgB,EAAE,KAAe;IACxE,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAC,EAAE,CAAA,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAK,qBAAqB;IAC3F,IAAI,eAAe,KAAK,IAAI,EAAE;QAC5B,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAC,EAAE,CAAA,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1F,KAAK,MAAM,UAAU,IAAI,cAAc,EAAE;YACvC,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAClC,OAAO,IAAI,CAAC;SACf;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAUD,gBAAgB;AAChB,MAAM,UAAU,qBAAqB,CAAC,OAAgB,EAAE,WAA2C,EAAE,QAAiB;IACpH,IAAI,QAA0B,CAAC;IAC/B,IAAI,GAAqB,CAAC;IAC1B,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;QACnC,QAAQ,GAAG,WAAW,CAAC;QACvB,GAAG,GAAI,QAAQ,CAAC;KACjB;SAAM;QACL,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC;QAC5B,GAAG,GAAI,WAAW,CAAC,QAAQ,CAAC;KAC7B;IAED,IAAI,QAAQ,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS;QAC7C,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,mBAAmB,CAAC,MAAM,CAAC,GAAG,QAAQ,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;AAC9F,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Base64EncodedString } from \"@itwin/core-common\";\r\nimport { RequestBasicCredentials } from \"./Request\";\r\n\r\n/**\r\n * Check whether or not one of the requested authentication method is listed in the HTTP 'WWW-Authenticate' response header\r\n * @param headers Headers object\r\n * @param query List of authentication method to lookup (case-insensitive)\r\n * @note For CORS requests, the 'Access-Control-Expose-Headers' header from the server must make the 'WWW-Authenticate' available to the browser, otherwise this won't work.\r\n * @internal\r\n */\r\nexport function headersIncludeAuthMethod(headers: Headers, query: string[]): boolean {\r\n const wwwAuthenticate = headers.get(\"WWW-authenticate\");\r\n const lowerCaseQuery = query.map(((value)=>value.toLowerCase())); // not case-sensitive\r\n if (wwwAuthenticate !== null) {\r\n const authMethods = wwwAuthenticate.split(\",\").map(((value)=>value.toLowerCase().trim()));\r\n for (const queryValue of lowerCaseQuery) {\r\n if (authMethods.includes(queryValue))\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Set the value of the 'Authorization' header with Basic authentication value\r\n * scheme: 'Authorization: Basic <credentials>'\r\n * @internal\r\n */\r\nexport function setBasicAuthorization(headers: Headers, credentials: RequestBasicCredentials): void;\r\n/** @internal */\r\nexport function setBasicAuthorization(headers: Headers, user: string, password: string): void;\r\n/** @internal */\r\nexport function setBasicAuthorization(headers: Headers, userOrCreds: string|RequestBasicCredentials, password?: string): void {\r\n let username: string|undefined;\r\n let pwd: string|undefined;\r\n if (typeof userOrCreds === \"string\") {\r\n username = userOrCreds;\r\n pwd = password;\r\n } else {\r\n username = userOrCreds.user;\r\n pwd = userOrCreds.password;\r\n }\r\n\r\n if (username !== undefined && pwd !== undefined)\r\n headers.set(\"Authorization\", `Basic ${Base64EncodedString.encode(`${username}:${pwd}`)}`);\r\n}\r\n\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArcGisUtilities.d.ts","sourceRoot":"","sources":["../../../../src/tile/map/ArcGisUtilities.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,cAAc,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,kBAAkB,EAAC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ArcGisUtilities.d.ts","sourceRoot":"","sources":["../../../../src/tile/map/ArcGisUtilities.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,cAAc,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,kBAAkB,EAAC,MAAM,aAAa,CAAC;AAIzM;;GAEG;AAEH;;;GAGG;AACH,oBAAY,eAAe;IACzB,kBAAkB,MAAM;IACxB,YAAY,MAAM;IAClB,aAAa,MAAM;IACnB,YAAY,OAAO;IACnB,cAAc,OAAO;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,oCAAoC;IACpC,OAAO,EAAE,GAAG,CAAC;IAEb,qEAAqE;IACrE,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,kBAAkB;IAClE,kJAAkJ;IAClJ,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAC,CAAC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,eAAe;IAE1B,OAAO,CAAC,MAAM,CAAC,aAAa;WAOR,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;WA4BlD,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA4BxG;;;;;OAKG;WACiB,mBAAmB,CAAC,KAAK,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAqD,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAqBvJ;;;;;OAKG;WACW,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,oBAAoB;IAcjF;;;;MAIE;WACkB,cAAc,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAkDrG,mGAAmG;WACrF,oBAAoB,CAAC,QAAQ,EAAE,GAAG;IAQhD,OAAO,CAAC,MAAM,CAAC,aAAa,CAAsD;IAElF;;;;;;;;;;;OAWG;WAEiB,cAAc,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,qBAAqB,GAAC,SAAS,CAAC;IAqE5G,mFAAmF;WAC/D,yBAAyB,CAAC,QAAQ,EAAE,QAAQ;WAoB5C,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,yBAAyB,GAAG,OAAO,CAAC,mBAAmB,GAAC,SAAS,CAAC;IAgB3K;;;;;;;;;;OAUG;WACW,uBAAuB,CAAC,SAAS,GAAE,MAAU,EAAE,OAAO,GAAE,MAAW,EAAE,QAAQ,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAY,EAAE,SAAS,SAAK,GAAG;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,EAAE;IAoBrM;;;;;;;OAOG;WACW,mBAAmB,CAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAC;CA0B7K"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { Angle, Constant } from "@itwin/core-geometry";
|
|
6
6
|
import { MapCartoRectangle, MapLayerSource, MapLayerSourceStatus } from "../internal";
|
|
7
7
|
import { IModelApp } from "../../IModelApp";
|
|
8
|
+
import { headersIncludeAuthMethod } from "../../request/utils";
|
|
8
9
|
/** @packageDocumentation
|
|
9
10
|
* @module Tiles
|
|
10
11
|
*/
|
|
@@ -227,6 +228,10 @@ class ArcGisUtilities {
|
|
|
227
228
|
}
|
|
228
229
|
}
|
|
229
230
|
let response = await fetch(tmpUrl.toString(), { method: "GET" });
|
|
231
|
+
if (response.status === 401 && !requireToken && headersIncludeAuthMethod(response.headers, ["ntlm", "negotiate"])) {
|
|
232
|
+
// We got a http 401 challenge, lets try again with SSO enabled (i.e. Windows Authentication)
|
|
233
|
+
response = await fetch(url, { method: "GET", credentials: "include" });
|
|
234
|
+
}
|
|
230
235
|
// Append security token when corresponding error code is returned by ArcGIS service
|
|
231
236
|
let errorCode = await ArcGisUtilities.checkForResponseErrorCode(response);
|
|
232
237
|
if (!accessTokenRequired
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArcGisUtilities.js","sourceRoot":"","sources":["../../../../src/tile/map/ArcGisUtilities.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { Angle, Constant } from \"@itwin/core-geometry\";\r\nimport { MapSubLayerProps } from \"@itwin/core-common\";\r\nimport { MapCartoRectangle, MapLayerAccessClient, MapLayerAccessToken, MapLayerAccessTokenParams, MapLayerSource, MapLayerSourceStatus, MapLayerSourceValidation, ValidateSourceArgs} from \"../internal\";\r\nimport { IModelApp } from \"../../IModelApp\";\r\n\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\n/**\r\n * Class representing an ArcGIS error code.\r\n * @internal\r\n */\r\nexport enum ArcGisErrorCode {\r\n InvalidCredentials = 401,\r\n InvalidToken = 498,\r\n TokenRequired = 499,\r\n UnknownError = 1000,\r\n NoTokenService = 1001,\r\n}\r\n\r\n/**\r\n * Class representing an ArcGIS service metadata.\r\n * @internal\r\n */\r\nexport interface ArcGISServiceMetadata {\r\n /** JSON content from the service */\r\n content: any;\r\n\r\n /** Indicates if an access token is required to access the service */\r\n accessTokenRequired: boolean;\r\n}\r\n\r\n/** Arguments for validating ArcGIS sources\r\n * @internal\r\n */\r\nexport interface ArcGisValidateSourceArgs extends ValidateSourceArgs {\r\n /** List of capabilities 'keyword' that needs to be advertised in the service's metadata in order to be valid. For example: 'Map', 'Query', etc*/\r\n capabilitiesFilter: string[];\r\n}\r\n\r\n/** Arguments for fetching service metadata\r\n * @internal\r\n */\r\nexport interface ArcGisGetServiceJsonArgs {\r\n url: string;\r\n formatId: string;\r\n userName?: string;\r\n password?: string;\r\n queryParams?: {[key: string]: string};\r\n ignoreCache?: boolean;\r\n requireToken?: boolean;\r\n}\r\n\r\n/**\r\n * Class containing utilities relating to ArcGIS services and coordinate systems.\r\n * @internal\r\n */\r\nexport class ArcGisUtilities {\r\n\r\n private static getBBoxString(range?: MapCartoRectangle) {\r\n if (!range)\r\n range = MapCartoRectangle.createMaximum();\r\n\r\n return `${range.low.x * Angle.degreesPerRadian},${range.low.y * Angle.degreesPerRadian},${range.high.x * Angle.degreesPerRadian},${range.high.y * Angle.degreesPerRadian}`;\r\n }\r\n\r\n public static async getNationalMapSources(): Promise<MapLayerSource[]> {\r\n const sources = new Array<MapLayerSource>();\r\n const response = await fetch(\"https://viewer.nationalmap.gov/tnmaccess/api/getMapServiceList\", { method: \"GET\" });\r\n const services = await response.json();\r\n\r\n if (!Array.isArray(services))\r\n return sources;\r\n\r\n for (const service of services) {\r\n if (service.wmsUrl.length === 0) // Exclude Wfs..\r\n continue;\r\n switch (service.serviceType) {\r\n case \"ArcGIS\":\r\n sources.push(MapLayerSource.fromJSON({ name: service.displayName, url: service.serviceLink, formatId: \"ArcGIS\" })!);\r\n break;\r\n default: {\r\n const wmsIndex = service.wmsUrl.lastIndexOf(\"/wms\");\r\n if (wmsIndex > 0) {\r\n const url = service.wmsUrl.slice(0, wmsIndex + 4);\r\n sources.push(MapLayerSource.fromJSON({ name: service.displayName, url, formatId: \"WMS\" })!);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n return sources;\r\n }\r\n\r\n public static async getServiceDirectorySources(url: string, baseUrl?: string): Promise<MapLayerSource[]> {\r\n if (undefined === baseUrl)\r\n baseUrl = url;\r\n let sources = new Array<MapLayerSource>();\r\n const response = await fetch(`${url}?f=json`, { method: \"GET\" });\r\n const json = await response.json();\r\n if (json !== undefined) {\r\n if (Array.isArray(json.folders)) {\r\n for (const folder of json.folders) {\r\n sources = sources.concat(await ArcGisUtilities.getServiceDirectorySources(`${url}/${folder}`, url));\r\n }\r\n }\r\n if (Array.isArray(json.services)) {\r\n for (const service of json.services) {\r\n let source;\r\n if (service.type === \"MapServer\")\r\n source = MapLayerSource.fromJSON({ name: service.name, url: `${baseUrl}/${service.name}/MapServer`, formatId: \"ArcGIS\" });\r\n else if (service.type === \"ImageServer\")\r\n source = MapLayerSource.fromJSON({ name: service.name, url: `${baseUrl}/${service.name}/ImageServer`, formatId: \"ArcGIS\" });\r\n if (source)\r\n sources.push(source);\r\n }\r\n }\r\n }\r\n\r\n return sources;\r\n }\r\n\r\n /**\r\n * Get map layer sources from an ArcGIS query.\r\n * @param range Range for the query.\r\n * @param url URL for the query.\r\n * @returns List of map layer sources.\r\n */\r\n public static async getSourcesFromQuery(range?: MapCartoRectangle, url = \"https://usgs.maps.arcgis.com/sharing/rest/search\"): Promise<MapLayerSource[]> {\r\n const sources = new Array<MapLayerSource>();\r\n for (let start = 1; start > 0;) {\r\n const response = await fetch(`${url}?f=json&q=(group:9d1199a521334e77a7d15abbc29f8144) AND (type:\"Map Service\")&bbox=${ArcGisUtilities.getBBoxString(range)}&sortOrder=desc&start=${start}&num=100`, { method: \"GET\" });\r\n const json = await response.json();\r\n if (!json)\r\n break;\r\n\r\n start = json.nextStart ? json.nextStart : -1;\r\n if (json !== undefined && Array.isArray(json.results)) {\r\n for (const result of json.results) {\r\n const source = MapLayerSource.fromJSON({ name: result.name ? result.name : result.title, url: result.url, formatId: \"ArcGIS\" });\r\n if (source)\r\n sources.push(source);\r\n }\r\n }\r\n }\r\n\r\n return sources;\r\n }\r\n\r\n /**\r\n * Parse the URL to check if it represents a valid ArcGIS service\r\n * @param url URL to validate.\r\n * @param serviceType Service type to validate (i.e FeatureServer, MapServer)\r\n * @return Validation Status.\r\n */\r\n public static validateUrl(url: string, serviceType: string): MapLayerSourceStatus {\r\n const urlObj = new URL(url.toLowerCase());\r\n if (urlObj.pathname.includes(\"/rest/services/\")) {\r\n // This seem to be an ArcGIS URL, lets check the service type\r\n if (urlObj.pathname.endsWith(`${serviceType.toLowerCase()}`)) {\r\n return MapLayerSourceStatus.Valid;\r\n } else {\r\n return MapLayerSourceStatus.IncompatibleFormat;\r\n }\r\n } else {\r\n return MapLayerSourceStatus.InvalidUrl;\r\n }\r\n }\r\n\r\n /**\r\n * Attempt to access an ArcGIS service, and validate its service metadata.\r\n * @param source Source to validate.\r\n * @param opts Validation options\r\n */\r\n public static async validateSource(args: ArcGisValidateSourceArgs): Promise<MapLayerSourceValidation> {\r\n const {source, ignoreCache, capabilitiesFilter} = args;\r\n const metadata = await this.getServiceJson({url: source.url, formatId: source.formatId, userName: source.userName, password: source.password, queryParams: source.collectQueryParams(), ignoreCache});\r\n const json = metadata?.content;\r\n if (json === undefined) {\r\n return { status: MapLayerSourceStatus.InvalidUrl };\r\n } else if (json.error !== undefined) {\r\n\r\n // If we got a 'Token Required' error, lets check what authentification methods this ESRI service offers\r\n // and return information needed to initiate the authentification process... the end-user\r\n // will have to provide his credentials before we can fully validate this source.\r\n if (json.error.code === ArcGisErrorCode.TokenRequired) {\r\n return (source.userName || source.password) ? {status: MapLayerSourceStatus.InvalidCredentials} : {status: MapLayerSourceStatus.RequireAuth};\r\n } else if (json.error.code === ArcGisErrorCode.InvalidCredentials)\r\n return { status: MapLayerSourceStatus.InvalidCredentials};\r\n }\r\n\r\n // Check this service support the expected queries\r\n let hasCapabilities = false;\r\n let capsArray: string[] = [];\r\n if (json.capabilities && typeof json.capabilities === \"string\" ) {\r\n const capabilities: string = json.capabilities;\r\n capsArray = capabilities.split(\",\").map((entry) => entry.toLowerCase());\r\n\r\n const filtered = capsArray.filter((element, _index, _array) => capabilitiesFilter.includes(element));\r\n hasCapabilities = (filtered.length === capabilitiesFilter.length);\r\n }\r\n if (!hasCapabilities) {\r\n return { status: MapLayerSourceStatus.InvalidFormat};\r\n }\r\n\r\n // Only EPSG:3857 is supported with pre-rendered tiles.\r\n if (json.tileInfo && capsArray.includes(\"tilesonly\") && !ArcGisUtilities.isEpsg3857Compatible(json.tileInfo)) {\r\n return { status: MapLayerSourceStatus.InvalidCoordinateSystem};\r\n }\r\n\r\n let subLayers;\r\n if (json.layers) {\r\n\r\n subLayers = new Array<MapSubLayerProps>();\r\n\r\n for (const layer of json.layers) {\r\n const parent = layer.parentLayerId < 0 ? undefined : layer.parentLayerId;\r\n const children = Array.isArray(layer.subLayerIds) ? layer.subLayerIds : undefined;\r\n subLayers.push({ name: layer.name, visible: layer.defaultVisibility !== false, id: layer.id, parent, children });\r\n }\r\n }\r\n return { status: MapLayerSourceStatus.Valid, subLayers };\r\n }\r\n\r\n /** Validate MapService tiling metadata and checks if the tile tree is 'Google Maps' compatible. */\r\n public static isEpsg3857Compatible(tileInfo: any) {\r\n if (tileInfo.spatialReference?.latestWkid !== 3857 || !Array.isArray(tileInfo.lods))\r\n return false;\r\n\r\n const zeroLod = tileInfo.lods[0];\r\n return zeroLod.level === 0 && Math.abs(zeroLod.resolution - 156543.03392800014) < .001;\r\n }\r\n\r\n private static _serviceCache = new Map<string, ArcGISServiceMetadata|undefined>();\r\n\r\n /**\r\n * Fetches an ArcGIS service metadata, and returns its JSON representation.\r\n * If an access client has been configured for the specified formatId,\r\n * it will be used to apply required security token.\r\n * By default, response for each URL are cached.\r\n * @param url URL of the ArcGIS service\r\n * @param formatId Format ID of the service\r\n * @param userName Username to use for legacy token based security\r\n * @param password Password to use for legacy token based security\r\n * @param ignoreCache Flag to skip cache lookup (i.e. force a new server request)\r\n * @param requireToken Flag to indicate if a token is required\r\n */\r\n\r\n public static async getServiceJson(args: ArcGisGetServiceJsonArgs): Promise<ArcGISServiceMetadata|undefined> {\r\n const {url, formatId, userName, password, queryParams, ignoreCache, requireToken} = args;\r\n if (!ignoreCache) {\r\n const cached = ArcGisUtilities._serviceCache.get(url);\r\n if (cached !== undefined)\r\n return cached;\r\n }\r\n const appendParams = (urlObj: URL, params?: {[key: string]: string}) => {\r\n if (params) {\r\n Object.keys(params).forEach((paramKey) => {\r\n if (!urlObj.searchParams.has(paramKey))\r\n urlObj.searchParams.append(paramKey, params[paramKey]);\r\n });\r\n }\r\n };\r\n\r\n const createUrlObj = () => {\r\n const tmpUrl = new URL(url);\r\n tmpUrl.searchParams.append(\"f\", \"json\");\r\n appendParams(tmpUrl, queryParams);\r\n return tmpUrl;\r\n };\r\n\r\n let accessTokenRequired = false;\r\n try {\r\n let tmpUrl = createUrlObj();\r\n\r\n // In some cases, caller might already know token is required, so append it immediately\r\n if (requireToken) {\r\n const accessClient = IModelApp.mapLayerFormatRegistry.getAccessClient(formatId);\r\n if (accessClient) {\r\n accessTokenRequired = true;\r\n await ArcGisUtilities.appendSecurityToken(tmpUrl, accessClient, {mapLayerUrl: new URL(url), userName, password});\r\n }\r\n }\r\n let response = await fetch(tmpUrl.toString(), { method: \"GET\" });\r\n\r\n // Append security token when corresponding error code is returned by ArcGIS service\r\n let errorCode = await ArcGisUtilities.checkForResponseErrorCode(response);\r\n if (!accessTokenRequired\r\n && errorCode !== undefined\r\n && errorCode === ArcGisErrorCode.TokenRequired ) {\r\n accessTokenRequired = true;\r\n // If token required\r\n const accessClient = IModelApp.mapLayerFormatRegistry.getAccessClient(formatId);\r\n if (accessClient) {\r\n tmpUrl = createUrlObj();\r\n await ArcGisUtilities.appendSecurityToken(tmpUrl, accessClient, {mapLayerUrl: new URL(url), userName, password});\r\n response = await fetch(tmpUrl.toString(), { method: \"GET\" });\r\n errorCode = await ArcGisUtilities.checkForResponseErrorCode(response);\r\n }\r\n }\r\n\r\n const json = await response.json();\r\n const info = {content: json, accessTokenRequired};\r\n // Cache the response only if it doesn't contain any error.\r\n ArcGisUtilities._serviceCache.set(url, (errorCode === undefined ? info : undefined));\r\n return info; // Always return json, even though it contains an error code.\r\n\r\n } catch (_error) {\r\n ArcGisUtilities._serviceCache.set(url, undefined);\r\n return undefined;\r\n }\r\n }\r\n\r\n /** Read a response from ArcGIS server and check for error code in the response. */\r\n public static async checkForResponseErrorCode(response: Response) {\r\n const tmpResponse = response;\r\n if (response.headers && tmpResponse.headers.get(\"content-type\")?.toLowerCase().includes(\"json\")) {\r\n\r\n try {\r\n // Note:\r\n // Since response stream can only be read once (i.e. calls to .json() method)\r\n // we have to clone the response object in order to check for potential error code,\r\n // but still keep the response stream as unread.\r\n const clonedResponse = tmpResponse.clone();\r\n const json = await clonedResponse.json();\r\n if (json?.error?.code !== undefined)\r\n return json?.error?.code as number;\r\n } catch { }\r\n\r\n }\r\n return undefined;\r\n }\r\n\r\n // return the appended access token if available.\r\n public static async appendSecurityToken(url: URL, accessClient: MapLayerAccessClient, accessTokenParams: MapLayerAccessTokenParams): Promise<MapLayerAccessToken|undefined> {\r\n\r\n // Append security token if available\r\n let accessToken: MapLayerAccessToken|undefined;\r\n try {\r\n accessToken = await accessClient.getAccessToken(accessTokenParams);\r\n } catch {}\r\n\r\n if (accessToken?.token) {\r\n url.searchParams.append(\"token\", accessToken.token);\r\n return accessToken;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Compute scale, resolution values for requested zoom levels (WSG 84)\r\n * Use a scale of 96 dpi for Google Maps scales\r\n * Based on this article: https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Resolution_and_Scale\r\n * @param startZoom Zoom level where scales begins to be computed\r\n * @param endZoom Zoom level where scales ends to be computed\r\n * @param latitude Latitude in degrees to use to compute scales (i.e 0 for Equator)\r\n * @param tileSize Size of a tile in pixels (i.e 256)\r\n * @param screenDpi Monitor resolution in dots per inch (i.e. typically 96dpi is used by Google Maps)\r\n * @returns An array containing resolution and scale values for each requested zoom level\r\n */\r\n public static computeZoomLevelsScales(startZoom: number = 0, endZoom: number = 20, latitude: number = 0, tileSize: number = 256, screenDpi = 96): {zoom: number, resolution: number, scale: number}[] {\r\n // Note: There is probably a more direct way to compute this, but I prefer to go for a simple and well documented approach.\r\n if (startZoom <0 || endZoom < startZoom || tileSize < 0 || screenDpi < 1 || latitude < -90 || latitude > 90)\r\n return [];\r\n\r\n const inchPerMeter = 1 / 0.0254;\r\n const results: {zoom: number, resolution: number, scale: number}[] = [];\r\n const equatorLength = Constant.earthRadiusWGS84.equator * 2 * Math.PI;\r\n const zoom0Resolution = equatorLength / tileSize; // in meters per pixel\r\n\r\n const cosLatitude = Math.cos(latitude);\r\n for (let zoom = startZoom; zoom<= endZoom; zoom++) {\r\n const resolution = zoom0Resolution * cosLatitude / Math.pow(2, zoom);\r\n const scale = screenDpi * inchPerMeter * resolution;\r\n results.push({zoom, resolution, scale});\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Match the provided minScale, maxScale values to corresponding wgs84 zoom levels\r\n * @param defaultMaxLod Value of the last LOD (i.e 22)\r\n * @param tileSize Size of a tile in pixels (i.e 256)\r\n * @param minScale Minimum scale value that needs to be matched to a LOD level\r\n * @param maxScale Maximum scale value that needs to be matched to a LOD level\r\n * @returns minLod: LOD value matching minScale, maxLod: LOD value matching maxScale\r\n */\r\n public static getZoomLevelsScales( defaultMaxLod: number, tileSize: number, minScale?: number, maxScale?: number, tolerance: number = 0): {minLod?: number, maxLod?: number} {\r\n\r\n let minLod: number|undefined, maxLod: number|undefined;\r\n\r\n const zoomScales = ArcGisUtilities.computeZoomLevelsScales(0, defaultMaxLod, 0 /* latitude 0 = Equator*/, tileSize);\r\n\r\n if (zoomScales.length > 0) {\r\n\r\n if (minScale) {\r\n minLod = 0;\r\n // We are looking for the largest scale value with a scale value smaller than minScale\r\n for (; minLod < zoomScales.length && (zoomScales[minLod].scale > minScale && Math.abs(zoomScales[minLod].scale - minScale) > tolerance); minLod++)\r\n ;\r\n\r\n }\r\n\r\n if (maxScale) {\r\n maxLod = defaultMaxLod;\r\n // We are looking for the smallest scale value with a value greater than maxScale\r\n for (; maxLod >= 0 && zoomScales[maxLod].scale < maxScale && Math.abs(zoomScales[maxLod].scale - maxScale) > tolerance; maxLod--)\r\n ;\r\n }\r\n }\r\n return {minLod, maxLod};\r\n }\r\n\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"ArcGisUtilities.js","sourceRoot":"","sources":["../../../../src/tile/map/ArcGisUtilities.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { Angle, Constant } from \"@itwin/core-geometry\";\r\nimport { MapSubLayerProps } from \"@itwin/core-common\";\r\nimport { MapCartoRectangle, MapLayerAccessClient, MapLayerAccessToken, MapLayerAccessTokenParams, MapLayerSource, MapLayerSourceStatus, MapLayerSourceValidation, ValidateSourceArgs} from \"../internal\";\r\nimport { IModelApp } from \"../../IModelApp\";\r\nimport { headersIncludeAuthMethod } from \"../../request/utils\";\r\n\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\n/**\r\n * Class representing an ArcGIS error code.\r\n * @internal\r\n */\r\nexport enum ArcGisErrorCode {\r\n InvalidCredentials = 401,\r\n InvalidToken = 498,\r\n TokenRequired = 499,\r\n UnknownError = 1000,\r\n NoTokenService = 1001,\r\n}\r\n\r\n/**\r\n * Class representing an ArcGIS service metadata.\r\n * @internal\r\n */\r\nexport interface ArcGISServiceMetadata {\r\n /** JSON content from the service */\r\n content: any;\r\n\r\n /** Indicates if an access token is required to access the service */\r\n accessTokenRequired: boolean;\r\n}\r\n\r\n/** Arguments for validating ArcGIS sources\r\n * @internal\r\n */\r\nexport interface ArcGisValidateSourceArgs extends ValidateSourceArgs {\r\n /** List of capabilities 'keyword' that needs to be advertised in the service's metadata in order to be valid. For example: 'Map', 'Query', etc*/\r\n capabilitiesFilter: string[];\r\n}\r\n\r\n/** Arguments for fetching service metadata\r\n * @internal\r\n */\r\nexport interface ArcGisGetServiceJsonArgs {\r\n url: string;\r\n formatId: string;\r\n userName?: string;\r\n password?: string;\r\n queryParams?: {[key: string]: string};\r\n ignoreCache?: boolean;\r\n requireToken?: boolean;\r\n}\r\n\r\n/**\r\n * Class containing utilities relating to ArcGIS services and coordinate systems.\r\n * @internal\r\n */\r\nexport class ArcGisUtilities {\r\n\r\n private static getBBoxString(range?: MapCartoRectangle) {\r\n if (!range)\r\n range = MapCartoRectangle.createMaximum();\r\n\r\n return `${range.low.x * Angle.degreesPerRadian},${range.low.y * Angle.degreesPerRadian},${range.high.x * Angle.degreesPerRadian},${range.high.y * Angle.degreesPerRadian}`;\r\n }\r\n\r\n public static async getNationalMapSources(): Promise<MapLayerSource[]> {\r\n const sources = new Array<MapLayerSource>();\r\n const response = await fetch(\"https://viewer.nationalmap.gov/tnmaccess/api/getMapServiceList\", { method: \"GET\" });\r\n const services = await response.json();\r\n\r\n if (!Array.isArray(services))\r\n return sources;\r\n\r\n for (const service of services) {\r\n if (service.wmsUrl.length === 0) // Exclude Wfs..\r\n continue;\r\n switch (service.serviceType) {\r\n case \"ArcGIS\":\r\n sources.push(MapLayerSource.fromJSON({ name: service.displayName, url: service.serviceLink, formatId: \"ArcGIS\" })!);\r\n break;\r\n default: {\r\n const wmsIndex = service.wmsUrl.lastIndexOf(\"/wms\");\r\n if (wmsIndex > 0) {\r\n const url = service.wmsUrl.slice(0, wmsIndex + 4);\r\n sources.push(MapLayerSource.fromJSON({ name: service.displayName, url, formatId: \"WMS\" })!);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n return sources;\r\n }\r\n\r\n public static async getServiceDirectorySources(url: string, baseUrl?: string): Promise<MapLayerSource[]> {\r\n if (undefined === baseUrl)\r\n baseUrl = url;\r\n let sources = new Array<MapLayerSource>();\r\n const response = await fetch(`${url}?f=json`, { method: \"GET\" });\r\n const json = await response.json();\r\n if (json !== undefined) {\r\n if (Array.isArray(json.folders)) {\r\n for (const folder of json.folders) {\r\n sources = sources.concat(await ArcGisUtilities.getServiceDirectorySources(`${url}/${folder}`, url));\r\n }\r\n }\r\n if (Array.isArray(json.services)) {\r\n for (const service of json.services) {\r\n let source;\r\n if (service.type === \"MapServer\")\r\n source = MapLayerSource.fromJSON({ name: service.name, url: `${baseUrl}/${service.name}/MapServer`, formatId: \"ArcGIS\" });\r\n else if (service.type === \"ImageServer\")\r\n source = MapLayerSource.fromJSON({ name: service.name, url: `${baseUrl}/${service.name}/ImageServer`, formatId: \"ArcGIS\" });\r\n if (source)\r\n sources.push(source);\r\n }\r\n }\r\n }\r\n\r\n return sources;\r\n }\r\n\r\n /**\r\n * Get map layer sources from an ArcGIS query.\r\n * @param range Range for the query.\r\n * @param url URL for the query.\r\n * @returns List of map layer sources.\r\n */\r\n public static async getSourcesFromQuery(range?: MapCartoRectangle, url = \"https://usgs.maps.arcgis.com/sharing/rest/search\"): Promise<MapLayerSource[]> {\r\n const sources = new Array<MapLayerSource>();\r\n for (let start = 1; start > 0;) {\r\n const response = await fetch(`${url}?f=json&q=(group:9d1199a521334e77a7d15abbc29f8144) AND (type:\"Map Service\")&bbox=${ArcGisUtilities.getBBoxString(range)}&sortOrder=desc&start=${start}&num=100`, { method: \"GET\" });\r\n const json = await response.json();\r\n if (!json)\r\n break;\r\n\r\n start = json.nextStart ? json.nextStart : -1;\r\n if (json !== undefined && Array.isArray(json.results)) {\r\n for (const result of json.results) {\r\n const source = MapLayerSource.fromJSON({ name: result.name ? result.name : result.title, url: result.url, formatId: \"ArcGIS\" });\r\n if (source)\r\n sources.push(source);\r\n }\r\n }\r\n }\r\n\r\n return sources;\r\n }\r\n\r\n /**\r\n * Parse the URL to check if it represents a valid ArcGIS service\r\n * @param url URL to validate.\r\n * @param serviceType Service type to validate (i.e FeatureServer, MapServer)\r\n * @return Validation Status.\r\n */\r\n public static validateUrl(url: string, serviceType: string): MapLayerSourceStatus {\r\n const urlObj = new URL(url.toLowerCase());\r\n if (urlObj.pathname.includes(\"/rest/services/\")) {\r\n // This seem to be an ArcGIS URL, lets check the service type\r\n if (urlObj.pathname.endsWith(`${serviceType.toLowerCase()}`)) {\r\n return MapLayerSourceStatus.Valid;\r\n } else {\r\n return MapLayerSourceStatus.IncompatibleFormat;\r\n }\r\n } else {\r\n return MapLayerSourceStatus.InvalidUrl;\r\n }\r\n }\r\n\r\n /**\r\n * Attempt to access an ArcGIS service, and validate its service metadata.\r\n * @param source Source to validate.\r\n * @param opts Validation options\r\n */\r\n public static async validateSource(args: ArcGisValidateSourceArgs): Promise<MapLayerSourceValidation> {\r\n const {source, ignoreCache, capabilitiesFilter} = args;\r\n const metadata = await this.getServiceJson({url: source.url, formatId: source.formatId, userName: source.userName, password: source.password, queryParams: source.collectQueryParams(), ignoreCache});\r\n const json = metadata?.content;\r\n if (json === undefined) {\r\n return { status: MapLayerSourceStatus.InvalidUrl };\r\n } else if (json.error !== undefined) {\r\n\r\n // If we got a 'Token Required' error, lets check what authentification methods this ESRI service offers\r\n // and return information needed to initiate the authentification process... the end-user\r\n // will have to provide his credentials before we can fully validate this source.\r\n if (json.error.code === ArcGisErrorCode.TokenRequired) {\r\n return (source.userName || source.password) ? {status: MapLayerSourceStatus.InvalidCredentials} : {status: MapLayerSourceStatus.RequireAuth};\r\n } else if (json.error.code === ArcGisErrorCode.InvalidCredentials)\r\n return { status: MapLayerSourceStatus.InvalidCredentials};\r\n }\r\n\r\n // Check this service support the expected queries\r\n let hasCapabilities = false;\r\n let capsArray: string[] = [];\r\n if (json.capabilities && typeof json.capabilities === \"string\" ) {\r\n const capabilities: string = json.capabilities;\r\n capsArray = capabilities.split(\",\").map((entry) => entry.toLowerCase());\r\n\r\n const filtered = capsArray.filter((element, _index, _array) => capabilitiesFilter.includes(element));\r\n hasCapabilities = (filtered.length === capabilitiesFilter.length);\r\n }\r\n if (!hasCapabilities) {\r\n return { status: MapLayerSourceStatus.InvalidFormat};\r\n }\r\n\r\n // Only EPSG:3857 is supported with pre-rendered tiles.\r\n if (json.tileInfo && capsArray.includes(\"tilesonly\") && !ArcGisUtilities.isEpsg3857Compatible(json.tileInfo)) {\r\n return { status: MapLayerSourceStatus.InvalidCoordinateSystem};\r\n }\r\n\r\n let subLayers;\r\n if (json.layers) {\r\n\r\n subLayers = new Array<MapSubLayerProps>();\r\n\r\n for (const layer of json.layers) {\r\n const parent = layer.parentLayerId < 0 ? undefined : layer.parentLayerId;\r\n const children = Array.isArray(layer.subLayerIds) ? layer.subLayerIds : undefined;\r\n subLayers.push({ name: layer.name, visible: layer.defaultVisibility !== false, id: layer.id, parent, children });\r\n }\r\n }\r\n return { status: MapLayerSourceStatus.Valid, subLayers };\r\n }\r\n\r\n /** Validate MapService tiling metadata and checks if the tile tree is 'Google Maps' compatible. */\r\n public static isEpsg3857Compatible(tileInfo: any) {\r\n if (tileInfo.spatialReference?.latestWkid !== 3857 || !Array.isArray(tileInfo.lods))\r\n return false;\r\n\r\n const zeroLod = tileInfo.lods[0];\r\n return zeroLod.level === 0 && Math.abs(zeroLod.resolution - 156543.03392800014) < .001;\r\n }\r\n\r\n private static _serviceCache = new Map<string, ArcGISServiceMetadata|undefined>();\r\n\r\n /**\r\n * Fetches an ArcGIS service metadata, and returns its JSON representation.\r\n * If an access client has been configured for the specified formatId,\r\n * it will be used to apply required security token.\r\n * By default, response for each URL are cached.\r\n * @param url URL of the ArcGIS service\r\n * @param formatId Format ID of the service\r\n * @param userName Username to use for legacy token based security\r\n * @param password Password to use for legacy token based security\r\n * @param ignoreCache Flag to skip cache lookup (i.e. force a new server request)\r\n * @param requireToken Flag to indicate if a token is required\r\n */\r\n\r\n public static async getServiceJson(args: ArcGisGetServiceJsonArgs): Promise<ArcGISServiceMetadata|undefined> {\r\n const {url, formatId, userName, password, queryParams, ignoreCache, requireToken} = args;\r\n if (!ignoreCache) {\r\n const cached = ArcGisUtilities._serviceCache.get(url);\r\n if (cached !== undefined)\r\n return cached;\r\n }\r\n const appendParams = (urlObj: URL, params?: {[key: string]: string}) => {\r\n if (params) {\r\n Object.keys(params).forEach((paramKey) => {\r\n if (!urlObj.searchParams.has(paramKey))\r\n urlObj.searchParams.append(paramKey, params[paramKey]);\r\n });\r\n }\r\n };\r\n\r\n const createUrlObj = () => {\r\n const tmpUrl = new URL(url);\r\n tmpUrl.searchParams.append(\"f\", \"json\");\r\n appendParams(tmpUrl, queryParams);\r\n return tmpUrl;\r\n };\r\n\r\n let accessTokenRequired = false;\r\n try {\r\n let tmpUrl = createUrlObj();\r\n\r\n // In some cases, caller might already know token is required, so append it immediately\r\n if (requireToken) {\r\n const accessClient = IModelApp.mapLayerFormatRegistry.getAccessClient(formatId);\r\n if (accessClient) {\r\n accessTokenRequired = true;\r\n await ArcGisUtilities.appendSecurityToken(tmpUrl, accessClient, {mapLayerUrl: new URL(url), userName, password});\r\n }\r\n }\r\n let response = await fetch(tmpUrl.toString(), { method: \"GET\" });\r\n if (response.status === 401 && !requireToken && headersIncludeAuthMethod(response.headers, [\"ntlm\", \"negotiate\"])) {\r\n // We got a http 401 challenge, lets try again with SSO enabled (i.e. Windows Authentication)\r\n response = await fetch(url, {method: \"GET\", credentials: \"include\" });\r\n }\r\n\r\n // Append security token when corresponding error code is returned by ArcGIS service\r\n let errorCode = await ArcGisUtilities.checkForResponseErrorCode(response);\r\n if (!accessTokenRequired\r\n && errorCode !== undefined\r\n && errorCode === ArcGisErrorCode.TokenRequired ) {\r\n accessTokenRequired = true;\r\n // If token required\r\n const accessClient = IModelApp.mapLayerFormatRegistry.getAccessClient(formatId);\r\n if (accessClient) {\r\n tmpUrl = createUrlObj();\r\n await ArcGisUtilities.appendSecurityToken(tmpUrl, accessClient, {mapLayerUrl: new URL(url), userName, password});\r\n response = await fetch(tmpUrl.toString(), { method: \"GET\" });\r\n errorCode = await ArcGisUtilities.checkForResponseErrorCode(response);\r\n }\r\n }\r\n\r\n const json = await response.json();\r\n const info = {content: json, accessTokenRequired};\r\n // Cache the response only if it doesn't contain any error.\r\n ArcGisUtilities._serviceCache.set(url, (errorCode === undefined ? info : undefined));\r\n return info; // Always return json, even though it contains an error code.\r\n\r\n } catch (_error) {\r\n ArcGisUtilities._serviceCache.set(url, undefined);\r\n return undefined;\r\n }\r\n }\r\n\r\n /** Read a response from ArcGIS server and check for error code in the response. */\r\n public static async checkForResponseErrorCode(response: Response) {\r\n const tmpResponse = response;\r\n if (response.headers && tmpResponse.headers.get(\"content-type\")?.toLowerCase().includes(\"json\")) {\r\n\r\n try {\r\n // Note:\r\n // Since response stream can only be read once (i.e. calls to .json() method)\r\n // we have to clone the response object in order to check for potential error code,\r\n // but still keep the response stream as unread.\r\n const clonedResponse = tmpResponse.clone();\r\n const json = await clonedResponse.json();\r\n if (json?.error?.code !== undefined)\r\n return json?.error?.code as number;\r\n } catch { }\r\n\r\n }\r\n return undefined;\r\n }\r\n\r\n // return the appended access token if available.\r\n public static async appendSecurityToken(url: URL, accessClient: MapLayerAccessClient, accessTokenParams: MapLayerAccessTokenParams): Promise<MapLayerAccessToken|undefined> {\r\n\r\n // Append security token if available\r\n let accessToken: MapLayerAccessToken|undefined;\r\n try {\r\n accessToken = await accessClient.getAccessToken(accessTokenParams);\r\n } catch {}\r\n\r\n if (accessToken?.token) {\r\n url.searchParams.append(\"token\", accessToken.token);\r\n return accessToken;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Compute scale, resolution values for requested zoom levels (WSG 84)\r\n * Use a scale of 96 dpi for Google Maps scales\r\n * Based on this article: https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Resolution_and_Scale\r\n * @param startZoom Zoom level where scales begins to be computed\r\n * @param endZoom Zoom level where scales ends to be computed\r\n * @param latitude Latitude in degrees to use to compute scales (i.e 0 for Equator)\r\n * @param tileSize Size of a tile in pixels (i.e 256)\r\n * @param screenDpi Monitor resolution in dots per inch (i.e. typically 96dpi is used by Google Maps)\r\n * @returns An array containing resolution and scale values for each requested zoom level\r\n */\r\n public static computeZoomLevelsScales(startZoom: number = 0, endZoom: number = 20, latitude: number = 0, tileSize: number = 256, screenDpi = 96): {zoom: number, resolution: number, scale: number}[] {\r\n // Note: There is probably a more direct way to compute this, but I prefer to go for a simple and well documented approach.\r\n if (startZoom <0 || endZoom < startZoom || tileSize < 0 || screenDpi < 1 || latitude < -90 || latitude > 90)\r\n return [];\r\n\r\n const inchPerMeter = 1 / 0.0254;\r\n const results: {zoom: number, resolution: number, scale: number}[] = [];\r\n const equatorLength = Constant.earthRadiusWGS84.equator * 2 * Math.PI;\r\n const zoom0Resolution = equatorLength / tileSize; // in meters per pixel\r\n\r\n const cosLatitude = Math.cos(latitude);\r\n for (let zoom = startZoom; zoom<= endZoom; zoom++) {\r\n const resolution = zoom0Resolution * cosLatitude / Math.pow(2, zoom);\r\n const scale = screenDpi * inchPerMeter * resolution;\r\n results.push({zoom, resolution, scale});\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Match the provided minScale, maxScale values to corresponding wgs84 zoom levels\r\n * @param defaultMaxLod Value of the last LOD (i.e 22)\r\n * @param tileSize Size of a tile in pixels (i.e 256)\r\n * @param minScale Minimum scale value that needs to be matched to a LOD level\r\n * @param maxScale Maximum scale value that needs to be matched to a LOD level\r\n * @returns minLod: LOD value matching minScale, maxLod: LOD value matching maxScale\r\n */\r\n public static getZoomLevelsScales( defaultMaxLod: number, tileSize: number, minScale?: number, maxScale?: number, tolerance: number = 0): {minLod?: number, maxLod?: number} {\r\n\r\n let minLod: number|undefined, maxLod: number|undefined;\r\n\r\n const zoomScales = ArcGisUtilities.computeZoomLevelsScales(0, defaultMaxLod, 0 /* latitude 0 = Equator*/, tileSize);\r\n\r\n if (zoomScales.length > 0) {\r\n\r\n if (minScale) {\r\n minLod = 0;\r\n // We are looking for the largest scale value with a scale value smaller than minScale\r\n for (; minLod < zoomScales.length && (zoomScales[minLod].scale > minScale && Math.abs(zoomScales[minLod].scale - minScale) > tolerance); minLod++)\r\n ;\r\n\r\n }\r\n\r\n if (maxScale) {\r\n maxLod = defaultMaxLod;\r\n // We are looking for the smallest scale value with a value greater than maxScale\r\n for (; maxLod >= 0 && zoomScales[maxLod].scale < maxScale && Math.abs(zoomScales[maxLod].scale - maxScale) > tolerance; maxLod--)\r\n ;\r\n }\r\n }\r\n return {minLod, maxLod};\r\n }\r\n\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArcGISImageryProvider.d.ts","sourceRoot":"","sources":["../../../../../src/tile/map/ImageryProviders/ArcGISImageryProvider.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAmB,qBAAqB,EAAmB,oBAAoB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ArcGISImageryProvider.d.ts","sourceRoot":"","sources":["../../../../../src/tile/map/ImageryProviders/ArcGISImageryProvider.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAmB,qBAAqB,EAAmB,oBAAoB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAK5L;;;;;;GAMG;AACH,8BAAsB,qBAAsB,SAAQ,uBAAuB;IAEzE,SAAS,CAAC,aAAa,EAAE,oBAAoB,GAAC,SAAS,CAAC;IACxD,SAAS,CAAC,gBAAgB,EAAE,mBAAmB,GAAC,SAAS,CAAC;IAE1D;;MAEE;IACF,SAAS,CAAC,oBAAoB,UAAS;IAEvC,SAAS,CAAC,eAAe,UAAS;IAElC,IAAoB,sBAAsB,YAAkC;gBAEhE,QAAQ,EAAE,qBAAqB,EAAE,eAAe,EAAE,OAAO;IAKrE;;SAEK;cACc,eAAe,CAAC,MAAM,EAAE,6BAA6B;IAaxE;;;MAGE;cACc,cAAc;IAuB9B;;;;;OAKG;cACa,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW;CA+FtD"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import { ArcGisErrorCode, ArcGisUtilities, MapLayerImageryProvider, MapLayerImageryProviderStatus } from "../../internal";
|
|
9
9
|
import { IModelApp } from "../../../IModelApp";
|
|
10
10
|
import { NotifyMessageDetails, OutputMessagePriority } from "../../../NotificationManager";
|
|
11
|
+
import { headersIncludeAuthMethod } from "../../../request/utils";
|
|
11
12
|
/** Base class for ArcGIS map-layer imagery providers.
|
|
12
13
|
*
|
|
13
14
|
* The initial purpose of this class is to offer shared methods
|
|
@@ -87,50 +88,71 @@ export class ArcGISImageryProvider extends MapLayerImageryProvider {
|
|
|
87
88
|
password: this._settings.password
|
|
88
89
|
});
|
|
89
90
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
if (errorCode !== undefined &&
|
|
105
|
-
(errorCode === ArcGisErrorCode.TokenRequired || errorCode === ArcGisErrorCode.InvalidToken)) {
|
|
106
|
-
if (this._settings.userName && this._settings.userName.length > 0 && this._lastAccessToken) {
|
|
107
|
-
// **** Legacy token ONLY ***
|
|
108
|
-
// Token might have expired, make a second attempt by forcing new token.
|
|
109
|
-
if (this._accessClient?.invalidateToken !== undefined && this._lastAccessToken !== undefined)
|
|
110
|
-
this._accessClient.invalidateToken(this._lastAccessToken);
|
|
111
|
-
const urlObj2 = new URL(url);
|
|
112
|
-
if (this._accessClient) {
|
|
113
|
-
try {
|
|
114
|
-
this._lastAccessToken = await ArcGisUtilities.appendSecurityToken(urlObj, this._accessClient, { mapLayerUrl: urlObj, userName: this._settings.userName, password: this._settings.password });
|
|
115
|
-
}
|
|
116
|
-
catch {
|
|
117
|
-
}
|
|
91
|
+
// We want to complete the first request before letting other requests go;
|
|
92
|
+
// this done to avoid flooding server with requests missing credentials
|
|
93
|
+
if (!this._firstRequestPromise)
|
|
94
|
+
this._firstRequestPromise = new Promise((resolve) => this.onFirstRequestCompleted.addOnce(() => resolve()));
|
|
95
|
+
else
|
|
96
|
+
await this._firstRequestPromise;
|
|
97
|
+
let response;
|
|
98
|
+
try {
|
|
99
|
+
response = await fetch(urlObj.toString(), { ...options, credentials: this._includeUserCredentials ? "include" : undefined });
|
|
100
|
+
if (response.status === 401 && !this._lastAccessToken && headersIncludeAuthMethod(response.headers, ["ntlm", "negotiate"])) {
|
|
101
|
+
// We got a http 401 challenge, lets try again with SSO enabled (i.e. Windows Authentication)
|
|
102
|
+
response = await fetch(url, { ...options, credentials: "include" });
|
|
103
|
+
if (response.status === 200) {
|
|
104
|
+
this._includeUserCredentials = true; // avoid going through 401 challenges over and over
|
|
118
105
|
}
|
|
119
|
-
// Make a second attempt with refreshed token
|
|
120
|
-
response = await fetch(urlObj2.toString(), options);
|
|
121
|
-
errorCode = await ArcGisUtilities.checkForResponseErrorCode(response);
|
|
122
106
|
}
|
|
123
|
-
if (
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
107
|
+
if ((this._lastAccessToken && response.status === 400)
|
|
108
|
+
|| response.headers.get("content-type")?.toLowerCase().includes("htm")) {
|
|
109
|
+
// For some reasons when we make a request with the fetch() api and there is a token error
|
|
110
|
+
// we receive a status 400 instead of proper json response. (i.e doing the same request in the browser gives a different response)
|
|
111
|
+
// For some other request, we also seen error message in html.
|
|
112
|
+
// When it occurs, we fall back to root service request so we get a proper JSON response with error code.
|
|
113
|
+
const tmpUrl = new URL(this._settings.url);
|
|
114
|
+
if (this._lastAccessToken && this._accessTokenRequired)
|
|
115
|
+
tmpUrl.searchParams.append("token", this._lastAccessToken.token);
|
|
116
|
+
tmpUrl.searchParams.append("f", "json");
|
|
117
|
+
response = await fetch(tmpUrl.toString(), options);
|
|
118
|
+
}
|
|
119
|
+
errorCode = await ArcGisUtilities.checkForResponseErrorCode(response);
|
|
120
|
+
if (errorCode !== undefined &&
|
|
121
|
+
(errorCode === ArcGisErrorCode.TokenRequired || errorCode === ArcGisErrorCode.InvalidToken)) {
|
|
122
|
+
if (this._settings.userName && this._settings.userName.length > 0 && this._lastAccessToken) {
|
|
123
|
+
// **** Legacy token ONLY ***
|
|
124
|
+
// Token might have expired, make a second attempt by forcing new token.
|
|
125
|
+
if (this._accessClient?.invalidateToken !== undefined && this._lastAccessToken !== undefined)
|
|
126
|
+
this._accessClient.invalidateToken(this._lastAccessToken);
|
|
127
|
+
const urlObj2 = new URL(url);
|
|
128
|
+
if (this._accessClient) {
|
|
129
|
+
try {
|
|
130
|
+
this._lastAccessToken = await ArcGisUtilities.appendSecurityToken(urlObj, this._accessClient, { mapLayerUrl: urlObj, userName: this._settings.userName, password: this._settings.password });
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Make a second attempt with refreshed token
|
|
136
|
+
response = await fetch(urlObj2.toString(), options);
|
|
137
|
+
errorCode = await ArcGisUtilities.checkForResponseErrorCode(response);
|
|
138
|
+
}
|
|
139
|
+
if (errorCode === ArcGisErrorCode.TokenRequired || errorCode === ArcGisErrorCode.InvalidToken) {
|
|
140
|
+
// Looks like the initially generated token has expired.
|
|
141
|
+
if (this.status === MapLayerImageryProviderStatus.Valid) {
|
|
142
|
+
// Only report new status change to avoid spamming the UI
|
|
143
|
+
this.setStatus(MapLayerImageryProviderStatus.RequireAuth);
|
|
144
|
+
this.onStatusChanged.raiseEvent(this);
|
|
145
|
+
const msg = IModelApp.localization.getLocalizedString("iModelJs:MapLayers.Messages.FetchTooltipTokenError", { layerName: this._settings.name });
|
|
146
|
+
IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Warning, msg));
|
|
147
|
+
}
|
|
131
148
|
}
|
|
132
149
|
}
|
|
133
150
|
}
|
|
151
|
+
finally {
|
|
152
|
+
this.onFirstRequestCompleted.raiseEvent();
|
|
153
|
+
}
|
|
154
|
+
if (response === undefined)
|
|
155
|
+
throw new Error("fetch call failed");
|
|
134
156
|
return response;
|
|
135
157
|
}
|
|
136
158
|
}
|