@itwin/map-layers-formats 3.5.0-dev.51 → 3.5.0-dev.53

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.
Files changed (71) hide show
  1. package/.rush/temp/operation/build_ci/state.json +1 -1
  2. package/.rush/temp/operation/docs/state.json +1 -1
  3. package/.rush/temp/package-deps_build_ci.json +7 -7
  4. package/.rush/temp/package-deps_docs.json +7 -7
  5. package/lib/cjs/ArcGisFeature/ArcGisFeatureProvider.d.ts.map +1 -1
  6. package/lib/cjs/ArcGisFeature/ArcGisFeatureProvider.js +39 -17
  7. package/lib/cjs/ArcGisFeature/ArcGisFeatureProvider.js.map +1 -1
  8. package/lib/cjs/ArcGisFeature/ArcGisFeatureQuery.d.ts +0 -1
  9. package/lib/cjs/ArcGisFeature/ArcGisFeatureQuery.d.ts.map +1 -1
  10. package/lib/cjs/ArcGisFeature/ArcGisFeatureQuery.js +19 -27
  11. package/lib/cjs/ArcGisFeature/ArcGisFeatureQuery.js.map +1 -1
  12. package/lib/cjs/ArcGisFeature/ArcGisSymbologyRenderer.d.ts.map +1 -1
  13. package/lib/cjs/ArcGisFeature/ArcGisSymbologyRenderer.js +14 -11
  14. package/lib/cjs/ArcGisFeature/ArcGisSymbologyRenderer.js.map +1 -1
  15. package/lib/cjs/test/ArcGisFeature/ArcGisFeatureProvider.test.js +34 -10
  16. package/lib/cjs/test/ArcGisFeature/ArcGisFeatureProvider.test.js.map +1 -1
  17. package/lib/cjs/test/ArcGisFeature/ArcGisFeatureQuery.test.js +4 -9
  18. package/lib/cjs/test/ArcGisFeature/ArcGisFeatureQuery.test.js.map +1 -1
  19. package/lib/cjs/test/ArcGisFeature/ArcGisSymbologyRenderer.test.js +5 -5
  20. package/lib/cjs/test/ArcGisFeature/ArcGisSymbologyRenderer.test.js.map +1 -1
  21. package/lib/cjs/test/coverage/.nyc_output/{c8c8cab6-1a13-4b72-94f2-ab73ed9c126a.json → a7dcd2f7-e863-4162-8e25-d27e4921dfcc.json} +0 -0
  22. package/lib/cjs/test/coverage/.nyc_output/e498035c-a52d-4af9-b4fb-0a5c3a75efa3.json +1 -0
  23. package/lib/cjs/test/coverage/.nyc_output/processinfo/a7dcd2f7-e863-4162-8e25-d27e4921dfcc.json +1 -0
  24. package/lib/cjs/test/coverage/.nyc_output/processinfo/e498035c-a52d-4af9-b4fb-0a5c3a75efa3.json +1 -0
  25. package/lib/cjs/test/coverage/.nyc_output/processinfo/index.json +1 -1
  26. package/lib/cjs/test/coverage/cobertura-coverage.xml +390 -387
  27. package/lib/cjs/test/coverage/lcov-report/index.html +18 -18
  28. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisFeatureFormat.ts.html +1 -1
  29. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisFeatureJSON.ts.html +5 -5
  30. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisFeaturePBF.ts.html +9 -9
  31. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisFeatureProvider.ts.html +146 -74
  32. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisFeatureQuery.ts.html +32 -62
  33. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisFeatureReader.ts.html +1 -1
  34. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisFeatureRenderer.ts.html +1 -1
  35. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisFeatureResponse.ts.html +1 -1
  36. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/ArcGisSymbologyRenderer.ts.html +64 -55
  37. package/lib/cjs/test/coverage/lcov-report/src/ArcGisFeature/index.html +29 -29
  38. package/lib/cjs/test/coverage/lcov-report/src/index.html +1 -1
  39. package/lib/cjs/test/coverage/lcov-report/src/map-layers-formats.ts.html +1 -1
  40. package/lib/cjs/test/coverage/lcov-report/src/mapLayersFormats.ts.html +1 -1
  41. package/lib/cjs/test/coverage/lcov.info +637 -612
  42. package/lib/cjs/tsconfig.tsbuildinfo +1 -1
  43. package/lib/esm/ArcGisFeature/ArcGisFeatureProvider.d.ts.map +1 -1
  44. package/lib/esm/ArcGisFeature/ArcGisFeatureProvider.js +41 -19
  45. package/lib/esm/ArcGisFeature/ArcGisFeatureProvider.js.map +1 -1
  46. package/lib/esm/ArcGisFeature/ArcGisFeatureQuery.d.ts +0 -1
  47. package/lib/esm/ArcGisFeature/ArcGisFeatureQuery.d.ts.map +1 -1
  48. package/lib/esm/ArcGisFeature/ArcGisFeatureQuery.js +19 -27
  49. package/lib/esm/ArcGisFeature/ArcGisFeatureQuery.js.map +1 -1
  50. package/lib/esm/ArcGisFeature/ArcGisSymbologyRenderer.d.ts.map +1 -1
  51. package/lib/esm/ArcGisFeature/ArcGisSymbologyRenderer.js +14 -11
  52. package/lib/esm/ArcGisFeature/ArcGisSymbologyRenderer.js.map +1 -1
  53. package/lib/esm/test/ArcGisFeature/ArcGisFeatureProvider.test.js +34 -10
  54. package/lib/esm/test/ArcGisFeature/ArcGisFeatureProvider.test.js.map +1 -1
  55. package/lib/esm/test/ArcGisFeature/ArcGisFeatureQuery.test.js +4 -9
  56. package/lib/esm/test/ArcGisFeature/ArcGisFeatureQuery.test.js.map +1 -1
  57. package/lib/esm/test/ArcGisFeature/ArcGisSymbologyRenderer.test.js +6 -6
  58. package/lib/esm/test/ArcGisFeature/ArcGisSymbologyRenderer.test.js.map +1 -1
  59. package/lib/esm/tsconfig.tsbuildinfo +1 -1
  60. package/lib/test/junit_results.xml +43 -45
  61. package/map-layers-formats.build.log +2 -2
  62. package/package.json +12 -12
  63. package/src/ArcGisFeature/ArcGisFeatureProvider.ts +39 -15
  64. package/src/ArcGisFeature/ArcGisFeatureQuery.ts +20 -30
  65. package/src/ArcGisFeature/ArcGisSymbologyRenderer.ts +15 -12
  66. package/src/test/ArcGisFeature/ArcGisFeatureProvider.test.ts +39 -10
  67. package/src/test/ArcGisFeature/ArcGisFeatureQuery.test.ts +4 -11
  68. package/src/test/ArcGisFeature/ArcGisSymbologyRenderer.test.ts +5 -5
  69. package/lib/cjs/test/coverage/.nyc_output/20fab392-54c0-4c77-9557-835e118f017b.json +0 -1
  70. package/lib/cjs/test/coverage/.nyc_output/processinfo/20fab392-54c0-4c77-9557-835e118f017b.json +0 -1
  71. package/lib/cjs/test/coverage/.nyc_output/processinfo/c8c8cab6-1a13-4b72-94f2-ab73ed9c126a.json +0 -1
