コード例 #1
0
ファイル: MapPlotter.cs プロジェクト: ackratos/USTCMap
        public Point geoToView(double lat, double lon, iustc.map.data.Rectangle rect)
        {
            if (geoToViewRect != rect)
            {
                geoToViewRect = rect;
                Point p1 = Toolkit.geoToView(rect.north, rect.west);
                Point p2 = Toolkit.geoToView(rect.south, rect.east);
                geoToViewX1 = p1.X;
                geoToViewY1 = p1.Y;
                geoToViewX2 = p2.X;
                geoToViewY2 = p2.Y;
            }

            Point p = Toolkit.geoToView(lat, lon);
            float x = (float)((p.X - geoToViewX1) / (geoToViewX2 - geoToViewX1));
            float y = (float)((p.Y - geoToViewY1) / (geoToViewY2 - geoToViewY1));
            return new Point(x * size, y * size);
        }
コード例 #2
0
ファイル: MapPlotter.cs プロジェクト: ackratos/USTCMap
        public Tile plot(iustc.map.data.Path[] paths, iustc.map.data.Rectangle rect, int level)
        {
            //Deployment.Current.Dispatcher.BeginInvoke(() =>
            //    {
                    Canvas bitmap = new Canvas();
                    bitmap.Width = size + 2;
                    bitmap.Height = size + 2;

                    bitmap.Background = defaultPaint.Fill;

                    RectangleGeometry clipRect = new RectangleGeometry();
                    clipRect.Rect = new System.Windows.Rect(0, 0, size + 2, size + 2);
                    bitmap.Clip = clipRect;

                    // Step 1: plot ground
                    plotNature(bitmap, paths, rect);

                    // Step 2: plot road border
                    plotRoadBorder(bitmap, paths, rect, level);

                    //Step 3: plot roads
                    plotRoad(bitmap, paths, rect, level);

                    // Step 4: plot building
                    plotBuilding(bitmap, paths, rect);

                    Tile tile = new Tile(rect.north, rect.west, bitmap);
                //});

            return tile;
        }
コード例 #3
0
ファイル: MapPlotter.cs プロジェクト: ackratos/USTCMap
        private void plotRoadBorder(Canvas bitmap, iustc.map.data.Path[] paths, iustc.map.data.Rectangle rect, int level)
        {
            foreach (iustc.map.data.Path path in paths)
            {
                Tag tag = path.getTagByKey("road");
                if (tag == null)
                    continue;

                float unit = (float)(Toolkit.getMapScale(rect.clat(), rect.clon(), level) * size / Toolkit.METER_PER_INCH);
                float roadWidth = unit;
                if (tag.value.CompareTo("main") == 0)
                {
                    roadWidth = unit * ROAD_MAIN_WIDTH;
                }
                else if (tag.value.CompareTo("secondary") == 0)
                {
                    roadWidth = unit * ROAD_SECONDARY_WIDTH;
                }
                else if (tag.value.CompareTo("sideway") == 0)
                {
                    roadWidth = unit * ROAD_SIDEWAY_WIDTH;
                }
                else if (tag.value.CompareTo("street") == 0)
                {
                    roadWidth = unit * ROAD_STREET_WIDTH;
                }

                roadBorderPaint.StrokeThickness = roadWidth + ROAD_BORDER_WIDTH * 2;

                plotPath(bitmap, path, rect, roadBorderPaint, true);
            }
        }
