最新要闻
- 比亚迪前5月新能源汽车销量超100万辆 同比增长97.63%
- 5699元起 moto razr 40 Ultra发布:3.6英寸外屏比iPhone 4还大
- 【天天热闻】比亚迪5月销量破24万!各车型销量出炉:四款车超3万辆
- 折叠屏超级卷王!moto razr 40发布:只要3999元起
- Wi-Fi 7真实网速狂飙2千兆!2倍碾压Wi-Fi 6、首发蓝牙5.4
- 微速讯:小折叠屏终极形态!moto razr 40 Ultra预售:顶配版卖6399元
- 银行也会现金流紧张吗?贵阳、重庆银行一年拆入10倍于拆出 每日时讯
- 看热讯:疾控能力提升专题培训,各省积极推进疾控局挂牌工作
- 当前热门:意大利版五菱MINI诞生!菲亚特“米老鼠”亮相:萌翻了
- 【天天时快讯】899元 罗技推出MX KEYS S键盘:球形凹面按键
- 10万辆无一自燃!极氪5月交付8687辆 同比增长100%
- 折起来一面“全是屏”:moto razr 40 Ultra外屏尺寸达3.6英寸
- 即时看!久违了!5折发车:QQ音乐豪华绿钻会员年卡108元限时大促
- 2022年长江干流安徽段总体水质为优 环球新要闻
- 斯坦福大学教授称地球上100%存在外星人 或将影响文明的发展
- 研究称近7成的年轻人一般会拖到0点后入睡 多数人为报复性熬夜
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
WPF绘制深圳地铁路线图
经常坐地铁,却不知道地铁多少条线路?哪个站下车?今天就带领大家熟悉并绘制深圳地铁路线图。
WPF在绘制矢量图方面有非常强大的优势,利用WPF可以绘制出各种矢量图形,如线,圆,多边形,矩形,及组合图形。今天以绘制深圳地铁路线图为例,简述WPF在图形绘制方面的一些知识,仅供学习分享使用,如有不足之处,还请指正。
WPF图形概述
与传统的.NET开发使用GDI+进行绘图不同,WPF拥有自己的一套图形API,绘图为矢量图。绘图可以在任何一种布局控件中完成,wpf会根据容器计算相应坐标。最常用的是Canvas和Grid。基本图形包括以下几个,都是Shaper类的派生类。
【资料图】
- Line,直线段,可以设置Stroke
- Rectangle,有Stroke也有Fill
- Ellipse,椭圆,同上
- Polygon,多边形。由多条直线线段围成的闭合区域,同上。
- Polyline,折线,不闭合,由多条首尾相接的直线段组成
- Path,路径,闭合。可以由若干直线、圆弧、贝塞尔曲线(由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋)组成。很强大。
地铁官网效果
首先打开深圳地铁官网【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文件中,有些属性名都是简写,所以在编写示例代码过程中,对有些属性的理解并不准确,需要不断测试优化,绘制出的地铁路线图可能与实际存在稍微的差异,如站点名称,路线名称等内容的位置。
以上就是本篇文章的全部内容,旨在学习分享,传播知识。
关键词:
-
2023-06-01:讲一讲Redis常见数据结构以及使用场景。
2023-06-01:讲一讲Redis常见数据结构以及使用场景。答案2023-06-01: 字符串(String)**适合场景****缓
来源: WPF绘制深圳地铁路线图
2023-06-01:讲一讲Redis常见数据结构以及使用场景。
今日快讯:2023 五月联考游记
比亚迪前5月新能源汽车销量超100万辆 同比增长97.63%
5699元起 moto razr 40 Ultra发布:3.6英寸外屏比iPhone 4还大
【天天热闻】比亚迪5月销量破24万!各车型销量出炉:四款车超3万辆
折叠屏超级卷王!moto razr 40发布:只要3999元起
Wi-Fi 7真实网速狂飙2千兆!2倍碾压Wi-Fi 6、首发蓝牙5.4
微速讯:小折叠屏终极形态!moto razr 40 Ultra预售:顶配版卖6399元
银行也会现金流紧张吗?贵阳、重庆银行一年拆入10倍于拆出 每日时讯
DWG文件的设计规范 V4.5.1(中英对照版)
linux 性能自我学习 ———— cpu 高怎么办 [三]
环球看热讯:债市日报:6月1日
看热讯:疾控能力提升专题培训,各省积极推进疾控局挂牌工作
当前热门:意大利版五菱MINI诞生!菲亚特“米老鼠”亮相:萌翻了
【天天时快讯】899元 罗技推出MX KEYS S键盘:球形凹面按键
10万辆无一自燃!极氪5月交付8687辆 同比增长100%
折起来一面“全是屏”:moto razr 40 Ultra外屏尺寸达3.6英寸
即时看!久违了!5折发车:QQ音乐豪华绿钻会员年卡108元限时大促
2022年长江干流安徽段总体水质为优 环球新要闻
记录--面试官:“你知道什么情况下 HTTPS 不安全么”
虹科干货 | 虹科Redis企业版数据库的延迟如此之小,proxy功不可没!
C温故补缺(十七):动态链接(ELF,PIC,GOT,PLT)|视点
volatile与java内存模型_全球观热点
16)创建存储过程-今日热闻
斯坦福大学教授称地球上100%存在外星人 或将影响文明的发展
研究称近7成的年轻人一般会拖到0点后入睡 多数人为报复性熬夜
爱马仕因产品质量不合格 遭市场监管局罚款30.51万元
谷歌投资《瞬息全宇宙》幕后技术公司 将加速AI在影视创作领域的进展
海外知名种子网站RARBG宣布闭站 称众多因素导致其难以支持日常开销
中国徐工连续3年稳居全球前三 总销售额为该榜单有史以来最高数字
全球看热讯:每日机构分析:6月1日
《变形金刚7》水墨武侠风海报发布 将于6月9日登陆内地院线
两名亚马逊员工从仓库盗取《塞尔达传说》实体游戏及周边 用于转卖获利
任天堂现已停止在俄罗斯的eShop游戏和软件销售 账户信息即将删除
经典奇幻动漫《JOJO的奇妙冒险》音乐剧即将推出 于东京帝国剧场开演
天天即时看!RTX 4070 618处境尴尬:比RTX 4060贵太多
第一稳了!比亚迪:5月新能源汽车销售24.02万辆 天天讯息
世界播报:辽宁突发龙卷风 行驶中的车辆被卷起:科普遇龙卷风如何自救
观众称花千元在演唱会上看柱子:主办方称事先不知情
女硕士诈骗千万元花三百万买游戏装备!获刑十三年
饿了么太狠:面个高级Java,抖这多硬活、狠活(饿了么面试真题)
vue xlsx组件 导出的excel表头插入内容-世界观天下
怎么冻结表格前三行前三列_怎么冻结表格前三行
今日热议:一年4.3万人死于车祸!美国NHTSA宣布:所有新车都要安装自动刹车系统
百度网盘从苹果APP Store下架 原因揭晓:很快会恢复正常 焦点热闻
环球报道:河南一村庄修路挖出大石龟:名为“赑屃”、或有古墓
郭帆:在摸索如何用AI做《流浪地球3》 当前速递
媲美风扇散热!索泰展示新款迷你主机:主动散热模块首次应用
察右后旗农发行开展案防案件处置应急演练
Java学习问题记录
业务安全情报第16期 | 大促8成优惠券竟被“羊毛党”抢走!?
精选!DNS隧道流量分析
短讯!Redmi神秘新机入网:支持5G异网漫游
今日快讯:3年超长质保YYDS!魅族618开门红:魅族手机销额增速第一
黑美人鱼泪奔!《小美人鱼》海外也没人看 白人观众无视:收支平衡成笑谈
开放世界游戏《仙剑世界》首测定档6月17日:招募已开启
三色激光色彩更纯!Vidda C1S 4K投影仪图赏
当前热文:NixOS 23.05系统发布:
焦点速递!14-按键消抖
9秒被骗245万元?AI火了,骗子也来了! 每日热点
科创板收盘播报:科创50指数跌0.03% 新相微较发行价涨88.46%
人民币兑美元中间价报7.0965,调贬144个基点-焦点速讯
治愈癌症不再遥不可及 罗氏抗癌神药“起死回生”
环球今头条!女子输液被拔针扎进水桶:系摆拍 已行拘
最新资讯:人民文娱评《小美人鱼》争议:别乱给国内观众扣帽子
全球微资讯!AITO问界5月交付5629辆!华为: 和赛力斯一起造最好的车
当前时讯:中国徐工连续3年稳居全球前三 挖掘机四斗就能装满百吨级矿车
波司登云原生微服务治理探索 环球微资讯
搞事我们是认真的!TDengine 周边大礼包走起,数量有限先到先得
环球微速讯:【终极计算平台】上海道宁为您提供Wolfram技术,支持跨桌面、云、服务器和移动设备的强大工作流程
2023年湖北随州曾都区中小学教师公开招聘面试初步人选资格审查公告 全球资讯
雷军从长城挖来了明星高管
全球热议:还是西餐便宜?城市上班族吐槽吃不起中式快餐:一顿40+很正常
比亚迪的“常压油箱” 不会成为中国版“排放门”
憋回去的便便都去哪了?知道真相的人都再也不敢憋了
选用A级大青梅!溜溜梅经典系列大促:5件到手34.9元|热讯
MySQL视图
天天即时:[日志管理] 启动程序时,因报“log4j-slf4j-impl cannot be present with log4j-to-slf4j”错误而导
从“分离焦虑”到融入集体 看幼儿园“小托班”如何带娃
天天滚动:夏季这种穿搭更火,叫“上面开会、下面约会”,谁穿了都很洋气
美国芯片大厂德州仪器无底线降价:针对国内芯片公司 就是比国产便宜 当前热讯
襄阳一初中学生集体宣誓终生不买烟 做不抽烟新一代:网友点赞全国推广
环球观速讯丨Https加密原理:SSL/TLS四次握手过程(转载)
统信UOS系统开发笔记(二):国产统信UOS系统搭建Qt开发环境安装Qt5.12 世界观焦点
掌握嵌入式Linux编程1开始
linux 性能自我学习 ———— cpu 切换带来的性能损耗 [二] 世界热点
介绍.NET几种人脸识别组件
诺德基金张昳泓:市场板块分化明显,经济呈现弱复苏态势-环球速讯
现实版《速度与激情》 女司机误将拖车当上坡上演飞车特技
奶牛听着音乐按摩挤奶!认养一头牛纯牛奶大促:74.9元3箱 天天看热讯
入门即满配成标杆!岚图5月交付新车3003辆 同比大涨231%
集团破产重整 资产被轮番拍卖!众泰董事长辞职
天天热资讯!六一演出现场的最美妈妈团 一身旗袍扭腰跳舞太惊艳:网友直呼身材颜值绝
玖章算术NineData荣获信通院“生成式人工智能技术和应用优秀案例”奖|天天视讯
鹤壁市浚县卫贤镇尚村_貉子皮尚村最新价格|环球快资讯
阿里云AI新产品“通义听悟”重磅发布:快科技邀你免费用!
45元一杯"智商税"!酸奶刺客收割年轻人钱包 世界快讯
环球视讯!不愧为工作狂!马斯克深夜到访特斯拉上海超级工厂:查看新款Model 3
首发799元起 Redmi电竞显示器G27/G27Q开售:165Hz超高刷 全球快看