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); }
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; }
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); } }
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); } }
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); } }
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); } } }
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); } }
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; }
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); } }
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; }