Пример #1
0
        private void RenderingSceneAsync(MapRenderingScene scene)
        {
            Task.Factory.StartNew(state =>
            {
                var taskScene = (MapRenderingScene)state;
                var context   = new RenderContext(SceneSize);
                _renderer.Render(context, Map, CreateView(taskScene),
                                 (float)Map.Projection.ToZoomFactor(taskScene.Zoom));
                var image = context.BuildScene();
                image.Freeze();
                taskScene.SceneImage = image;
                Logging.Log.TraceEvent("Wpf.MapSceneManager.Action", TraceEventType.Information,
                                       $"RenderingSceneAsync rendered image {taskScene.Center} {taskScene.Zoom} {taskScene.Tilt}");
                return(taskScene);
            }, scene).ContinueWith(t =>
            {
                var currentScene = t.Result;
                var last         = GetLastScene();

                if (last == null || last == currentScene)
                {
                    Logging.Log.TraceEvent("Wpf.MapSceneManager.Action", TraceEventType.Information,
                                           $"RenderingSceneAsync OnRenderScene {currentScene.Center} {currentScene.Zoom} {currentScene.Tilt}");
                    OnRenderScene(currentScene);
                }
                else
                {
                    Logging.Log.TraceEvent("Wpf.MapSceneManager.Action", TraceEventType.Information,
                                           $"RenderingSceneAsync nofting OnRenderScene {currentScene.Center} {currentScene.Zoom} {currentScene.Tilt}");
                }
            });
        }
Пример #2
0
        protected override void OnRender(DrawingContext drawingContext)
        {
            base.OnRender(drawingContext);

            var ticksBefore = DateTime.Now.Ticks;

            MapRenderingScene scene = null;

            lock (_renderingScenesLock)
            {
                if (_renderingScenes.Count > 0)
                {
                    scene = _renderingScenes.Pop();
                }
            }
            if (scene != null)
            {
                drawingContext.PushClip(new RectangleGeometry(new Rect(RenderSize)));
                RenderScene(drawingContext, RenderSize, scene);
                drawingContext.Pop();
            }
            else
            {
                drawingContext.DrawRectangle(Background, null, new Rect(RenderSize));
            }

            var ticksAfter = DateTime.Now.Ticks;
            var message    = $"Rendering took: {(new TimeSpan(ticksAfter - ticksBefore).TotalMilliseconds)}ms @ zoom level {MapZoom}";

            Logging.Log.TraceEvent("Wpf.MapControl.RenderPerfomance", TraceEventType.Information, message);
        }
Пример #3
0
        public void PreviewComplete()
        {
            if (_previewScene != null)
            {
                Map.Resume();
                var newScene = new MapRenderingScene(_previewScene.Center, _previewScene.Zoom, _previewScene.Tilt)
                {
                    PreviousScene = GetLastScene()
                };
                lock (_historyLock)
                {
                    _renderedScenes.Enqueue(newScene);
                    while (_renderedScenes.Count > _historyCapacity)
                    {
                        _renderedScenes.Dequeue();
                    }
                }
                if (SceneSize.Width > 0 && SceneSize.Height > 0)
                {
                    var view = CreateView(newScene);
                    Map.ViewChanged((float)Map.Projection.ToZoomFactor(newScene.Zoom), newScene.Center, view,
                                    view);

                    Logging.Log.TraceEvent("Wpf.MapSceneManager.Action", TraceEventType.Information, $"PreviewComplete begin rendering {newScene.Center} {newScene.Zoom} {newScene.Tilt}");
                    RenderingSceneAsync(newScene);
                }
                _previewScene = null;

                IsReady = true;
                Logging.Log.TraceEvent("Wpf.MapSceneManager.Action", TraceEventType.Information, $"PreviewComplete {newScene.Center} {newScene.Zoom} {newScene.Tilt}");
            }
        }
Пример #4
0
        public GeoCoordinate ToGeoCoordinates(Point point, MapRenderingScene scene)
        {
            var    sceneView = CreateView(scene);
            double x, y;
            var    fromMatrix = sceneView.CreateFromViewPort(SceneSize.Width, SceneSize.Height);

            fromMatrix.Apply(point.X, point.Y, out x, out y);
            return(Map.Projection.ToGeoCoordinates(x, y));
        }
Пример #5
0
        public MapSceneManager(int historyCapacity = 5)
        {
            _historyCapacity = historyCapacity;
            _renderedScenes  = new Queue <MapRenderingScene>();
            _previewScene    = null;

            _renderer = new MapRenderer <RenderContext>(new DrawingRenderer2D());

            IsReady = true;
        }
Пример #6
0
        public View2D CreateView(MapRenderingScene scene)
        {
            var zoomFactor  = Map.Projection.ToZoomFactor(scene.Zoom);
            var sceneCenter = Map.Projection.ToPixel(scene.Center.Latitude, scene.Center.Longitude);
            var invertY     = (true != !Map.Projection.DirectionY);

            return(View2D.CreateFrom(sceneCenter[0], sceneCenter[1],
                                     SceneSize.Width, SceneSize.Height, zoomFactor,
                                     false, invertY, scene.Tilt));
        }
Пример #7
0
        public Point ToPixels(GeoCoordinate coordinate, MapRenderingScene scene)
        {
            var sceneView       = CreateView(scene);
            var projectionPoint = Map.Projection.ToPixel(coordinate);

            double x, y;
            var    fromMatrix = sceneView.CreateToViewPort(SceneSize.Width, SceneSize.Height);

            fromMatrix.Apply(projectionPoint[0], projectionPoint[1], out x, out y);
            return(new Point(x, y));
        }
