@regionerne/gis-komponent 0.0.117 → 0.0.119

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.
@@ -2142,6 +2142,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
2142
2142
  type: Injectable
2143
2143
  }] });
2144
2144
 
2145
+ class GeometryService {
2146
+ config = inject(GISKOMPONENT_CONFIG);
2147
+ _baseUrl = this.config.apiBaseUrl;
2148
+ _http = inject(HttpClient);
2149
+ validate(wkt) {
2150
+ const url = `${this._baseUrl}/api/geometry/validate`;
2151
+ return this._http.post(url, { wkt: wkt });
2152
+ }
2153
+ dmpValidate(wkt) {
2154
+ const url = `${this._baseUrl}/api/geometry/dmpvalidate`;
2155
+ return this._http.post(url, { wkt: wkt });
2156
+ }
2157
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: GeometryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2158
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: GeometryService, providedIn: 'root' });
2159
+ }
2160
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: GeometryService, decorators: [{
2161
+ type: Injectable,
2162
+ args: [{
2163
+ providedIn: 'root'
2164
+ }]
2165
+ }] });
2166
+
2145
2167
  class MergeFeaturesService {
2146
2168
  _current = inject(CurrentItemsService);
2147
2169
  _featureHelper = inject(FeatureHelperService);
@@ -2149,9 +2171,11 @@ class MergeFeaturesService {
2149
2171
  _drawLayerService = inject(DrawLayerSourceService);
2150
2172
  _undoRedoService = inject(UndoRedoService);
2151
2173
  _overLapService = inject(OverlapService);
2174
+ _geometryService = inject(GeometryService);
2152
2175
  _selectedMergeFeature;
2153
2176
  formatter = new GeoJSON$1();
2154
2177
  _formatterOptions = { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:25832' };
2178
+ _wktFormat = new WKT$1();
2155
2179
  _selectFilter(f, typeId) {
2156
2180
  if (this._featureHelper.isLocked(f)) {
2157
2181
  return false;
@@ -2187,29 +2211,44 @@ class MergeFeaturesService {
2187
2211
  if (evt.selected && evt.selected.length > 0 && this._selectedMergeFeature.getId() !== evt.selected[0].getId()) {
2188
2212
  const feature1 = this.formatter.writeFeatureObject(this._selectedMergeFeature, this._formatterOptions);
2189
2213
  const feature2 = this.formatter.writeFeatureObject(evt.selected[0], this._formatterOptions);
2190
- const bufferedFeature1 = buffer(feature1, 5, { units: 'centimeters' });
2191
- const bufferedFeature2 = buffer(feature2, 5, { units: 'centimeters' });
2192
- const newFeatureObject = union(featureCollection([bufferedFeature1, bufferedFeature2]));
2214
+ const bufferedFeature1 = buffer(feature1, 1, { units: 'centimeters' });
2215
+ const bufferedFeature2 = buffer(feature2, 1, { units: 'centimeters' });
2216
+ const newFeatureObjectUnminusBuffered = union(featureCollection([bufferedFeature1, bufferedFeature2]));
2217
+ const newFeatureObject = buffer(newFeatureObjectUnminusBuffered, -1, { units: 'centimeters' });
2193
2218
  const newFeature = this.formatter.readFeature(newFeatureObject, this._formatterOptions);
2194
- this._drawLayerService.source.removeFeatures([evt.selected[0], this._selectedMergeFeature]);
2195
- const style = this._selectedMergeFeature.getStyle();
2196
- const typeId = this._featureHelper.typeId(this._selectedMergeFeature);
2197
- this._overLapService.handleOverlaps([newFeature]).subscribe({
2198
- next: overlapResult => {
2199
- this._selectedMergeFeature?.setGeometry(overlapResult[0].getGeometry());
2200
- const mergedFeature = evt.selected[0].clone();
2201
- mergedFeature.setGeometry(overlapResult[0].getGeometry());
2202
- mergedFeature.setStyle(style);
2203
- this._featureHelper.setTypeId(mergedFeature, typeId);
2204
- this._featureHelper.setId(mergedFeature);
2205
- this._drawLayerService.source.addFeature(mergedFeature);
2206
- this._undoRedoService.addStep();
2219
+ const newFeatureWKT = this._wktFormat.writeGeometry(newFeature.getGeometry());
2220
+ this._geometryService.validate(newFeatureWKT).subscribe({
2221
+ next: r => {
2222
+ const result = r;
2223
+ if (result.wasCorrected) {
2224
+ const geometry = this._wktFormat.readGeometry(result.correctedGeometries[0]);
2225
+ newFeature.setGeometry(geometry);
2226
+ }
2227
+ this._drawLayerService.source.removeFeatures([evt.selected[0], this._selectedMergeFeature]);
2228
+ const style = this._selectedMergeFeature.getStyle();
2229
+ const typeId = this._featureHelper.typeId(this._selectedMergeFeature);
2230
+ this._overLapService.handleOverlaps([newFeature]).subscribe({
2231
+ next: overlapResult => {
2232
+ this._selectedMergeFeature?.setGeometry(overlapResult[0].getGeometry());
2233
+ const mergedFeature = evt.selected[0].clone();
2234
+ mergedFeature.setGeometry(overlapResult[0].getGeometry());
2235
+ mergedFeature.setStyle(style);
2236
+ this._featureHelper.setTypeId(mergedFeature, typeId);
2237
+ this._featureHelper.setId(mergedFeature);
2238
+ this._drawLayerService.source.addFeature(mergedFeature);
2239
+ this._undoRedoService.addStep();
2240
+ this._selectedMergeFeature = undefined;
2241
+ map.removeInteraction(select);
2242
+ done();
2243
+ }
2244
+ });
2207
2245
  }
2208
2246
  });
2209
2247
  }
2210
- this._selectedMergeFeature = undefined;
2211
- map.removeInteraction(select);
2212
- done();
2248
+ else {
2249
+ this._selectedMergeFeature = undefined;
2250
+ done();
2251
+ }
2213
2252
  }
2214
2253
  else {
2215
2254
  this._selectedMergeFeature = evt.selected[0];
@@ -2629,28 +2668,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
2629
2668
  type: Injectable
2630
2669
  }] });
2631
2670
 
2632
- class GeometryService {
2633
- config = inject(GISKOMPONENT_CONFIG);
2634
- _baseUrl = this.config.apiBaseUrl;
2635
- _http = inject(HttpClient);
2636
- validate(wkt) {
2637
- const url = `${this._baseUrl}/api/geometry/validate`;
2638
- return this._http.post(url, { wkt: wkt });
2639
- }
2640
- dmpValidate(wkt) {
2641
- const url = `${this._baseUrl}/api/geometry/dmpvalidate`;
2642
- return this._http.post(url, { wkt: wkt });
2643
- }
2644
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: GeometryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2645
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: GeometryService, providedIn: 'root' });
2646
- }
2647
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: GeometryService, decorators: [{
2648
- type: Injectable,
2649
- args: [{
2650
- providedIn: 'root'
2651
- }]
2652
- }] });
2653
-
2654
2671
  class PrintHelperService {
2655
2672
  _layerHelper = inject(LayerHelperService);
2656
2673
  setVisibiltyOnDOMElements(baseElement, visible, printSetting) {
@@ -2698,6 +2715,7 @@ class PrintHelperService {
2698
2715
  setTimeout(() => {
2699
2716
  html2canvas(htmlElement, {
2700
2717
  useCORS: true,
2718
+ allowTaint: true,
2701
2719
  }).then(originalCanvas => {
2702
2720
  if (printSetting.printDimensions) {
2703
2721
  const srcW = originalCanvas.width;
@@ -4740,6 +4758,7 @@ class ToolboxComponent {
4740
4758
  this._printHelper.setVisibiltyOnDOMElements(htmlElement, false);
4741
4759
  html2canvas(htmlElement, {
4742
4760
  useCORS: true,
4761
+ allowTaint: true,
4743
4762
  }).then(canvas => {
4744
4763
  const imgData = canvas.toDataURL(this.format);
4745
4764
  const link = document.createElement('a');
@@ -4753,8 +4772,11 @@ class ToolboxComponent {
4753
4772
  }
4754
4773
  link.download = download;
4755
4774
  link.click();
4756
- this._printHelper.setVisibiltyOnDOMElements(htmlElement, true);
4757
- });
4775
+ })
4776
+ .catch(error => {
4777
+ console.error("🚀 ~ ToolboxComponent ~ doPrint ~ error:", error);
4778
+ })
4779
+ .finally(() => this._printHelper.setVisibiltyOnDOMElements(htmlElement, true));
4758
4780
  }
4759
4781
  toggleSelectFeatureHighlight() {
4760
4782
  if (this.activeMode === 'select-highlight') {
@@ -6291,8 +6313,8 @@ class GisKomponentComponent {
6291
6313
  case 'WMS':
6292
6314
  result = new ImageLayer({
6293
6315
  source: new ImageWMS({
6316
+ crossOrigin: 'anonymous', // Print requires CORS-enabled sources
6294
6317
  url: layer.baseUrl,
6295
- // crossOrigin: 'anonymous', // This gives us CORS errors sometimes
6296
6318
  params,
6297
6319
  })
6298
6320
  });
@@ -6301,7 +6323,7 @@ class GisKomponentComponent {
6301
6323
  result = new TileLayer({
6302
6324
  source: new TileWMS({
6303
6325
  url: layer.baseUrl,
6304
- // crossOrigin: 'anonymous',
6326
+ crossOrigin: 'anonymous', // Print requires CORS-enabled sources
6305
6327
  params,
6306
6328
  })
6307
6329
  });
@@ -6311,7 +6333,7 @@ class GisKomponentComponent {
6311
6333
  const options = optionsFromCapabilities(wmtsOptions[layer.baseUrl], {
6312
6334
  layer: layer.layers,
6313
6335
  matrixSet: layer.projection || projection,
6314
- crossOrigin: 'anonymous'
6336
+ crossOrigin: 'anonymous' // Print requires CORS-enabled sources
6315
6337
  });
6316
6338
  result = new TileLayer({
6317
6339
  source: new WMTS(options)