コード例 #4
0
ファイル: MapPlotter.cs プロジェクト: ackratos/USTCMap
        private void plotPath(Canvas bitmap, iustc.map.data.Path path, iustc.map.data.Rectangle rect, Paint paint, bool isLine)
        {
            int index = path.getNextNodeIndex(0);
            if (index < 0)
                return;

            //            List<int> points = default(List<int>);
            PointCollection points = new PointCollection();

            Node node = (Node)path.content[index];
            Point point = geoToView(node.lat, node.lon, rect);
            Point startPoint = point;
            points.Add(point);
            while (true)
            {
                index = path.getNextNodeIndex(index + 1);
                if (index < 0)
                    break;
                node = (Node)path.content[index];
                point = geoToView(node.lat, node.lon, rect);
                points.Add(point);
            }

            if (isLine)
            {
                Polyline polyline = new Polyline();
                polyline.Points = points;
                polyline.Stroke = paint.Stroke;
                polyline.StrokeEndLineCap = paint.StrokeCap;
                polyline.StrokeStartLineCap = paint.StrokeCap;
                polyline.StrokeThickness = paint.StrokeThickness;
                polyline.Fill = paint.Fill;
                bitmap.Children.Add(polyline);
            }
            else
            {
                points.Add(startPoint);
                Polygon polygon = new Polygon();
                polygon.Points = points;
                polygon.Stroke = paint.Stroke;
                polygon.StrokeEndLineCap = paint.StrokeCap;
                polygon.StrokeStartLineCap = paint.StrokeCap;
                polygon.Fill = paint.Fill;
                bitmap.Children.Add(polygon);
            }
        }
コード例 #5
0
ファイル: MapPlotter.cs プロジェクト: ackratos/USTCMap
        private void plotRoad(Canvas bitmap, iustc.map.data.Path[] paths, iustc.map.data.Rectangle rect, int level)
        {
            foreach (iustc.map.data.Path path in paths)
            {
                Tag tag = path.getTagByKey("road");
                if (tag == null)
                    continue;

                float unit = (float)(Toolkit.getMapScale(rect.clat(), rect.clon(), level) * size / Toolkit.METER_PER_INCH);
                float roadWidth = unit;
                SolidColorBrush color = default(SolidColorBrush);
                if (tag.value.CompareTo("main") == 0)
                {
                    roadWidth = unit * ROAD_MAIN_WIDTH;
                    color = PlotterHelper.ROAD_MAIN_COLOR;
                }
                else if (tag.value.CompareTo("secondary") == 0)
                {
                    roadWidth = unit * ROAD_SECONDARY_WIDTH;
                    color = PlotterHelper.ROAD_SECONDARY_COLOR;
                }
                else if (tag.value.CompareTo("sideway") == 0)
                {
                    roadWidth = unit * ROAD_SIDEWAY_WIDTH;
                    color = PlotterHelper.ROAD_SIDEWAY_COLOR;
                }
                else
                {
                    continue;
                }
                roadPaint.StrokeThickness = roadWidth;
                roadPaint.Stroke = color;

                plotPath(bitmap, path, rect, roadPaint, true);
            }

            foreach (iustc.map.data.Path path in paths)
            {
                Tag tag = path.getTagByKey("road");
                if (tag == null)
                    continue;

                float unit = (float)Toolkit.getMapScale(rect.clat(), rect.clon(), level) * size / Toolkit.METER_PER_INCH;
                float roadWidth = unit;
                SolidColorBrush color = default(SolidColorBrush);
                if (tag.value.CompareTo("street") == 0)
                {
                    roadWidth = unit * ROAD_STREET_WIDTH;
                    color = PlotterHelper.ROAD_STREET_COLOR;
                }
                else
                {
                    continue;
                }
                roadPaint.StrokeThickness = roadWidth;
                roadPaint.Stroke = color;

                plotPath(bitmap, path, rect, roadPaint, true);
            }
        }
コード例 #6
0
ファイル: MapPlotter.cs プロジェクト: ackratos/USTCMap
        private void plotNature(Canvas bitmap, iustc.map.data.Path[] paths, iustc.map.data.Rectangle rect)
        {
            foreach (iustc.map.data.Path path in paths)
            {
                Tag tag = path.getTagByKey("nature");
                if (tag == null)
                    continue;

                if (tag.value.Equals("grass"))
                {
                    plotPath(bitmap, path, rect, grassPaint, false);
                }
                else if (tag.value.Equals("water"))
                {
                    plotPath(bitmap, path, rect, waterPaint, false);
                }
                else if (tag.value.Equals("river"))
                {
                    plotPath(bitmap, path, rect, riverPaint, false);
                }
            }
        }