Пример #8
0
        private void RenderScene(DrawingContext context, Size renderSize, MapRenderingScene scene)
        {
            var renderRect = new Rect(renderSize);

            if (scene.SceneImage == null && scene.PreviousScene?.SceneImage != null)
            {
                var newCenter = _mapSceneManager.ToPixels(scene.Center, scene.PreviousScene);
                var oldCenter = _mapSceneManager.ToPixels(scene.PreviousScene.Center, scene.PreviousScene);
                var offsetX   = oldCenter.X - newCenter.X;
                var offsetY   = oldCenter.Y - newCenter.Y;

                var scale        = _mapSceneManager.Map.Projection.ToZoomFactor(scene.Zoom) / _mapSceneManager.Map.Projection.ToZoomFactor(scene.PreviousScene.Zoom);
                var offsetXScale = (scene.PreviousScene.SceneImage.Width - renderSize.Width * scale) / 2 / scale;
                var offsetYScale = (scene.PreviousScene.SceneImage.Height - renderSize.Height * scale) / 2 / scale;

                context.PushTransform(new ScaleTransform(scale, scale));
                context.PushTransform(new TranslateTransform(offsetXScale, offsetYScale));
                context.PushTransform(new TranslateTransform(offsetX, offsetY));

                context.DrawImage(scene.PreviousScene.SceneImage, renderRect);
                context.Pop();
                context.Pop();
                context.Pop();
            }
            if (scene.SceneImage != null)
            {
                //context.PushOpacity(1, new DoubleAnimation(0, 1, new Duration(TimeSpan.FromMilliseconds(100))).CreateClock());
                //context.DrawRectangle(Background, null, renderRect);
                context.DrawImage(scene.SceneImage, renderRect);
                //context.Pop();
            }
            //else
            //{
            //    context.DrawRectangle(Background, null, renderRect);
            //}

            //if (scene.SceneImage == null)
            //{
            //    if (scene.PreviousScene != null)
            //    {
            //        if (scene.PreviousScene.SceneImage == null)
            //        {
            //            Console.WriteLine("RenderScene scene null");
            //        }
            //    }
            //    else
            //    {
            //        Console.WriteLine("RenderScene scene null");
            //    }
            //}
        }
Пример #9
0
 public void Preview(GeoCoordinate cener, double zoom, Degree tilt)
 {
     if (Map != null)
     {
         Logging.Log.TraceEvent("Wpf.MapSceneManager.Action", TraceEventType.Information, $"Preview {cener} {zoom} {tilt}");
         IsReady = false;
         Map.Pause();
         _previewScene = new MapRenderingScene(cener, zoom, tilt)
         {
             PreviousScene = GetLastScene()
         };
         OnRenderScene(_previewScene);
     }
 }
Пример #10
0
 private void OnRenderScene(MapRenderingScene scene)
 {
     if (scene.PreviousScene?.SceneImage != null || scene.SceneImage != null)
     {
         lock (_renderingScenesLock)
         {
             //Console.WriteLine("_renderingScenes count = "+_renderingScenes.Count);
             _renderingScenes.Push(scene);
             Logging.Log.TraceEvent("Wpf.MapControl.Action", TraceEventType.Information,
                                    $"OnRenderScene Push scene {scene.Center} {scene.Zoom} {scene.Tilt}");
         }
         Refresh();
     }
 }
Пример #11
0
        protected void OnRenderScene(MapRenderingScene scene)
        {
            var renderScene = RenderScene;

            renderScene?.Invoke(scene);
        }
Пример #12
0
        private void AdjustMapScene()
        {
            var suspending = !_isSuspendNotifyMapViewChanged;

            if (suspending)
            {
                SuspendNotifyMapViewChanged();
            }

            if (MapZoom < MapMinZoomLevel)
            {
                MapZoom = MapMinZoomLevel;
            }
            if (MapZoom > MapMaxZoomLevel)
            {
                MapZoom = MapMaxZoomLevel;
            }

            if (RenderSize.Width > 0 && RenderSize.Height > 0)
            {
                var box = MapBoundingBox ?? MaxMapBoundingBox;

                var scene          = new MapRenderingScene(MapCenter, MapZoom, MapTilt);
                var geoLeftTop     = _mapSceneManager.ToGeoCoordinates(new Point(0, RenderSize.Height), scene);
                var geoRightBottom = _mapSceneManager.ToGeoCoordinates(new Point(RenderSize.Width, 0), scene);

                var lat = MapCenter.Latitude;
                var lon = MapCenter.Longitude;

                var width  = geoRightBottom.Longitude - geoLeftTop.Longitude;
                var height = geoRightBottom.Latitude - geoLeftTop.Latitude;

                if (width < box.DeltaLon)
                {
                    if (geoLeftTop.Longitude < box.MinLon)
                    {
                        lon += box.MinLon - geoLeftTop.Longitude;
                    }
                    if (geoRightBottom.Longitude > box.MaxLon)
                    {
                        lon += box.MaxLon - geoRightBottom.Longitude;
                    }
                }
                else
                {
                    lon = box.Center.Longitude;
                }
                if (height < box.DeltaLat)
                {
                    if (geoLeftTop.Latitude < box.MinLat)
                    {
                        lat += box.MinLat - geoLeftTop.Latitude;
                    }
                    if (geoRightBottom.Latitude > box.MaxLat)
                    {
                        lat += box.MaxLat - geoRightBottom.Latitude;
                    }
                }
                else
                {
                    lat = box.Center.Latitude;
                }
                MapCenter = new GeoCoordinate(lat, lon);
            }

            if (suspending)
            {
                ResumeNotifyMapViewChanged(false);
            }
        }