@@ -96,13 +96,13 @@ class ArcGisSymbologyRenderer {
96
96
  if (this._symbol === undefined) {
97
97
  core_bentley_1.Logger.logWarning(loggerCategory, "Symbology definition not supported, using default symbology");
98
98
  if (geometryType === "esriGeometryPoint" || geometryType === "esriGeometryMultipoint") {
99
- this._symbol = ArcGisSymbologyRenderer.defaultPMS;
99
+ this._symbol = EsriPMS.fromJSON(ArcGisSymbologyRenderer.defaultPMS);
100
100
  }
101
101
  else if (geometryType === "esriGeometryLine" || geometryType === "esriGeometryPolyline") {
102
- this._symbol = ArcGisSymbologyRenderer.defaultSLS;
102
+ this._symbol = EsriSLS.fromJSON(ArcGisSymbologyRenderer.defaultSLS);
103
103
  }
104
104
  else if (geometryType === "esriGeometryPolygon") {
105
- this._symbol = ArcGisSymbologyRenderer.defaultSFS;
105
+ this._symbol = EsriSFS.fromJSON(ArcGisSymbologyRenderer.defaultSFS);
106
106
  }
107
107
  else {
108
108
  core_bentley_1.Logger.logError(loggerCategory, "Could not determine default symbology: geometry type not supported");
@@ -152,12 +152,13 @@ class ArcGisSymbologyRenderer {
152
152
  let xOffset = 0, yOffset = 0;
153
153
  if (pms.xoffset)
154
154
  xOffset = pms.xoffset;
155
+ else if (pms.width)
156
+ xOffset = pms.width * -0.5; // if no offset center in the middle
155
157
  if (pms.yoffset)
156
158
  yOffset = pms.yoffset;
159
+ else if (pms.height)
160
+ yOffset = pms.height * -0.5; // if no offset center in the middle
157
161
  if (pms.width && pms.height) {
158
- // // make sure the marker is centered on the point
159
- xOffset += pms.width * -0.5;
160
- yOffset += pms.height * -0.5;
161
162
  context.drawImage(pms.image, ptX + xOffset, ptY + yOffset, pms.width, pms.height);
162
163
  }
163
164
  else {
@@ -172,19 +173,21 @@ ArcGisSymbologyRenderer.defaultPMS = {
172
173
  type: "esriPMS",
173
174
  url: "",
174
175
  contentType: "image/png",
175
- imageData: "iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAT9JREFUOI2t1E8rRGEUx/HvMHViIm5ZXGt/3gFlwdKGhYjyAmxs7IassDHFyguwwkbZYJKNslVWJDZT1C3psRv9NMpmJk/Tvc3MHWf3/PuccxbPyfKPkW1wPmBmQ5L6giB4d849Al+tYjNAHpiQ1AHgnAMoA+dhGG5HUfTQCOsCDoGlhCTdwGIURfPVZPtJWCdwBkwntVF3d6+K78Rh+SYhP7bM7FbSjY8FwHqLEEBGUgEY97E5oCcFBjAGDAMvNWwyJVSLKR8L28QG4a/N7zYx+VipTazkY0VgNSVUAa597MrMniWNpMBOAOdjFUlrwAWQaQFywGZt4f+AIrAB7DYJlc1sQdJrHAZQAN6AA6A/STGzp1wut+ycu/f340bQEXAJrACzwCjQC3wAd8CppGNJP/UPk+bZZ7XKQlJ1cfEL1AZaAcKna+kAAAAASUVORK5CYII=",
176
- width: 14,
177
- height: 14,
176
+ imageData: "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAmBJREFUOE+Nk01IVFEUx//n3jfvOZOaJkMtiiJ7o9RG3LgoqKhFSFJBTS1ahFBBi0ijfJXCIyQr+hBbSIsoW7iQoKKFCw2CkAI3tZAgy8Ei+xhoTCbnje/NPfHGnA816KzuPR+/c8/HJRQJE7o+VUhym0DcCOYGgBQEXjOLlyqo+nHanCkMoaL4rslKjZwOQLT4ek3Mmz3FACFNLB67ut6M1nWphbg8wI6VyJK5KEH0EQFVJRKbwzokAW++p/ErraAYSQK3u47bC3vLnA+ZB9i2gHF0oyQMCfCGNaUa+vauxs71wWz2V18cnBj8gQ8J1/eeBnHUa4sMFQDGdGno+4gwEAoQzjVUon3rqlx1KY9x7+0MWobjAPg3QJ2eZV4tAEyFNCN5FkSXyw2B3j1hRGvLcgBXMV5MptA4MOXr0gT0u5bZnAf0jBsyiSgJPAxqhON1K3FlRxUMvwFAtv7u0Wl0jvwEmJNEuOhakTt5wKEBifr6Oo14BIBRpgt07w6jcVMIngKGY7NofR5HwlF+zDcpsC193vyYB/innvHywCzdZfAR/+onX1segBTAxHzzfPE7/8yzzIPLjJE1LTixHZx5CtCK4gXLzovBiDPUsYxVM7gUkB3nWKlm6DYEnQGzXARxCOK+a1WfKtQXb6LNAvr7iCboCUA1Ocdsdv5KLPe7F6pH/w3wLbc+BwOuc5IZ1wEE/jonQbjptZn24tKKX7BgvR2r0NKZRwDvAqCI+Z30VJPTURv7P4A9psuQcYAUPwAoReBLrmX2Lmls7i8sZ7kWLwuoxA1FVJGxzMPLufi6P2r+2xFbOUjGAAAAAElFTkSuQmCC",
177
+ width: 16,
178
+ height: 16,
179
+ xoffset: -8,
180
+ yoffset: -16,
178
181
  };
179
182
  ArcGisSymbologyRenderer.defaultSLS = {
180
183
  type: "esriSLS",
181
- color: [0, 0.0],
184
+ color: [0, 0, 0, 255],
182
185
  width: 1,
183
186
  style: "esriSLSSolid",
184
187
  };
185
188
  ArcGisSymbologyRenderer.defaultSFS = {
186
189
  type: "esriSFS",
187
- color: [0, 0.0],
190
+ color: [0, 0, 0, 255],
188
191
  style: "esriSFSSolid",
189
192
  };
190
193
  //# sourceMappingURL=ArcGisSymbologyRenderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ArcGisSymbologyRenderer.js","sourceRoot":"","sources":["../../../src/ArcGisFeature/ArcGisSymbologyRenderer.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sDAA6C;AAC7C,oDAA8C;AAG9C,mDAAmD;AACnD,SAAS,cAAc,CAAC,QAAmB;IACzC,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QACrC,0CAA0C;QAC1C,OAAO,sBAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;KAChF;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,cAAc,GAAI,gCAAgC,CAAC;AAmBzD,gBAAgB;AAChB,MAAa,OAAO;IAQlB,YAAY,IAAkB;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAPD,IAAW,KAAK,KAAK,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAW,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,IAAW,KAAK,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,IAAW,KAAK,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAMxC,MAAM,CAAC,QAAQ,CAAC,IAAkB;QACvC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;CACF;AAfD,0BAeC;AAcD,gBAAgB;AAChB,MAAa,OAAO;IAgBlB,YAAY,IAAkB;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;IAClC,CAAC;IAhBD,IAAW,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,IAAW,GAAG,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,IAAW,SAAS,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IACvD,IAAW,QAAQ,KAAK,OAAO,QAAQ,IAAI,CAAC,WAAW,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACrF,IAAW,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1C,IAAW,WAAW,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAC3D,IAAW,KAAK,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,IAAW,MAAM,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACjD,IAAW,OAAO,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACnD,IAAW,OAAO,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACnD,IAAW,KAAK,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAQxC,MAAM,CAAC,QAAQ,CAAC,IAAkB;QACvC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;CACF;AAzBD,0BAyBC;AAWD,gBAAgB;AAChB,MAAa,OAAO;IAQlB,YAAY,IAAkB;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,IAAI,CAAC,OAAO;YACd,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IARD,IAAW,KAAK,KAAK,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAW,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,IAAW,KAAK,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,IAAW,OAAO,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAOvC,MAAM,CAAC,QAAQ,CAAC,IAAkB;QACvC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;CACF;AAjBD,0BAiBC;AAED,gBAAgB;AAChB,MAAa,uBAAuB;IAyBlC,YAAY,YAAuC,EAAE,kBAAuB;QAC1E,IAAI,MAAM,CAAC;QACX,IAAI,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,MAAM,MAAK,SAAS,EAAE;YAC5C,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC;SACpC;aAAM,IAAI,CAAA,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,aAAa,MAAK,SAAS,EAAE;YAC1D,MAAM,GAAG,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,aAAa,CAAC;SAC5C;QAED,IAAI,MAAM,KAAK,SAAS,EAAE;YACxB,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE;gBAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aACzC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE;gBACpC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aACzC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE;gBACpC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aACzC;SACF;QAED,8EAA8E;QAC9E,+EAA+E;QAC/E,yCAAyC;QACzC,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;YAC9B,qBAAM,CAAC,UAAU,CAAC,cAAc,EAAE,6DAA6D,CAAC,CAAC;YACjG,IAAI,YAAY,KAAK,mBAAmB,IAAI,YAAY,KAAK,wBAAwB,EAAE;gBACrF,IAAI,CAAC,OAAO,GAAG,uBAAuB,CAAC,UAAU,CAAC;aACnD;iBAAM,IAAI,YAAY,KAAK,kBAAkB,IAAI,YAAY,KAAK,sBAAsB,EAAE;gBACzF,IAAI,CAAC,OAAO,GAAG,uBAAuB,CAAC,UAAU,CAAC;aACnD;iBAAM,IAAI,YAAY,KAAK,qBAAqB,EAAE;gBACjD,IAAI,CAAC,OAAO,GAAG,uBAAuB,CAAC,UAAU,CAAC;aACnD;iBAAM;gBACL,qBAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,oEAAoE,CAAC,CAAC;aACvG;SACF;IACH,CAAC;IAEM,cAAc,CAAC,OAAiC;;QACrD,IAAI,CAAC,OAAO;YACV,OAAO;QAET,IAAI,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,IAAI,MAAK,SAAS,EAAE;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAkB,CAAC;YACpC,IAAI,GAAG,CAAC,KAAK,KAAK,cAAc,IAAI,GAAG,CAAC,KAAK,EAAE;gBAC7C,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;aAC9C;iBAAM;gBACL,OAAO,CAAC,SAAS,GAAG,sBAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAE,wBAAwB;aAC5F;SACF;IACH,CAAC;IAEM,gBAAgB,CAAC,OAAiC;;QACvD,IAAI,CAAC,OAAO;YACV,OAAO;QAET,IAAI,GAAwB,CAAC;QAC7B,IAAI,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,IAAI,MAAK,SAAS,EAAE;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAkB,CAAC;YACpC,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,cAAc,EAAE;gBACvD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC;aACnB;SACF;aAAM,IAAI,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,IAAI,MAAK,SAAS,EAAE;YAC3C,GAAG,GAAG,IAAI,CAAC,OAAkB,CAAC;SAC/B;QAED,IAAI,GAAG,EAAE;YACP,IAAI,GAAG,CAAC,KAAK;gBACX,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YACjD,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAK,yCAAyC;SAC7E;IACH,CAAC;IAEM,SAAS,CAAC,OAAiC,EAAE,GAAW,EAAE,GAAW;;QAC1E,IAAI,CAAC,OAAO;YACV,OAAO;QAET,IAAI,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,IAAI,MAAK,SAAS,EAAE;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAkB,CAAC;YACpC,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC;YAC7B,IAAI,GAAG,CAAC,OAAO;gBACb,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YACxB,IAAI,GAAG,CAAC,OAAO;gBACb,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YAExB,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE;gBAC3B,mDAAmD;gBACnD,OAAO,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC;gBAC5B,OAAO,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC;gBAE7B,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;aACnF;iBAAM;gBACL,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;aAC5D;YAED,8BAA8B;SAC/B;IACH,CAAC;;AAvHH,0DAwHC;AArHyB,kCAAU,GAAiB;IACjD,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,EAAE;IACP,WAAW,EAAE,WAAW;IACxB,SAAS,EAAE,siBAAsiB;IACjjB,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,EAAE;CACX,CAAC;AAEsB,kCAAU,GAAiB;IACjD,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC;IACf,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,cAAc;CACtB,CAAC;AAEsB,kCAAU,GAAiB;IACjD,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC;IACf,KAAK,EAAE,cAAc;CACtB,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 { Logger } from \"@itwin/core-bentley\";\r\nimport { ColorDef } from \"@itwin/core-common\";\r\nimport { ArcGisFeatureGeometryType } from \"./ArcGisFeatureQuery\";\r\n\r\n// Convert a channel array [r, g, b, a] to ColorDef\r\nfunction colorFromArray(channels?: number[]) {\r\n if (channels && channels.length === 4) {\r\n // Alpha channel is reversed, 255 = opaque\r\n return ColorDef.from(channels[0], channels[1], channels[2], 255 - channels[3]);\r\n }\r\n return undefined;\r\n}\r\n\r\nconst loggerCategory = \"MapLayersFormats.ArcGISFeature\";\r\n\r\n/** @internal */\r\nexport type EsriSymbolType = \"esriSFS\" | \"esriPMS\" | \"esriSLS\" | \"esriSMS\" | \"esriTS\" | \"CIMSymbolReference\";\r\ninterface EsriSymbol {\r\n type: EsriSymbolType;\r\n}\r\n\r\n/** @internal */\r\nexport type EsriSLSStyle = \"esriSLSDash\" | \"esriSLSDashDot\" | \"esriSLSDashDotDot\" | \"esriSLSDot\" | \"esriSLSLongDash\" | \"esriSLSLongDashDot\" |\r\n\"esriSLSNull\" | \"esriSLSShortDash\" | \"esriSLSShortDashDot\" | \"esriSLSShortDashDotDot\" | \"esriSLSShortDot\" | \"esriSLSSolid\";\r\n\r\ninterface EsriSLSProps {\r\n color: number[];\r\n type: EsriSymbolType;\r\n width: number;\r\n style: EsriSLSStyle;\r\n}\r\n\r\n/** @internal */\r\nexport class EsriSLS implements EsriSymbol {\r\n public readonly props: EsriSLSProps;\r\n\r\n public get color() { return colorFromArray(this.props.color); }\r\n public get type() { return this.props.type; }\r\n public get width() { return this.props.width; }\r\n public get style() { return this.props.style; }\r\n\r\n constructor(json: EsriSLSProps) {\r\n this.props = json;\r\n }\r\n\r\n public static fromJSON(json: EsriSLSProps) {\r\n return new EsriSLS(json);\r\n }\r\n}\r\n\r\ninterface EsriPMSProps {\r\n type: EsriSymbolType;\r\n url: string;\r\n imageData: string;\r\n contentType: string;\r\n width?: number;\r\n height?: number;\r\n xoffset?: number;\r\n yoffset?: number;\r\n angle?: number;\r\n}\r\n\r\n/** @internal */\r\nexport class EsriPMS implements EsriSymbol {\r\n public readonly props: EsriPMSProps;\r\n private _image: HTMLImageElement;\r\n\r\n public get type() { return this.props.type; }\r\n public get url() { return this.props.url; }\r\n public get imageData() { return this.props.imageData; }\r\n public get imageUrl() { return `data:${this.contentType};base64,${this.imageData}`; }\r\n public get image() { return this._image; }\r\n public get contentType() { return this.props.contentType; }\r\n public get width() { return this.props.width; }\r\n public get height() { return this.props.height; }\r\n public get xoffset() { return this.props.xoffset; }\r\n public get yoffset() { return this.props.yoffset; }\r\n public get angle() { return this.props.angle; }\r\n\r\n constructor(json: EsriPMSProps) {\r\n this.props = json;\r\n this._image = new Image();\r\n this._image.src = this.imageUrl;\r\n }\r\n\r\n public static fromJSON(json: EsriPMSProps) {\r\n return new EsriPMS(json);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport type EsriSFSStyleProps = \"esriSFSBackwardDiagonal\" | \"esriSFSCross\" | \"esriSFSDiagonalCross\" | \"esriSFSForwardDiagonal\" | \"esriSFSHorizontal\" | \"esriSFSNull\" | \"esriSFSSolid\" | \"esriSFSVertical\";\r\ninterface EsriSFSProps {\r\n color?: number[];\r\n type: EsriSymbolType;\r\n style: EsriSFSStyleProps;\r\n outline?: EsriSLSProps;\r\n}\r\n\r\n/** @internal */\r\nexport class EsriSFS implements EsriSymbol {\r\n public readonly props: EsriSFSProps;\r\n private _outline: EsriSLS | undefined;\r\n\r\n public get color() { return colorFromArray(this.props.color); }\r\n public get type() { return this.props.type; }\r\n public get style() { return this.props.style; }\r\n public get outline() { return this._outline; }\r\n constructor(json: EsriSFSProps) {\r\n this.props = json;\r\n if (json.outline)\r\n this._outline = EsriSLS.fromJSON(json.outline);\r\n }\r\n\r\n public static fromJSON(json: EsriSFSProps): EsriSFS {\r\n return new EsriSFS(json);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class ArcGisSymbologyRenderer {\r\n private _symbol: EsriSymbol | undefined;\r\n\r\n private static readonly defaultPMS: EsriPMSProps = {\r\n type: \"esriPMS\",\r\n url: \"\",\r\n contentType: \"image/png\",\r\n imageData: \"iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAT9JREFUOI2t1E8rRGEUx/HvMHViIm5ZXGt/3gFlwdKGhYjyAmxs7IassDHFyguwwkbZYJKNslVWJDZT1C3psRv9NMpmJk/Tvc3MHWf3/PuccxbPyfKPkW1wPmBmQ5L6giB4d849Al+tYjNAHpiQ1AHgnAMoA+dhGG5HUfTQCOsCDoGlhCTdwGIURfPVZPtJWCdwBkwntVF3d6+K78Rh+SYhP7bM7FbSjY8FwHqLEEBGUgEY97E5oCcFBjAGDAMvNWwyJVSLKR8L28QG4a/N7zYx+VipTazkY0VgNSVUAa597MrMniWNpMBOAOdjFUlrwAWQaQFywGZt4f+AIrAB7DYJlc1sQdJrHAZQAN6AA6A/STGzp1wut+ycu/f340bQEXAJrACzwCjQC3wAd8CppGNJP/UPk+bZZ7XKQlJ1cfEL1AZaAcKna+kAAAAASUVORK5CYII=\",\r\n width: 14,\r\n height: 14,\r\n };\r\n\r\n private static readonly defaultSLS: EsriSLSProps = {\r\n type: \"esriSLS\",\r\n color: [0, 0.0],\r\n width: 1,\r\n style: \"esriSLSSolid\",\r\n };\r\n\r\n private static readonly defaultSFS: EsriSFSProps = {\r\n type: \"esriSFS\",\r\n color: [0, 0.0],\r\n style: \"esriSFSSolid\",\r\n };\r\n\r\n constructor(geometryType: ArcGisFeatureGeometryType, rendererDefinition: any) {\r\n let symbol;\r\n if (rendererDefinition?.symbol !== undefined) {\r\n symbol = rendererDefinition.symbol;\r\n } else if (rendererDefinition?.defaultSymbol !== undefined) {\r\n symbol = rendererDefinition?.defaultSymbol;\r\n }\r\n\r\n if (symbol !== undefined) {\r\n if (symbol.type === \"esriSFS\") {\r\n this._symbol = EsriSFS.fromJSON(symbol);\r\n } else if (symbol.type === \"esriSLS\") {\r\n this._symbol = EsriSLS.fromJSON(symbol);\r\n } else if (symbol.type === \"esriPMS\") {\r\n this._symbol = EsriPMS.fromJSON(symbol);\r\n }\r\n }\r\n\r\n // If '_symbol' is still undefined at this point, that means we could not find\r\n // any symbology definition from the metadata, let's use some default symbology\r\n // so that we display at least something.\r\n if (this._symbol === undefined) {\r\n Logger.logWarning(loggerCategory, \"Symbology definition not supported, using default symbology\");\r\n if (geometryType === \"esriGeometryPoint\" || geometryType === \"esriGeometryMultipoint\") {\r\n this._symbol = ArcGisSymbologyRenderer.defaultPMS;\r\n } else if (geometryType === \"esriGeometryLine\" || geometryType === \"esriGeometryPolyline\") {\r\n this._symbol = ArcGisSymbologyRenderer.defaultSLS;\r\n } else if (geometryType === \"esriGeometryPolygon\") {\r\n this._symbol = ArcGisSymbologyRenderer.defaultSFS;\r\n } else {\r\n Logger.logError(loggerCategory, \"Could not determine default symbology: geometry type not supported\");\r\n }\r\n }\r\n }\r\n\r\n public applyFillStyle(context: CanvasRenderingContext2D) {\r\n if (!context)\r\n return;\r\n\r\n if (this._symbol?.type === \"esriSFS\") {\r\n const sfs = this._symbol as EsriSFS;\r\n if (sfs.style === \"esriSFSSolid\" && sfs.color) {\r\n context.fillStyle = sfs.color.toRgbaString();\r\n } else {\r\n context.fillStyle = ColorDef.from(200, 0, 0, 100).toRgbaString(); // default color is red?\r\n }\r\n }\r\n }\r\n\r\n public applyStrokeStyle(context: CanvasRenderingContext2D) {\r\n if (!context)\r\n return;\r\n\r\n let sls: EsriSLS | undefined;\r\n if (this._symbol?.type === \"esriSFS\") {\r\n const sfs = this._symbol as EsriSFS;\r\n if (sfs.outline && sfs.outline.style === \"esriSLSSolid\") {\r\n sls = sfs.outline;\r\n }\r\n } else if (this._symbol?.type === \"esriSLS\") {\r\n sls = this._symbol as EsriSLS;\r\n }\r\n\r\n if (sls) {\r\n if (sls.color)\r\n context.strokeStyle = sls.color.toRgbaString();\r\n context.lineWidth = sls.width; // TODO: Should we scale this value here?\r\n }\r\n }\r\n\r\n public drawPoint(context: CanvasRenderingContext2D, ptX: number, ptY: number) {\r\n if (!context)\r\n return;\r\n\r\n if (this._symbol?.type === \"esriPMS\") {\r\n const pms = this._symbol as EsriPMS;\r\n let xOffset = 0, yOffset = 0;\r\n if (pms.xoffset)\r\n xOffset = pms.xoffset;\r\n if (pms.yoffset)\r\n yOffset = pms.yoffset;\r\n\r\n if (pms.width && pms.height) {\r\n // // make sure the marker is centered on the point\r\n xOffset += pms.width * -0.5;\r\n yOffset += pms.height * -0.5;\r\n\r\n context.drawImage(pms.image, ptX + xOffset, ptY + yOffset, pms.width, pms.height);\r\n } else {\r\n context.drawImage(pms.image, ptX + xOffset, ptY + yOffset);\r\n }\r\n\r\n // TODO: marker rotation angle\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ArcGisSymbologyRenderer.js","sourceRoot":"","sources":["../../../src/ArcGisFeature/ArcGisSymbologyRenderer.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\r\nimport { Logger } from \"@itwin/core-bentley\";\r\nimport { ColorDef } from \"@itwin/core-common\";\r\nimport { ArcGisFeatureGeometryType } from \"./ArcGisFeatureQuery\";\r\n\r\n// Convert a channel array [r, g, b, a] to ColorDef\r\nfunction colorFromArray(channels?: number[]) {\r\n if (channels && channels.length === 4) {\r\n // Alpha channel is reversed, 255 = opaque\r\n return ColorDef.from(channels[0], channels[1], channels[2], 255 - channels[3]);\r\n }\r\n return undefined;\r\n}\r\n\r\nconst loggerCategory = \"MapLayersFormats.ArcGISFeature\";\r\n\r\n/** @internal */\r\nexport type EsriSymbolType = \"esriSFS\" | \"esriPMS\" | \"esriSLS\" | \"esriSMS\" | \"esriTS\" | \"CIMSymbolReference\";\r\ninterface EsriSymbol {\r\n type: EsriSymbolType;\r\n}\r\n\r\n/** @internal */\r\nexport type EsriSLSStyle = \"esriSLSDash\" | \"esriSLSDashDot\" | \"esriSLSDashDotDot\" | \"esriSLSDot\" | \"esriSLSLongDash\" | \"esriSLSLongDashDot\" |\r\n\"esriSLSNull\" | \"esriSLSShortDash\" | \"esriSLSShortDashDot\" | \"esriSLSShortDashDotDot\" | \"esriSLSShortDot\" | \"esriSLSSolid\";\r\n\r\ninterface EsriSLSProps {\r\n color: number[];\r\n type: EsriSymbolType;\r\n width: number;\r\n style: EsriSLSStyle;\r\n}\r\n\r\n/** @internal */\r\nexport class EsriSLS implements EsriSymbol {\r\n public readonly props: EsriSLSProps;\r\n\r\n public get color() { return colorFromArray(this.props.color); }\r\n public get type() { return this.props.type; }\r\n public get width() { return this.props.width; }\r\n public get style() { return this.props.style; }\r\n\r\n constructor(json: EsriSLSProps) {\r\n this.props = json;\r\n }\r\n\r\n public static fromJSON(json: EsriSLSProps) {\r\n return new EsriSLS(json);\r\n }\r\n}\r\n\r\ninterface EsriPMSProps {\r\n type: EsriSymbolType;\r\n url: string;\r\n imageData: string;\r\n contentType: string;\r\n width?: number;\r\n height?: number;\r\n xoffset?: number;\r\n yoffset?: number;\r\n angle?: number;\r\n}\r\n\r\n/** @internal */\r\nexport class EsriPMS implements EsriSymbol {\r\n public readonly props: EsriPMSProps;\r\n private _image: HTMLImageElement;\r\n\r\n public get type() { return this.props.type; }\r\n public get url() { return this.props.url; }\r\n public get imageData() { return this.props.imageData; }\r\n public get imageUrl() { return `data:${this.contentType};base64,${this.imageData}`; }\r\n public get image() { return this._image; }\r\n public get contentType() { return this.props.contentType; }\r\n public get width() { return this.props.width; }\r\n public get height() { return this.props.height; }\r\n public get xoffset() { return this.props.xoffset; }\r\n public get yoffset() { return this.props.yoffset; }\r\n public get angle() { return this.props.angle; }\r\n\r\n constructor(json: EsriPMSProps) {\r\n this.props = json;\r\n this._image = new Image();\r\n this._image.src = this.imageUrl;\r\n }\r\n\r\n public static fromJSON(json: EsriPMSProps) {\r\n return new EsriPMS(json);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport type EsriSFSStyleProps = \"esriSFSBackwardDiagonal\" | \"esriSFSCross\" | \"esriSFSDiagonalCross\" | \"esriSFSForwardDiagonal\" | \"esriSFSHorizontal\" | \"esriSFSNull\" | \"esriSFSSolid\" | \"esriSFSVertical\";\r\ninterface EsriSFSProps {\r\n color?: number[];\r\n type: EsriSymbolType;\r\n style: EsriSFSStyleProps;\r\n outline?: EsriSLSProps;\r\n}\r\n\r\n/** @internal */\r\nexport class EsriSFS implements EsriSymbol {\r\n public readonly props: EsriSFSProps;\r\n private _outline: EsriSLS | undefined;\r\n\r\n public get color() { return colorFromArray(this.props.color); }\r\n public get type() { return this.props.type; }\r\n public get style() { return this.props.style; }\r\n public get outline() { return this._outline; }\r\n constructor(json: EsriSFSProps) {\r\n this.props = json;\r\n if (json.outline)\r\n this._outline = EsriSLS.fromJSON(json.outline);\r\n }\r\n\r\n public static fromJSON(json: EsriSFSProps): EsriSFS {\r\n return new EsriSFS(json);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class ArcGisSymbologyRenderer {\r\n private _symbol: EsriSymbol | undefined;\r\n\r\n private static readonly defaultPMS: EsriPMSProps = {\r\n type: \"esriPMS\",\r\n url: \"\",\r\n contentType: \"image/png\",\r\n imageData: \"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAmBJREFUOE+Nk01IVFEUx//n3jfvOZOaJkMtiiJ7o9RG3LgoqKhFSFJBTS1ahFBBi0ijfJXCIyQr+hBbSIsoW7iQoKKFCw2CkAI3tZAgy8Ei+xhoTCbnje/NPfHGnA816KzuPR+/c8/HJRQJE7o+VUhym0DcCOYGgBQEXjOLlyqo+nHanCkMoaL4rslKjZwOQLT4ek3Mmz3FACFNLB67ut6M1nWphbg8wI6VyJK5KEH0EQFVJRKbwzokAW++p/ErraAYSQK3u47bC3vLnA+ZB9i2gHF0oyQMCfCGNaUa+vauxs71wWz2V18cnBj8gQ8J1/eeBnHUa4sMFQDGdGno+4gwEAoQzjVUon3rqlx1KY9x7+0MWobjAPg3QJ2eZV4tAEyFNCN5FkSXyw2B3j1hRGvLcgBXMV5MptA4MOXr0gT0u5bZnAf0jBsyiSgJPAxqhON1K3FlRxUMvwFAtv7u0Wl0jvwEmJNEuOhakTt5wKEBifr6Oo14BIBRpgt07w6jcVMIngKGY7NofR5HwlF+zDcpsC193vyYB/innvHywCzdZfAR/+onX1segBTAxHzzfPE7/8yzzIPLjJE1LTixHZx5CtCK4gXLzovBiDPUsYxVM7gUkB3nWKlm6DYEnQGzXARxCOK+a1WfKtQXb6LNAvr7iCboCUA1Ocdsdv5KLPe7F6pH/w3wLbc+BwOuc5IZ1wEE/jonQbjptZn24tKKX7BgvR2r0NKZRwDvAqCI+Z30VJPTURv7P4A9psuQcYAUPwAoReBLrmX2Lmls7i8sZ7kWLwuoxA1FVJGxzMPLufi6P2r+2xFbOUjGAAAAAElFTkSuQmCC\",\r\n width: 16,\r\n height: 16,\r\n xoffset: -8,\r\n yoffset: -16,\r\n };\r\n\r\n private static readonly defaultSLS: EsriSLSProps = {\r\n type: \"esriSLS\",\r\n color: [0, 0, 0, 255],\r\n width: 1,\r\n style: \"esriSLSSolid\",\r\n };\r\n\r\n private static readonly defaultSFS: EsriSFSProps = {\r\n type: \"esriSFS\",\r\n color: [0, 0, 0, 255],\r\n style: \"esriSFSSolid\",\r\n };\r\n\r\n constructor(geometryType: ArcGisFeatureGeometryType, rendererDefinition: any) {\r\n let symbol;\r\n if (rendererDefinition?.symbol !== undefined) {\r\n symbol = rendererDefinition.symbol;\r\n } else if (rendererDefinition?.defaultSymbol !== undefined) {\r\n symbol = rendererDefinition?.defaultSymbol;\r\n }\r\n\r\n if (symbol !== undefined) {\r\n if (symbol.type === \"esriSFS\") {\r\n this._symbol = EsriSFS.fromJSON(symbol);\r\n } else if (symbol.type === \"esriSLS\") {\r\n this._symbol = EsriSLS.fromJSON(symbol);\r\n } else if (symbol.type === \"esriPMS\") {\r\n this._symbol = EsriPMS.fromJSON(symbol);\r\n }\r\n }\r\n\r\n // If '_symbol' is still undefined at this point, that means we could not find\r\n // any symbology definition from the metadata, let's use some default symbology\r\n // so that we display at least something.\r\n if (this._symbol === undefined) {\r\n Logger.logWarning(loggerCategory, \"Symbology definition not supported, using default symbology\");\r\n if (geometryType === \"esriGeometryPoint\" || geometryType === \"esriGeometryMultipoint\") {\r\n this._symbol = EsriPMS.fromJSON(ArcGisSymbologyRenderer.defaultPMS);\r\n } else if (geometryType === \"esriGeometryLine\" || geometryType === \"esriGeometryPolyline\") {\r\n this._symbol = EsriSLS.fromJSON(ArcGisSymbologyRenderer.defaultSLS);\r\n } else if (geometryType === \"esriGeometryPolygon\") {\r\n this._symbol = EsriSFS.fromJSON(ArcGisSymbologyRenderer.defaultSFS);\r\n } else {\r\n Logger.logError(loggerCategory, \"Could not determine default symbology: geometry type not supported\");\r\n }\r\n }\r\n }\r\n\r\n public applyFillStyle(context: CanvasRenderingContext2D) {\r\n if (!context)\r\n return;\r\n\r\n if (this._symbol?.type === \"esriSFS\") {\r\n const sfs = this._symbol as EsriSFS;\r\n if (sfs.style === \"esriSFSSolid\" && sfs.color) {\r\n context.fillStyle = sfs.color.toRgbaString();\r\n } else {\r\n context.fillStyle = ColorDef.from(200, 0, 0, 100).toRgbaString(); // default color is red?\r\n }\r\n }\r\n }\r\n\r\n public applyStrokeStyle(context: CanvasRenderingContext2D) {\r\n if (!context)\r\n return;\r\n\r\n let sls: EsriSLS | undefined;\r\n if (this._symbol?.type === \"esriSFS\") {\r\n const sfs = this._symbol as EsriSFS;\r\n if (sfs.outline && sfs.outline.style === \"esriSLSSolid\") {\r\n sls = sfs.outline;\r\n }\r\n } else if (this._symbol?.type === \"esriSLS\") {\r\n sls = this._symbol as EsriSLS;\r\n }\r\n\r\n if (sls) {\r\n if (sls.color)\r\n context.strokeStyle = sls.color.toRgbaString();\r\n context.lineWidth = sls.width; // TODO: Should we scale this value here?\r\n }\r\n }\r\n\r\n public drawPoint(context: CanvasRenderingContext2D, ptX: number, ptY: number) {\r\n if (!context)\r\n return;\r\n\r\n if (this._symbol?.type === \"esriPMS\") {\r\n const pms = this._symbol as EsriPMS;\r\n let xOffset = 0, yOffset = 0;\r\n if (pms.xoffset)\r\n xOffset = pms.xoffset;\r\n else if (pms.width)\r\n xOffset = pms.width * -0.5; // if no offset center in the middle\r\n\r\n if (pms.yoffset)\r\n yOffset = pms.yoffset;\r\n else if (pms.height)\r\n yOffset = pms.height * -0.5; // if no offset center in the middle\r\n\r\n if (pms.width && pms.height) {\r\n context.drawImage(pms.image, ptX + xOffset, ptY + yOffset, pms.width, pms.height);\r\n } else {\r\n context.drawImage(pms.image, ptX + xOffset, ptY + yOffset);\r\n }\r\n\r\n // TODO: marker rotation angle\r\n }\r\n }\r\n}\r\n"]}
@@ -38,7 +38,7 @@ describe("ArcGisFeatureProvider", () => {
38
38
  const provider = new map_layers_formats_1.ArcGisFeatureProvider(settings);
39
39
  await provider.initialize();
40
40
  expect(provider._minDepthFromLod).to.equals(11);
41
- expect(provider._maxDepthFromLod).to.equals(0);
41
+ expect(provider._maxDepthFromLod).to.equals(22);
42
42
  });
43
43
  it("should not initialize with no service metadata", async () => {
44
44
  sandbox.stub(core_frontend_1.ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache) {
@@ -136,16 +136,39 @@ describe("ArcGisFeatureProvider", () => {
136
136
  let getLayerMetadataStub = sandbox.stub(map_layers_formats_1.ArcGisFeatureProvider.prototype, "getLayerMetadata").callsFake(async function (_id) {
137
137
  return { defaultVisibility: true, supportedQueryFormats: "PBF, JSON" };
138
138
  });
139
- sandbox.stub(core_frontend_1.ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache) {
139
+ const getServiceJsonStub = sandbox.stub(core_frontend_1.ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache) {
140
140
  return { capabilities: "Query" };
141
141
  });
142
142
  let provider = new map_layers_formats_1.ArcGisFeatureProvider(settings);
143
143
  await provider.initialize();
144
+ expect(provider.format).to.equals("JSON");
145
+ // PBF requires 'supportsCoordinatesQuantization'
146
+ getServiceJsonStub.restore();
147
+ sandbox.stub(core_frontend_1.ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache) {
148
+ return { currentVersion: 11, capabilities: "Query" };
149
+ });
150
+ getLayerMetadataStub.restore();
151
+ getLayerMetadataStub = sandbox.stub(map_layers_formats_1.ArcGisFeatureProvider.prototype, "getLayerMetadata").callsFake(async function (_id) {
152
+ return { defaultVisibility: true, supportsCoordinatesQuantization: true, supportedQueryFormats: "PBF, JSON" };
153
+ });
154
+ provider = new map_layers_formats_1.ArcGisFeatureProvider(settings);
155
+ await provider.initialize();
144
156
  expect(provider.format).to.equals("PBF");
145
157
  getLayerMetadataStub.restore();
146
158
  getLayerMetadataStub = sandbox.stub(map_layers_formats_1.ArcGisFeatureProvider.prototype, "getLayerMetadata").callsFake(async function (_id) {
147
159
  return { defaultVisibility: true, supportedQueryFormats: "JSON" };
148
160
  });
161
+ getServiceJsonStub.restore();
162
+ sandbox.stub(core_frontend_1.ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache) {
163
+ return { currentVersion: 10.91, capabilities: "Query", supportsCoordinatesQuantization: true };
164
+ });
165
+ provider = new map_layers_formats_1.ArcGisFeatureProvider(settings);
166
+ await provider.initialize();
167
+ expect(provider.format).to.equals("JSON");
168
+ getLayerMetadataStub.restore();
169
+ getLayerMetadataStub = sandbox.stub(map_layers_formats_1.ArcGisFeatureProvider.prototype, "getLayerMetadata").callsFake(async function (_id) {
170
+ return { defaultVisibility: true, supportedQueryFormats: "JSON" };
171
+ });
149
172
  provider = new map_layers_formats_1.ArcGisFeatureProvider(settings);
150
173
  await provider.initialize();
151
174
  expect(provider.format).to.equals("JSON");
@@ -196,7 +219,7 @@ describe("ArcGisFeatureProvider", () => {
196
219
  };
197
220
  });
198
221
  sandbox.stub(core_frontend_1.ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache) {
199
- return { capabilities: "Query" };
222
+ return { currentVersion: 11, capabilities: "Query" };
200
223
  });
201
224
  const provider = new map_layers_formats_1.ArcGisFeatureProvider(settings);
202
225
  await provider.initialize();
@@ -211,7 +234,7 @@ describe("ArcGisFeatureProvider", () => {
211
234
  latestWkid: 3857,
212
235
  },
213
236
  };
214
- expect(url === null || url === void 0 ? void 0 : url.url).to.equals(`https://dummy.com/0/query/?f=PBF&resultType=tile&maxRecordCountFactor=3&returnExceededLimitFeatures=false&outSR=102100&geometryType=esriGeometryEnvelope&geometry={"xmin":-20037508.34,"ymin":-20037508.339999996,"xmax":20037508.34,"ymax":20037508.340000004,"spatialReference":{"wkid":102100,"latestWkid":3857}}&inSR=102100`);
237
+ expect(url === null || url === void 0 ? void 0 : url.url).to.equals(`https://dummy.com/0/query?f=PBF&resultType=tile&maxRecordCountFactor=3&returnExceededLimitFeatures=false&outSR=102100&geometryType=esriGeometryEnvelope&geometry=%7B%22xmin%22%3A-20037508.34%2C%22ymin%22%3A-20037508.339999996%2C%22xmax%22%3A20037508.34%2C%22ymax%22%3A20037508.340000004%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D&units=esriSRUnit_Meter&inSR=102100`);
215
238
  expect((_a = url === null || url === void 0 ? void 0 : url.envelope) === null || _a === void 0 ? void 0 : _a.xmin).to.be.closeTo(extent.xmin, 0.01);
216
239
  expect((_b = url === null || url === void 0 ? void 0 : url.envelope) === null || _b === void 0 ? void 0 : _b.ymin).to.be.closeTo(extent.ymin, 0.01);
217
240
  expect((_c = url === null || url === void 0 ? void 0 : url.envelope) === null || _c === void 0 ? void 0 : _c.xmax).to.be.closeTo(extent.xmax, 0.01);
@@ -230,7 +253,7 @@ describe("ArcGisFeatureProvider", () => {
230
253
  const provider2 = new map_layers_formats_1.ArcGisFeatureProvider(settings);
231
254
  await provider2.initialize();
232
255
  url = provider2.constructFeatureUrl(0, 0, 0, "PBF");
233
- expect(url === null || url === void 0 ? void 0 : url.url).to.equals(`https://dummy.com/0/query/?f=PBF&resultType=tile&maxRecordCountFactor=3&returnExceededLimitFeatures=false&outSR=102100&geometryType=esriGeometryEnvelope&geometry={"xmin":-20037508.34,"ymin":-20037508.339999996,"xmax":20037508.34,"ymax":20037508.340000004,"spatialReference":{"wkid":102100,"latestWkid":3857}}&inSR=102100&quantizationParameters={"mode":"view","originPosition":"upperLeft","tolerance":78271.516953125,"extent":{"xmin":-20037508.34,"ymin":-20037508.339999996,"xmax":20037508.34,"ymax":20037508.340000004,"spatialReference":{"wkid":102100,"latestWkid":3857}}}`);
256
+ expect(url === null || url === void 0 ? void 0 : url.url).to.equals(`https://dummy.com/0/query?f=PBF&resultType=tile&maxRecordCountFactor=3&returnExceededLimitFeatures=false&outSR=102100&geometryType=esriGeometryEnvelope&geometry=%7B%22xmin%22%3A-20037508.34%2C%22ymin%22%3A-20037508.339999996%2C%22xmax%22%3A20037508.34%2C%22ymax%22%3A20037508.340000004%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D&units=esriSRUnit_Meter&inSR=102100&quantizationParameters=%7B%22mode%22%3A%22view%22%2C%22originPosition%22%3A%22upperLeft%22%2C%22tolerance%22%3A78271.516953125%2C%22extent%22%3A%7B%22xmin%22%3A-20037508.34%2C%22ymin%22%3A-20037508.339999996%2C%22xmax%22%3A20037508.34%2C%22ymax%22%3A20037508.340000004%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D%7D`);
234
257
  expect((_g = url === null || url === void 0 ? void 0 : url.envelope) === null || _g === void 0 ? void 0 : _g.xmin).to.be.closeTo(extent.xmin, 0.01);
235
258
  expect((_h = url === null || url === void 0 ? void 0 : url.envelope) === null || _h === void 0 ? void 0 : _h.ymin).to.be.closeTo(extent.ymin, 0.01);
236
259
  expect((_j = url === null || url === void 0 ? void 0 : url.envelope) === null || _j === void 0 ? void 0 : _j.xmax).to.be.closeTo(extent.xmax, 0.01);
@@ -254,7 +277,7 @@ describe("ArcGisFeatureProvider", () => {
254
277
  const provider3 = new map_layers_formats_1.ArcGisFeatureProvider(settings);
255
278
  await provider3.initialize();
256
279
  url = provider3.constructFeatureUrl(0, 0, 0, "PBF", overrideGeom);
257
- expect(url === null || url === void 0 ? void 0 : url.url).to.equals(`https://dummy.com/0/query/?f=PBF&resultType=tile&maxRecordCountFactor=3&returnExceededLimitFeatures=false&outSR=102100&geometryType=esriGeometryEnvelope&geometry={"xmin":-50,"ymin":-50,"xmax":50,"ymax":50,"spatialReference":{"wkid":102100,"latestWkid":3857}}&inSR=102100&quantizationParameters={"mode":"view","originPosition":"upperLeft","tolerance":78271.516953125,"extent":{"xmin":-20037508.34,"ymin":-20037508.339999996,"xmax":20037508.34,"ymax":20037508.340000004,"spatialReference":{"wkid":102100,"latestWkid":3857}}}`);
280
+ expect(url === null || url === void 0 ? void 0 : url.url).to.equals(`https://dummy.com/0/query?f=PBF&resultType=tile&maxRecordCountFactor=3&returnExceededLimitFeatures=false&outSR=102100&geometryType=esriGeometryEnvelope&geometry=%7B%22xmin%22%3A-50%2C%22ymin%22%3A-50%2C%22xmax%22%3A50%2C%22ymax%22%3A50%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D&units=esriSRUnit_Meter&inSR=102100&quantizationParameters=%7B%22mode%22%3A%22view%22%2C%22originPosition%22%3A%22upperLeft%22%2C%22tolerance%22%3A78271.516953125%2C%22extent%22%3A%7B%22xmin%22%3A-20037508.34%2C%22ymin%22%3A-20037508.339999996%2C%22xmax%22%3A20037508.34%2C%22ymax%22%3A20037508.340000004%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D%7D`);
258
281
  expect((_o = url === null || url === void 0 ? void 0 : url.envelope) === null || _o === void 0 ? void 0 : _o.xmin).to.be.closeTo(overrideGeom.geom.xmin, 0.01);
259
282
  expect((_p = url === null || url === void 0 ? void 0 : url.envelope) === null || _p === void 0 ? void 0 : _p.ymin).to.be.closeTo(overrideGeom.geom.ymin, 0.01);
260
283
  expect((_q = url === null || url === void 0 ? void 0 : url.envelope) === null || _q === void 0 ? void 0 : _q.xmax).to.be.closeTo(overrideGeom.geom.xmax, 0.01);
@@ -263,7 +286,7 @@ describe("ArcGisFeatureProvider", () => {
263
286
  expect((_t = url === null || url === void 0 ? void 0 : url.envelope) === null || _t === void 0 ? void 0 : _t.spatialReference.latestWkid).to.be.equal(overrideGeom.geom.spatialReference.latestWkid);
264
287
  // Now test with a different tolerance value
265
288
  url = provider3.constructFeatureUrl(0, 0, 0, "PBF", overrideGeom, undefined, 10);
266
- expect(url === null || url === void 0 ? void 0 : url.url).to.equals(`https://dummy.com/0/query/?f=PBF&resultType=tile&maxRecordCountFactor=3&returnExceededLimitFeatures=false&outSR=102100&geometryType=esriGeometryEnvelope&geometry={"xmin":-50,"ymin":-50,"xmax":50,"ymax":50,"spatialReference":{"wkid":102100,"latestWkid":3857}}&inSR=102100&quantizationParameters={"mode":"view","originPosition":"upperLeft","tolerance":78271.516953125,"extent":{"xmin":-20037508.34,"ymin":-20037508.339999996,"xmax":20037508.34,"ymax":20037508.340000004,"spatialReference":{"wkid":102100,"latestWkid":3857}}}&distance=782715.16953125`);
289
+ expect(url === null || url === void 0 ? void 0 : url.url).to.equals(`https://dummy.com/0/query?f=PBF&resultType=tile&maxRecordCountFactor=3&returnExceededLimitFeatures=false&outSR=102100&geometryType=esriGeometryEnvelope&geometry=%7B%22xmin%22%3A-50%2C%22ymin%22%3A-50%2C%22xmax%22%3A50%2C%22ymax%22%3A50%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D&units=esriSRUnit_Meter&inSR=102100&quantizationParameters=%7B%22mode%22%3A%22view%22%2C%22originPosition%22%3A%22upperLeft%22%2C%22tolerance%22%3A78271.516953125%2C%22extent%22%3A%7B%22xmin%22%3A-20037508.34%2C%22ymin%22%3A-20037508.339999996%2C%22xmax%22%3A20037508.34%2C%22ymax%22%3A20037508.340000004%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D%7D&distance=782715.16953125`);
267
290
  expect((_u = url === null || url === void 0 ? void 0 : url.envelope) === null || _u === void 0 ? void 0 : _u.xmin).to.be.closeTo(overrideGeom.geom.xmin, 0.01);
268
291
  expect((_v = url === null || url === void 0 ? void 0 : url.envelope) === null || _v === void 0 ? void 0 : _v.ymin).to.be.closeTo(overrideGeom.geom.ymin, 0.01);
269
292
  expect((_w = url === null || url === void 0 ? void 0 : url.envelope) === null || _w === void 0 ? void 0 : _w.xmax).to.be.closeTo(overrideGeom.geom.xmax, 0.01);
@@ -285,7 +308,7 @@ describe("ArcGisFeatureProvider", () => {
285
308
  };
286
309
  });
287
310
  sandbox.stub(core_frontend_1.ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache) {
288
- return { capabilities: "Query" };
311
+ return { currentVersion: 11, capabilities: "Query" };
289
312
  });
290
313
  sandbox.stub(map_layers_formats_1.ArcGisFeatureProvider.prototype, "constructFeatureUrl").callsFake(function _(_row, _column, _zoomLevel, _format, _geomOverride, _outFields, _tolerance, _returnGeometry) {
291
314
  return undefined;
@@ -307,12 +330,13 @@ describe("ArcGisFeatureProvider", () => {
307
330
  return {
308
331
  defaultVisibility: true,
309
332
  supportedQueryFormats: "PBF, JSON",
333
+ supportsCoordinatesQuantization: true,
310
334
  minScale: 600000,
311
335
  maxScale: 5000,
312
336
  };
313
337
  });
314
338
  sandbox.stub(core_frontend_1.ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache) {
315
- return { capabilities: "Query" };
339
+ return { currentVersion: 11, capabilities: "Query" };
316
340
  });
317
341
  sandbox.stub(core_frontend_1.ArcGISImageryProvider.prototype, "fetch").callsFake(async function _(_url, _options) {
318
342
  const test = {
@@ -471,7 +495,7 @@ describe("ArcGisFeatureProvider", () => {
471
495
  };
472
496
  });
473
497
  sandbox.stub(core_frontend_1.ArcGisUtilities, "getServiceJson").callsFake(async function _(_url, _formatId, _userName, _password, _ignoreCache) {
474
- return { capabilities: "Query" };
498
+ return { currentVersion: 11, capabilities: "Query" };
475
499
  });
476
500
  sandbox.stub(HTMLCanvasElement.prototype, "getContext").callsFake(function _(_contextId, _options) {
477
501
  return {};