コード例 #7
0
ファイル: MapPlotter.cs プロジェクト: ackratos/USTCMap
        private void plotBuilding(Canvas bitmap, iustc.map.data.Path[] paths, iustc.map.data.Rectangle rect)
        {
            foreach (iustc.map.data.Path path in paths)
            {
                Tag tag = path.getTagByKey("building");
                if (tag == null)
                    continue;
                if (tag.value.CompareTo("academic") == 0)
                {
                    buildingPaint.Fill = PlotterHelper.BUILDING_ACADEMIC_COLOR;
                }
                else if (tag.value.CompareTo("flat") == 0)
                {
                    buildingPaint.Fill = PlotterHelper.BUILDING_FLAT_COLOR;
                }
                else if (tag.value.CompareTo("sports") == 0)
                {
                    buildingPaint.Fill = PlotterHelper.BUILDING_SPORTS_COLOR;
                }
                else
                {
                    buildingPaint.Fill = PlotterHelper.BUILDING_DEFAULT_COLOR;
                }

                plotPath(bitmap, path, rect, buildingPaint, false);
            }
        }
コード例 #8
0
ファイル: MainPage.xaml.cs プロジェクト: ackratos/USTCMap
 private int fitZoomLevel(iustc.map.data.Rectangle rect)
 {
     Point p1 = Toolkit.geoToView(rect.north, rect.west);
     Point p2 = Toolkit.geoToView(rect.south, rect.east);
     double dx = p2.X - p1.X;
     double dy = p2.Y - p1.Y;
     for (int level = MIN_ZOOM_LEVEL; level <= MAX_ZOOM_LEVEL; level++)
     {
         double size = fullTileSize(level, scale);
         double w = dx * size, h = dy * size;
         if (w < this.getWidth() && h < this.getHeight())
             return level;
     }
     return MIN_ZOOM_LEVEL;
 }
コード例 #9
0
ファイル: MapPlotter_ob.cs プロジェクト: ackratos/USTCMap
        private void plotPath(WriteableBitmap bitmap, iustc.map.data.Path path, iustc.map.data.Rectangle rect, Paint paint)
        {
            int index = path.getNextNodeIndex(0);
            if (index < 0)
                return;

            Polygon temp = new Polygon();

            temp.Stroke = paint.Stroke;
            temp.Fill = paint.Fill;
            temp.StrokeEndLineCap = paint.StrokeCap;
            temp.StrokeStartLineCap = paint.StrokeCap;
            temp.StrokeThickness = paint.StrokeThickness;

            Node node = (Node)path.content[index];
            Point point = geoToView(node.lat, node.lon, rect);
            temp.Points.Add(point);
            while (true)
            {
                index = path.getNextNodeIndex(index + 1);
                if (index < 0)
                    break;
                node = (Node)path.content[index];
                point = geoToView(node.lat, node.lon, rect);
                temp.Points.Add(point);
            }
        }
コード例 #10
0
ファイル: MapPlotter_ob.cs プロジェクト: ackratos/USTCMap
        public Tile plot(iustc.map.data.Path[] paths, iustc.map.data.Rectangle rect, int level)
        {
            WriteableBitmap bitmap = new WriteableBitmap(size, size);

            // Step 1: plot ground
            plotNature(bitmap, paths, rect);

            // Step 2: plot road border
            plotRoadBorder(bitmap, paths, rect, level);

            // Step 3: plot roads
            plotRoad(bitmap, paths, rect, level);

            // Step 4: plot building
            plotBuilding(bitmap, paths, rect);

            Tile tile = new Tile(rect.north, rect.west, bitmap);

            return tile;
        }