Пример #1
0
        /// <summary>
        /// получение широты и долготы точки от базовой широты и долготы относительно смещения панели карты
        /// </summary>
        /// <param name="moveSize"></param>
        /// <param name="zoom"></param>
        /// <param name="baseLat"></param>
        /// <param name="baseLng"></param>
        /// <returns></returns>
        public virtual LatLng GetLatLngFromBaseLatLng(Size moveSize, int zoom, double baseLat, double baseLng)
        {
            //получаем заданную точку в координатах osm
            PointD osmPointFromLatLng             = SphericLatLngAndPxConverter.ConvertLatLngToPx(baseLat, baseLng, zoom);
            PointD osmPointFromLatLngFromMoveSize = new PointD(osmPointFromLatLng.X - moveSize.Width, osmPointFromLatLng.Y - moveSize.Height);

            return(SphericLatLngAndPxConverter.ConverPxInLatLng(osmPointFromLatLngFromMoveSize, zoom));
        }
Пример #2
0
        /// <summary>
        /// получение всех тайлов которые необходимы для отображения карты
        /// </summary>
        /// <param name="mapPaneBounds"></param>
        /// <param name="zoom"></param>
        /// <param name="lat"></param>
        /// <param name="lng"></param>
        /// <returns></returns>
        public virtual IEnumerable <MapTileBase> GetMapTilesForPlaceInfo(Rectangle mapPaneBounds, int zoom, double lat, double lng)
        {
            //коллекция тайлов
            List <MapTileBase> tilesForRequest = new List <MapTileBase>();
            //получаем заданную точку в координатах osm
            PointD osmPointFromLatLng = SphericLatLngAndPxConverter.ConvertLatLngToPx(lat, lng, zoom);
            //получаем координаты центра панели карты
            Point centerMapPanePoint = this.getPointOfCenterMapPaneBounds(mapPaneBounds);
            //тайл который будет располагаться в центре панели карты.
            OsmMapTile centerTile = new OsmMapTile(zoom);

            //координаты центрального тайла, для загрузки изображения.
            centerTile.TileCoords = new Point((int)Math.Floor(osmPointFromLatLng.X / centerTile.TileSize.Width), (int)Math.Floor(osmPointFromLatLng.Y / centerTile.TileSize.Height));
            //получаем смещение от центра
            Point osmCoordCenterTile = new Point((centerTile.TileCoords.X * centerTile.TileSize.Width) + (centerTile.TileSize.Width / 2),
                                                 (centerTile.TileCoords.Y * centerTile.TileSize.Height) + (centerTile.TileSize.Height / 2));
            //смещение заданной точки от центра тайла.
            Size offsetCenterTile = new Size((int)Math.Floor(osmCoordCenterTile.X - osmPointFromLatLng.X), (int)Math.Floor(osmCoordCenterTile.Y - osmPointFromLatLng.Y));

            //расчитываем координаты на панели, чтобы заданная точка в широте и долготе оказалась в центре панели
            centerTile.AppPaneCoords = new Point(
                centerMapPanePoint.X - (centerTile.TileSize.Width / 2) + offsetCenterTile.Width,
                centerMapPanePoint.Y - (centerTile.TileSize.Height / 2) + offsetCenterTile.Height);
            //получаем необходимое количество тайлов по черырем сторонам относительно центрального тайла
            int countTilesLeft   = 0;
            int countTilesTop    = 0;
            int countTilesRight  = 0;
            int countTilesBottom = 0;

            this.getCountTilesForMapPane(centerTile.AppPaneBounds, mapPaneBounds, centerTile.TileSize, out countTilesTop, out countTilesLeft, out countTilesBottom, out countTilesRight);
            //получаем общее количество тайлов по горизонтали
            int countTilesForWidth = countTilesLeft + countTilesRight + 1;
            //получаем общее количество тайлов по вертикали
            int countTilesForHeight = countTilesTop + countTilesBottom + 1;
            //получаем начальную osm координату по оси X
            int startTileOsmX = centerTile.TileCoords.X - countTilesLeft;
            //получаем начальную osm координату по оси Y
            int startTileOsmY = centerTile.TileCoords.Y - countTilesTop;
            //получаем начальную координату в панели карты по оси X
            int startTileAppX = centerTile.AppPaneCoords.X - (countTilesLeft * centerTile.TileSize.Width);
            //получаем начальную координату в панели карты по оси Y
            int startTileAppY = centerTile.AppPaneCoords.Y - (countTilesTop * centerTile.TileSize.Height);

            //раставляем тайлы по координатам osm и координатам панели карты.
            tilesForRequest.Clear();
            for (int j = 0; j < countTilesForHeight; j++)
            {
                for (int i = 0; i < countTilesForWidth; i++)
                {
                    OsmMapTile tile = new OsmMapTile(zoom);
                    tile.TileCoords    = new Point(startTileOsmX + i, startTileOsmY + j);
                    tile.AppPaneCoords = new Point(startTileAppX + (i * centerTile.TileSize.Width), startTileAppY + (j * centerTile.TileSize.Height));
                    tilesForRequest.Add(tile);
                }
            }
            return(tilesForRequest);
        }
Пример #3
0
        /// <summary>
        /// получение координат на панели приложения
        /// </summary>
        /// <param name="mapPanеBounds"></param>
        /// <param name="zoom"></param>
        /// <param name="currentLat"></param>
        /// <param name="currentLng"></param>
        /// <param name="baseLat"></param>
        /// <param name="baseLng"></param>
        /// <returns></returns>
        public virtual Point GetLocationInMapPaneFromLatLng(Rectangle mapPanеBounds, int zoom, double currentLat, double currentLng, double baseLat, double baseLng)
        {
            //получение координат приложения на панели карты от широты и долготы точки относительно базовой широты и долготы.
            //получаем базовую точку в координатах osm от базовых широты и долготы
            //(подразумевается, что базовые координаты (широта и долгота) расположены в центре панели карты.
            PointD osmBasePointFromLatLng = SphericLatLngAndPxConverter.ConvertLatLngToPx(baseLat, baseLng, zoom);
            //получаем заданную точку в координатах osm
            PointD osmCurrentPointFromLatLng = SphericLatLngAndPxConverter.ConvertLatLngToPx(currentLat, currentLng, zoom);
            //получаем смещение в пикселях относительно базовой координаты
            Size offsetCurrentOsmFromBase = new Size((int)Math.Floor(osmBasePointFromLatLng.X - osmCurrentPointFromLatLng.X),
                                                     (int)Math.Floor(osmBasePointFromLatLng.Y - osmCurrentPointFromLatLng.Y));
            //получаем координаты центра панели карты
            Point centerMapPanePoint = this.getPointOfCenterMapPaneBounds(mapPanеBounds);
            //получаем координаты точки на панели карты
            Point p = new Point(centerMapPanePoint.X - offsetCurrentOsmFromBase.Width, centerMapPanePoint.Y - offsetCurrentOsmFromBase.Height);

            return(p);
        }