经常坐地铁,却不知道地铁多少条线路?哪个站下车?今天就带领大家熟悉并绘制深圳地铁路线图。
WPF在绘制矢量图方面有非常强大的优势,利用WPF可以绘制出各种矢量图形,如线,圆,多边形,矩形,及组合图形。今天以绘制深圳地铁路线图为例,简述WPF在图形绘制方面的一些知识,仅供学习分享使用,如有不足之处,还请指正。
(资料图片)
与传统的.NET开发使用GDI+进行绘图不同,WPF拥有自己的一套图形API,绘图为矢量图。绘图可以在任何一种布局控件中完成,wpf会根据容器计算相应坐标。最常用的是Canvas和Grid。基本图形包括以下几个,都是Shaper类的派生类。
首先打开深圳地铁官网【https://www.szmc.net/map/】,可查看深圳地铁的路线图,如下所示:
通过对地铁官网的网络接口接收数据分析,可以获取地铁数据的原始JSON文件,将原始JSON文件保存到本地,在程序中进行引用,如下所示:
在得到shentie.json文件后,通过分析,构建模型类,如下所示:
1 namespace DemoSubway.Models 2 { 3 /// 4 /// 深圳地铁模型 5 /// 6 public class ShenTie 7 { 8 [JsonProperty("s")] 9 public string? Name { get; set; } 10 11 [JsonProperty("i")] 12 public string? Index { get; set; } 13 14 [JsonProperty("l")] 15 public SubwayLine[]? SubwayLines { get; set; } 16 17 [JsonProperty("o")] 18 public string? Obj { get;set; } 19 } 20 21 public class SubwayLine 22 { 23 [JsonProperty("st")] 24 public St[]? Sites { get; set; } 25 26 [JsonProperty("ln")] 27 public string? LineNumber { get; set; } 28 29 [JsonProperty("su")] 30 public string? Su { get; set; } 31 32 [JsonProperty("kn")] 33 public string? KName { get; set; } 34 35 [JsonProperty("c")] 36 public string[]? Circles { get;set; } 37 38 [JsonProperty("lo")] 39 public string? Lo { get; set; } 40 41 [JsonProperty("lp")] 42 public string[]? LinePosition { get; set; } 43 44 [JsonProperty("ls")] 45 public string? Ls { get; set; } 46 47 [JsonProperty("cl")] 48 public string? Color { get; set; } 49 50 [JsonProperty("la")] 51 public string? La { get; set; } 52 53 [JsonProperty("x")] 54 public string? X { get; set; } 55 56 [JsonProperty("li")] 57 public string? Li { get; set; } 58 } 59 60 public class St 61 { 62 [JsonProperty("rs")] 63 public string? Rs { get; set; } 64 65 [JsonProperty("udpx")] 66 public string? Udpx { get; set; } 67 68 [JsonProperty("su")] 69 public string? Su { get; set; } 70 71 [JsonProperty("udsu")] 72 public string? Udsu { get; set;} 73 74 [JsonProperty("n")] 75 public string? Name { get; set;} 76 77 [JsonProperty("en")] 78 public string? En { get; set; } 79 80 [JsonProperty("sid")] 81 public string? Sid { get; set; } 82 83 [JsonProperty("p")] 84 public string? Position { get; set; } 85 86 [JsonProperty("r")] 87 public string? R { get; set; } 88 89 [JsonProperty("udsi")] 90 public string? Udsi { get; set; } 91 92 [JsonProperty("t")] 93 public string? T { get; set;} 94 95 [JsonProperty("si")] 96 public string? Si { get; set; } 97 98 [JsonProperty("sl")] 99 public string? Sl { get; set;}100 101 [JsonProperty("udli")]102 public string? Udli { get; set; }103 104 [JsonProperty("poiid")]105 public string? Poiid { get; set; }106 107 [JsonProperty("lg")]108 public string? Lg { get; set; }109 110 [JsonProperty("sp")]111 public string? Sp { get; set; }112 }113 }通过反序列化,将shentie.json文件内容,加载到内存并实例化为ShenTie对象,在此需要用到第三方库【Newtonsoft.Json】,如下所示:
地铁路线图在WPF主页面显示,用Grid作为容器【subwayBox】,如下所示:
19 10 11 2412 1513 14 16 1817 19 2320 21 22
ShenTie对象创建成功后,就可以获取路线数据,然后创建地铁路线元素,如下所示:
1 private void Window_Loaded(object sender, RoutedEventArgs e) 2 { 3 string jsonFile = "shentie.json"; 4 JsonHelper jsonHelper = new JsonHelper(); 5 var shentie = jsonHelper.Deserialize(jsonFile); 6 this.tbTitle.Text = shentie.Name; 7 List lstSites = new List(); 8 for(int i = 0; i < shentie.SubwayLines?.Length; i++) 9 { 10 var subwayLine= shentie.SubwayLines[i]; 11 if(subwayLine != null) 12 { 13 //地铁线路 14 var color = ColorTranslator.FromHtml($"#{subwayLine.Color}");//线路颜色 15 var circles = subwayLine.Circles;//线路节点 16 Path line = new Path(); 17 PathFigureCollection lineFigures = new PathFigureCollection(); 18 PathFigure lineFigure = new PathFigure(); 19 lineFigure.IsClosed= false; 20 var start = circles?[0].Split(" ");//线路起始位置 21 lineFigure.StartPoint = new System.Windows.Point(int.Parse(start[0]), int.Parse(start[1])); 22 23 for (int j= 0;j< circles?.Length;j++) 24 { 25 var circle= circles[j].Split(" "); 26 LineSegment lineSegment = new LineSegment(new System.Windows.Point(int.Parse(circle[0]), int.Parse(circle[1])),true); 27 lineFigure.Segments.Add(lineSegment); 28 } 29 lineFigures.Add(lineFigure); 30 line.Data = new PathGeometry(lineFigures, FillRule.Nonzero, null); 31 line.Stroke = new SolidColorBrush(System.Windows.Media.Color.FromArgb(color.A, color.R, color.G, color.B)); 32 line.StrokeThickness = 4; 33 this.subwayBox.Children.Add(line); 34 //地铁站点 35 for (int j = 0; j < subwayLine.Sites?.Length; j++) 36 { 37 var site = subwayLine.Sites[j]; 38 if (site != null) 39 { 40 41 //站点标识,圆圈 42 Path siteCirclePath = new Path(); 43 var sitePosition = site?.Position?.Split(" "); 44 EllipseGeometry ellipse = new EllipseGeometry(); 45 ellipse.Center = new System.Windows.Point(int.Parse(sitePosition[0]), int.Parse(sitePosition[1])); 46 ellipse.RadiusX = 4; 47 ellipse.RadiusY=4; 48 siteCirclePath.Data=ellipse; 49 siteCirclePath.Fill = Brushes.White; 50 siteCirclePath.Stroke = new SolidColorBrush(System.Windows.Media.Color.FromArgb(color.A, color.R, color.G, color.B)); 51 siteCirclePath.Cursor= Cursors.Hand; 52 siteCirclePath.Focusable = true; 53 siteCirclePath.Tag = site?.Name; 54 siteCirclePath.MouseDown += SiteCirclePath_MouseDown; 55 this.subwayBox.Children.Add(siteCirclePath); 56 //站点名字 57 if (lstSites.Contains(site?.Name)) 58 { 59 continue;//对于交汇站点,只绘制一次 60 } 61 //站点名称 62 Path siteTextPath = new Path(); 63 FormattedText siteContent = new FormattedText(site?.Name,CultureInfo.CurrentCulture,FlowDirection.LeftToRight,new Typeface("Arial"),14,Brushes.Black, 1.25); 64 var x = int.Parse(sitePosition[0]); 65 var y = int.Parse(sitePosition[1]); 66 if (j + 1 < subwayLine.Sites?.Length) 67 { 68 //站点位置适当偏移 69 var next = subwayLine.Sites[j + 1]?.Position?.Split(" "); 70 var nextx = int.Parse(next[0]); 71 var nexty = int.Parse(next[1]); 72 if (x == nextx) 73 { 74 x = x + 6; 75 } 76 else if (y == nexty) 77 { 78 y = y + 6; 79 } 80 else 81 { 82 x = x + 1; 83 y = y + 1; 84 } 85 } 86 Geometry geometry = siteContent.BuildGeometry(new System.Windows.Point(x, y)); 87 siteTextPath.Data = geometry; 88 siteTextPath.Stroke = Brushes.Black; 89 siteTextPath.Focusable = true; 90 siteTextPath.Cursor = Cursors.Hand; 91 siteTextPath.MouseDown += SiteTextPath_MouseDown; 92 siteTextPath.Tag = site?.Name; 93 this.subwayBox.Children.Add(siteTextPath); 94 lstSites.Add(site?.Name); 95 } 96 } 97 98 var kName = subwayLine.KName;//线路名称 99 var linePosition= subwayLine.LinePosition?[0].Split(" ");100 if(kName != null)101 {102 Path lineNamePath = new Path();103 FormattedText lineNameText = new FormattedText(kName, CultureInfo.CurrentCulture,FlowDirection.LeftToRight,new Typeface("Arial"),16,Brushes.Black,1.25);104 var lineX = int.Parse(linePosition[0]);105 var lineY = int.Parse(linePosition[1]);106 if (subwayLine.LineNumber == "1")107 {108 lineX = lineX - 10;109 lineY = lineY + 20;110 }111 Geometry geometry = lineNameText.BuildGeometry(new System.Windows.Point(lineX, lineY));112 lineNamePath.Data=geometry;113 lineNamePath.Stroke = new SolidColorBrush(System.Windows.Media.Color.FromArgb(color.A, color.R, color.G, color.B));114 this.subwayBox.Children.Add(lineNamePath);115 }116 }117 }118 } 本示例效果图如下所示:
在获取的JSON文件中,有些属性名都是简写,所以在编写示例代码过程中,对有些属性的理解并不准确,需要不断测试优化,绘制出的地铁路线图可能与实际存在稍微的差异,如站点名称,路线名称等内容的位置。
以上就是本篇文章的全部内容,旨在学习分享,传播知识。
标签:
经常坐地铁,却不知道地铁多少条线路?哪个站下车?今天就带领大家熟悉并绘制深圳地铁路线图。WPF在绘制矢
6月1日电,有投资者提问华阳集团,小米明年将量产第一款车型,公司是否已经拿到小米汽车的订单?华阳集团回
“这是我们看到换工作的人的工资增幅下降整整一个百分点的第二个月,薪资增长正在大幅放缓,尽管就业强劲,
水星家纺(SH603365,收盘价:14 19元)6月1日晚间发布公告称,截至2023年05月31日,公司通过集中竞价交易
自如的家装账,家装,自如,装修,房源,硬装,家居,电视背景墙
,育碧宣布《刺客信条:幻景》将首发登陆Ubisoft+服务,包含PC和Xbox。Ubisoft+是育碧旗下的游戏订阅服务
一、申请适用对象及条件年满6周岁(2017年8月31日前出生),具备学习和自理能力的外来务工人员随迁子女。以家
1、首先,基金赎回手续费的第一个计算公式是,手续费等于赎回费率乘以赎回总额。2、然后就是基金赎回的手续
华龙网-新重庆客户端讯(记者梁浩楠)装表接电、不停电作业、电缆制作……6月1日,川渝首届电力技能技术竞
IT之家6月1日消息,当地时间5月31日,美国能源部宣布向八家公司提供4600万美元(当前约3 27亿元人民币)的
1、第一届春晚是哪一年2、1983年2月12日晚8点开始。当时条件很艰苦,第一次在全国观众面前直播,对中国电视
5月25日,2023IDC中国工业互联网峰会在深圳开幕。此次峰会以“数实融合,重构工业生态”为主题,汇聚工业互
近日,委内瑞拉全国代表大会执政党议员鲁道夫·桑斯在接受总台记者采访时表示,美国和北约向乌克兰提供大量
1、班级公约可以写班级记录以及规定。2、一、仪表与道德进校说声老师好,相互问候有礼貌。3、尊敬师长,团
筹划避税770万元存争议。
五菱可真是想把微型车市场玩出花来,本就有宏光MINIEV占据了不少的市场份额,而2021年11月推出的305km纯电
来源:中国驻墨西哥大使馆 -2023-06 0114:112 中国驻墨西哥大使馆关于美方以参与非法药品生产为由
外观和真手机一模一样,甚至屏幕还能亮……十几二十元的模型手机,正在学生群体中流行开来。而孩子买它的目
5月31日,原本计划投资500亿、意在“打造湾区新地标”的深圳世茂深港国际中心,被曝遭债权人中信信托申请执
本报(chinatimes net cn)记者付乐冉学东北京报道消费金融行业正式迎来了第31家消费金融公司。5月31日晚间
2023年6月1日,果麦文化(301052 SZ)公告,董事会于近日收到公司北京产品部总编辑于桐先生的书面辞职报告
1、风雨哈佛路主要讲的是一个女孩艰辛上了哈佛的过程,她的父母是毒贩并且都有艾滋,母亲在她13岁的时候离
今天(6月1日)起,我国婚姻登记“跨省通办”的试点省份扩大到21个省份,在这些省份办理婚姻登记不用返回原
6月1日,国台办网站更新显示,陈斌华已任国台办新闻局副局长、发言人。新华社“十佳记者”履新国台办发言人
用大铁锅演示中国天眼原理、带孩子们用塑料瓶造“火箭”冲上百米高空……近年来,越来越多科普短视频成为网
无固定期限劳动合同,是指用人单位与劳动者约定无确定终止时间的劳动合同。用人单位解除无固定期限劳动合同
精伦电子最新股东户数4 39万户,低于行业平均水平。公司户均持有流通股份1 12万股;户均流通市值3 7万元。
如今,年轻人在企业类型的选择上,对国央企日趋青睐。据猎聘大数据研究院发布的《2022应届大学毕业生就业数
云浮市气象台发布高温黄色预警【III级 较重】【2023-06-01】预计未来三天,本地最高气温将降至35℃左右,云
新华社|作者周蕊潘洁新开发银行近日在上海举行第八届理事会年会。新开发银行行长罗塞夫介绍,银行将继续支
Copyright © 2015-2022 西南服装网版权所有 备案号:皖ICP备2022009963号-8 联系邮箱:39 60 29 14 2@qq.com