/// <summary> /// Recursively calculates new extents of the map ot cover a certain geo size in meters. /// </summary> private static IEnvelope CalcNewExtentsCore( IPrintableMap map, IEnvelope oldExtents, GeoSize newSize, SizeF paperSize, ref int depth) { depth++; GeoSize oldSize; if (map.GetGeodesicSize(oldExtents, out oldSize)) { const int maxDepth = 5; double newScale = CalcMapScale(newSize, paperSize); double oldScale = CalcMapScale(oldSize, paperSize); if (NumericHelper.Equal(newScale, oldScale, 1e-6) || depth > maxDepth) { return(oldExtents); } double ratio = newScale / oldScale - 1; double dx = oldExtents.Width * ratio; double dy = oldExtents.Height * ratio; var extents = oldExtents.Inflate(dx, dy); return(CalcNewExtentsCore(map, extents, newSize, paperSize, ref depth)); } return(null); }
private void UpdatePreview(bool fullExtents) { int layersCount = _mainMap.Layers.Count; if (layersCount == 0 && (_mainMap.TileProvider == TileProvider.None || _mainMap.Projection.IsEmpty)) { MessageService.Current.Info("Map is empty. It's not possible to create an overview image."); return; } if (fullExtents && layersCount == 0) { MessageService.Current.Info("No layers are loaded to make snapshot."); return; } IEnvelope e = fullExtents ? _mainMap.MaxExtents : _mainMap.Extents; e = e.Inflate(e.Width * 0.1, e.Height * 0.1); // parameter can be introduced double ratio = _view.Width / (double)_view.Height; var exts = e.Adjust(ratio); var img = GetSnapshot(exts); if (img == null) { MessageService.Current.Warn("Failed to make screenshot."); return; } img.Dx = (exts.MaxX - exts.MinX) / img.Width; img.Dy = (exts.MaxY - exts.MinY) / img.Height; img.XllCenter = exts.MinX + 0.5 * img.Dx; img.YllCenter = exts.MinY + 0.5 * img.Dx; // TODO: Shouldn't this be img.Dy? img.DownsamplingMode = InterpolationType.HighQualityBicubic; img.UpsamplingMode = InterpolationType.HighQualityBicubic; _view.UpdateImage(img); _view.UpdateLocatorBox(_mainMap.Extents); }