Éditer un polygone et générer une image pour un rapport
Objectif
Pattern associé: workflow carto métier.
L’objectif est de laisser l’utilisateur tracer ou ajuster un polygone, puis de générer une image de la carte que l’application pourra intégrer dans un rapport métier, un dossier ou un export documentaire.
Objets API utilisés
Flux de données
- l’application crée une couche
GRAPHICSéditable - elle lance le dessin d’un polygone
- elle autorise sa modification au clic
- elle centre la carte si nécessaire sur la géométrie utile
- elle appelle
report.downloadAdvancedScreenshot(...) - elle réutilise le
Blobgénéré dans son propre rapport métier
Snippet minimal
<button id="draw-polygon" type="button">Dessiner</button><button id="generate-image" type="button">Générer l'image</button><img id="report-preview" alt="Prévisualisation du rapport cartographique" /><geoviewer-esri-element id="viewer"></geoviewer-esri-element>
<script type="module"> const viewerElement = document.getElementById('viewer'); const drawPolygonButton = document.getElementById('draw-polygon'); const generateImageButton = document.getElementById('generate-image'); const previewImage = document.getElementById('report-preview');
viewerElement.onViewerServiceReady((viewerService) => { viewerService.onReady(() => { const mapManager = viewerService.mapManager; const { draw, events, report, zoom } = mapManager.tools;
const reportLayer = mapManager.addGraphicMapService({ id: 'report-area', type: 'GRAPHICS', label: 'Emprise du rapport', visible: true, removable: true, identifiable: true, editing: true, isDraw: true, toc: { visible: true, open: false, }, objectIdProperty: 'id', });
const drawTool = draw.create({ layer: reportLayer }); let currentFeature = null;
drawPolygonButton.addEventListener('click', () => { drawTool.create({ type: 'polygon', onDrawComplete: async (feature) => { currentFeature = feature; await zoom.zoomToFeature(feature); }, }); });
events.listenGraphicMapServiceClick(reportLayer, (features) => { const [feature] = features; if (!feature) { return; }
currentFeature = feature; drawTool.update(feature, { onDrawComplete: async (updatedFeatures) => { const [updatedFeature] = updatedFeatures; if (!updatedFeature) { return; }
currentFeature = updatedFeature; await zoom.zoomToFeature(updatedFeature); }, }); });
generateImageButton.addEventListener('click', async () => { if (!currentFeature) { return; }
await zoom.zoomToFeature(currentFeature);
const blob = await report.downloadAdvancedScreenshot('HORIZONTAL'); const imageUrl = URL.createObjectURL(blob);
previewImage.src = imageUrl; }); }); });</script>Pièges fréquents
downloadAdvancedScreenshot(...)produit une image de la carte, pas un rapport métier complet mis en page.- Générez l’image quand la carte est dans l’état souhaité: extent, fond de plan, couches visibles et éventuelle popup ouverte ou fermée selon votre besoin.
- Pensez à libérer les URL créées avec
URL.revokeObjectURL(...)quand vous remplacez une image déjà générée. - Selon les couches affichées et leurs contraintes d’accès, la capture peut dépendre de droits ou de comportements cross-origin.