From 2bea18a025db331ff148912b9c5849af0e90edb9 Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Mon, 5 Apr 2021 14:22:49 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=8D=87=E7=BA=A7808=E5=BA=93=202.=E4=BF=AE?= =?UTF-8?q?=E6=94=B9AntDesign=E5=8D=87=E7=BA=A7=E5=90=8E=E4=BA=A7=E7=94=9F?= =?UTF-8?q?=E7=9A=84=E5=8F=98=E5=8C=96=203.=E5=A2=9E=E5=8A=A0=E7=BB=8F?= =?UTF-8?q?=E7=BA=AC=E5=BA=A6=E8=BD=AC=E6=8D=A2=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/JTTools/JTTools.csproj | 19 +- src/JTTools/Pages/Index.razor | 3 +- src/JTTools/Pages/JT1078Pack.razor | 84 +++++---- src/JTTools/Pages/JT19056Analyze.razor | 15 +- src/JTTools/Pages/JT808Analyze.razor | 19 +- src/JTTools/Pages/JT809Analyze.razor | 26 +-- src/JTTools/Pages/Map.razor | 127 +++++++++++++ src/JTTools/Pages/_Host.cshtml | 5 + src/JTTools/Shared/NavMenu.razor | 5 +- src/JTTools/Utils/Coordtransform.cs | 237 +++++++++++++++++++++++++ src/JTTools/wwwroot/js/map.js | 22 +++ 11 files changed, 488 insertions(+), 74 deletions(-) create mode 100644 src/JTTools/Pages/Map.razor create mode 100644 src/JTTools/Utils/Coordtransform.cs create mode 100644 src/JTTools/wwwroot/js/map.js diff --git a/src/JTTools/JTTools.csproj b/src/JTTools/JTTools.csproj index 512078a..14bf382 100644 --- a/src/JTTools/JTTools.csproj +++ b/src/JTTools/JTTools.csproj @@ -3,21 +3,22 @@ net5.0 1.0.1 + 2a42ef2e-4572-418c-b59d-bf2486f32108 - + - - - - + + + + - - - - + + + + diff --git a/src/JTTools/Pages/Index.razor b/src/JTTools/Pages/Index.razor index b9e9702..648e1e7 100644 --- a/src/JTTools/Pages/Index.razor +++ b/src/JTTools/Pages/Index.razor @@ -6,6 +6,7 @@ 支持锐明808公交业务扩展协议
支持主动安全附件(苏标)分析工具
- 增加808分包解析 + 增加808分包解析
+ 增加地图-经纬度解析
\ No newline at end of file diff --git a/src/JTTools/Pages/JT1078Pack.razor b/src/JTTools/Pages/JT1078Pack.razor index 3611b48..0f80263 100644 --- a/src/JTTools/Pages/JT1078Pack.razor +++ b/src/JTTools/Pages/JT1078Pack.razor @@ -14,9 +14,11 @@ @using System.ComponentModel.DataAnnotations; @using System.Text.Json; - + + + + @if (MsgType == "0x9101") @@ -40,17 +42,21 @@ 通道号 - + + + + + + + + - + + + + @@ -69,21 +75,27 @@ else if (MsgType == "0x9102") 通道号 - + + + + + + + - + + + + + - + + + + @@ -110,12 +122,14 @@ else if (MsgType == "0x9102") JT1078Serializer = jT808_JT1078_Config.GetSerializer(); } - void OnSelectMsgType(OneOf, LabeledValue, IEnumerable> value, - OneOf> option) + + + void OnSelectMsgType(string value) { - MsgType = value.Value.ToString(); + MsgType = value; } + void Pack() { try @@ -129,10 +143,10 @@ else if (MsgType == "0x9102") header.TerminalPhoneNo = jT_0X9101_Form.Sim; jT808Package.Header = header; JT808_0x9101 jT808_0X9101 = new JT808_0x9101(); - jT808_0X9101.ServerIPAddress = jT_0X9101_Form.IPAddress; - jT808_0X9101.ServerVideoChannelTcpPort = (ushort)jT_0X9101_Form.TcpPort; - jT808_0X9101.ServerVideoChannelUdpPort = (ushort)jT_0X9101_Form.UdpPort; - jT808_0X9101.LogicalChannelNo = jT_0X9101_Form.LogicalChannelNo; + jT808_0X9101.ServerIp = jT_0X9101_Form.IPAddress; + jT808_0X9101.TcpPort = (ushort)jT_0X9101_Form.TcpPort; + jT808_0X9101.UdpPort = (ushort)jT_0X9101_Form.UdpPort; + jT808_0X9101.ChannelNo = jT_0X9101_Form.LogicalChannelNo; jT808_0X9101.DataType = byte.Parse(jT_0X9101_Form.DataType); jT808_0X9101.StreamType = byte.Parse(jT_0X9101_Form.StreamType); jT808Package.Bodies = jT808_0X9101; @@ -147,10 +161,10 @@ else if (MsgType == "0x9102") header.TerminalPhoneNo = jT_0x9102_Form.Sim; jT808Package.Header = header; JT808_0x9102 jT808_0X9102 = new JT808_0x9102(); - jT808_0X9102.LogicalChannelNo = jT_0x9102_Form.LogicalChannelNo; + jT808_0X9102.ChannelNo = jT_0x9102_Form.LogicalChannelNo; jT808_0X9102.ControlCmd = byte.Parse(jT_0x9102_Form.ControlCmd); jT808_0X9102.CloseAVData = byte.Parse(jT_0x9102_Form.CloseAVData); - jT808_0X9102.SwitchStreamType = byte.Parse(jT_0x9102_Form.SwitchStreamType); + jT808_0X9102.StreamType = byte.Parse(jT_0x9102_Form.SwitchStreamType); jT808Package.Bodies = jT808_0X9102; HexData = JT1078Serializer.Serialize(jT808Package).ToHexString(); } diff --git a/src/JTTools/Pages/JT19056Analyze.razor b/src/JTTools/Pages/JT19056Analyze.razor index 4c43013..89bd917 100644 --- a/src/JTTools/Pages/JT19056Analyze.razor +++ b/src/JTTools/Pages/JT19056Analyze.razor @@ -4,11 +4,13 @@ @using JT808.Protocol.Extensions; @using JTTools.Configs; @inject IJT808Config Config -@using OneOf; - + + + + @@ -35,10 +37,9 @@ string wayType = "up"; - private void OnSelectWayType(OneOf, LabeledValue, IEnumerable> value, - OneOf> option) + private void OnSelectWayType(string value) { - wayType = value.Value.ToString(); + wayType = value; switch (wayType) { case "up": diff --git a/src/JTTools/Pages/JT808Analyze.razor b/src/JTTools/Pages/JT808Analyze.razor index 53990b4..9d8f261 100644 --- a/src/JTTools/Pages/JT808Analyze.razor +++ b/src/JTTools/Pages/JT808Analyze.razor @@ -14,11 +14,13 @@ @using OneOf; 如有分包,请换行区分。
- + + + + + + @@ -63,8 +65,7 @@ isOpen = !isOpen; } - private void OnSelectProtocolType(OneOf, LabeledValue, IEnumerable> value, - OneOf> option) + private void OnSelectProtocolType(string value) { if ("JT808_JT1078" == protocolType) { @@ -74,8 +75,8 @@ { HexData = HexDataTmp; } - protocolType = value.Value.ToString(); - StateHasChanged(); + protocolType = value; + //StateHasChanged(); } private void OnAreaTextPressEnter(KeyboardEventArgs eventArgs) diff --git a/src/JTTools/Pages/JT809Analyze.razor b/src/JTTools/Pages/JT809Analyze.razor index 67cb427..79bc37c 100644 --- a/src/JTTools/Pages/JT809Analyze.razor +++ b/src/JTTools/Pages/JT809Analyze.razor @@ -13,14 +13,18 @@ @inject JT809_2011_Config Config2011 @inject JT809_2019_Config Config2019 - + + + + - + + + + @if (encryptType == "encrypt") @@ -81,10 +85,9 @@ isOpen = !isOpen; } - public void OnSelectVersion(OneOf, LabeledValue, IEnumerable> value, - OneOf> option) + public void OnSelectVersion(string value) { - this.version = value.Value.ToString(); + this.version = value; switch (version) { case "v2011": @@ -97,10 +100,9 @@ StateHasChanged(); } - private void OnSelectEncryptType(OneOf, LabeledValue, IEnumerable> value, - OneOf> option) + private void OnSelectEncryptType(string value) { - encryptType = value.Value.ToString(); + encryptType = value; StateHasChanged(); } diff --git a/src/JTTools/Pages/Map.razor b/src/JTTools/Pages/Map.razor new file mode 100644 index 0000000..3e8d5f4 --- /dev/null +++ b/src/JTTools/Pages/Map.razor @@ -0,0 +1,127 @@ +@page "/map" + +@using System.Text; +@using System.Text.Encodings.Web; +@using System.Text.Unicode; +@using System.ComponentModel.DataAnnotations; +@using System.Text.Json; +@inject IJSRuntime JsRuntime + + + WGS84 + GCJ02 + BD09 + +
+ + 经纬度 + + + +
+ + WGS84坐标系 + +
+ + GCJ02坐标系 + +
+ + BD09坐标系 + +
+@if (isOpen) +{ + +
+} + +
+ +@code { + + string coordinateType = "GCJ02"; + + private string LngLat= "113.87132,22.568962"; + + private string WGS84_LngLat; + + private string GCJ02_LngLat; + + private string BD09_LngLat; + + private string ErrerMessage; + + private bool isOpen = false; + + protected override async void OnInitialized() + { + await JsRuntime.InvokeVoidAsync("mapInit"); + } + + void OnDismiss() + { + isOpen = !isOpen; + } + + void OnSelectedCoordinateTypeChanged(string e) + { + if (string.IsNullOrEmpty(LngLat)) + { + return; + } + string[] arr = LngLat.Split(new string[]{ ",", ",", "|", ":" }, StringSplitOptions.RemoveEmptyEntries); + if (arr.Length == 2) + { + if(double.TryParse(arr[0], out double lng) && double.TryParse(arr[1], out double lat)) + { + if(e== "WGS84") + { + WGS84_LngLat = $"{lng},{lat}"; + var gcj02 = Coordtransform.Wgs84togcj02(lng, lat); + GCJ02_LngLat = $"{gcj02[0]},{gcj02[1]}"; + var bd09 = Coordtransform.Wgs84tobd09(lng, lat); + BD09_LngLat = $"{bd09[0]},{bd09[1]}"; + } + else if (e == "GCJ02") + { + GCJ02_LngLat = $"{lng},{lat}"; + var wgs84 = Coordtransform.Gcj02towgs84(lng, lat); + WGS84_LngLat = $"{wgs84[0]},{wgs84[1]}"; + var bd09 = Coordtransform.Gcj02tobd09(lng, lat); + BD09_LngLat = $"{bd09[0]},{bd09[1]}"; + } + else if (e == "BD09") + { + BD09_LngLat = $"{lng},{lat}"; + var wgs84 = Coordtransform.Bd09towgs84(lng, lat); + WGS84_LngLat = $"{wgs84[0]},{wgs84[1]}"; + var gcj02 = Coordtransform.Bd09togcj02(lng, lat); + GCJ02_LngLat = $"{gcj02[0]},{gcj02[1]}"; + } + } + } + } + + [JSInvokable] + public void Convert() + { + OnSelectedCoordinateTypeChanged(coordinateType); + } + + [JSInvokable] + public async void CreateMarker() + { + if (string.IsNullOrEmpty(GCJ02_LngLat)) + { + return; + } + string[] arr = GCJ02_LngLat.Split(',', StringSplitOptions.RemoveEmptyEntries); + await JsRuntime.InvokeVoidAsync("createMarker", arr); + } +} diff --git a/src/JTTools/Pages/_Host.cshtml b/src/JTTools/Pages/_Host.cshtml index 39a55f8..75a627c 100644 --- a/src/JTTools/Pages/_Host.cshtml +++ b/src/JTTools/Pages/_Host.cshtml @@ -16,12 +16,17 @@ + + + + diff --git a/src/JTTools/Shared/NavMenu.razor b/src/JTTools/Shared/NavMenu.razor index 93f0b53..72331a5 100644 --- a/src/JTTools/Shared/NavMenu.razor +++ b/src/JTTools/Shared/NavMenu.razor @@ -17,8 +17,11 @@ JT19056分析工具 - + JTActiveSafety分析工具 + + 地图-经纬度解析 + diff --git a/src/JTTools/Utils/Coordtransform.cs b/src/JTTools/Utils/Coordtransform.cs new file mode 100644 index 0000000..9bd8893 --- /dev/null +++ b/src/JTTools/Utils/Coordtransform.cs @@ -0,0 +1,237 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace JTTools +{ + public class Coordtransform + { + //定义一些常量 + private const double x_PI = 3.14159265358979324 * 3000.0 / 180.0; + private const double PI = 3.1415926535897932384626;// π + private const double a = 6378245.0;// 长半轴 + private const double ee = 0.00669342162296594323;// 偏心率平方 + + /// + /// 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 + /// 即 百度 转 谷歌、高德 + /// + /// + /// + /// + public static double[] Bd09togcj02(double bd_lon, double bd_lat) + { + double x = bd_lon - 0.0065; + double y = bd_lat - 0.006; + double z = Math.Sqrt(x * x + y * y) - 0.00002 * Math.Sin(y * x_PI); + double theta = Math.Atan2(y, x) - 0.000003 * Math.Cos(x * x_PI); + double gg_lng = z * Math.Cos(theta); + double gg_lat = z * Math.Sin(theta); + + return new[] { gg_lng, gg_lat }; + } + + /// + /// 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 + /// 即谷歌、高德 转 百度 + /// + /// + /// + /// + public static double[] Gcj02tobd09(double lng, double lat) + { + double z = Math.Sqrt(lng * lng + lat * lat) + 0.00002 * Math.Sin(lat * x_PI); + double theta = Math.Atan2(lat, lng) + 0.000003 * Math.Cos(lng * x_PI); + double bd_lng = z * Math.Cos(theta) + 0.0065; + double bd_lat = z * Math.Sin(theta) + 0.006; + + return new[] { bd_lng, bd_lat }; + } + + /// + /// WGS84转GCj02 + /// + /// + /// + /// + public static double[] Wgs84togcj02(double lng, double lat) + { + if (Out_of_china(lng, lat)) + { + return new[] { lng, lat }; + } + else + { + double dlat = Transformlat(lng - 105.0, lat - 35.0); + double dlng = Transformlng(lng - 105.0, lat - 35.0); + double radlat = lat / 180.0 * PI; + double magic = Math.Sin(radlat); + magic = 1 - ee * magic * magic; + double sqrtmagic = Math.Sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.Cos(radlat) * PI); + double mglat = lat + dlat; + double mglng = lng + dlng; + + return new[] { mglng, mglat }; + } + } + + /// + /// 批量WGS84转GCj02 + /// + /// [[lng,lat],...] + /// + public static List Wgs84togcj02(List wgs84s) + { + List gcj02s = new List(); + foreach (var wgs84 in wgs84s) + { + var lng = wgs84[0]; + var lat = wgs84[1]; + if (Out_of_china(lng, lat)) + { + gcj02s.Add( new[] { lng, lat }); + } + else + { + double dlat = Transformlat(lng - 105.0, lat - 35.0); + double dlng = Transformlng(lng - 105.0, lat - 35.0); + double radlat = lat / 180.0 * PI; + double magic = Math.Sin(radlat); + magic = 1 - ee * magic * magic; + double sqrtmagic = Math.Sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.Cos(radlat) * PI); + double mglat = lat + dlat; + double mglng = lng + dlng; + + gcj02s.Add( new[] { mglng, mglat }); + } + } + return gcj02s; + } + + /// + /// GCJ02 转换为 WGS84 + /// + /// + /// + /// + public static double[] Gcj02towgs84(double lng, double lat) + { + if (Out_of_china(lng, lat)) + { + return new[] { lng, lat }; + } + else + { + double dlat = Transformlat(lng - 105.0, lat - 35.0); + double dlng = Transformlng(lng - 105.0, lat - 35.0); + double radlat = lat / 180.0 * PI; + double magic = Math.Sin(radlat); + magic = 1 - ee * magic * magic; + double sqrtmagic = Math.Sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.Cos(radlat) * PI); + double mglat = lat + dlat; + double mglng = lng + dlng; + + return new[] { lng * 2 - mglng, lat * 2 - mglat }; + } + } + /// + /// 批量GCJ02 转换为 WGS84 + /// + /// [[lng,lat],...] + /// + public static List Gcj02towgs84(List gcj02s) + { + List wgs84s = new List(); + foreach (var gcj02 in gcj02s) + { + var lng = gcj02[0]; + var lat = gcj02[1]; + if (Out_of_china(lng, lat)) + { + wgs84s.Add(new[] { lng, lat }); + } + else + { + double dlat = Transformlat(lng - 105.0, lat - 35.0); + double dlng = Transformlng(lng - 105.0, lat - 35.0); + double radlat = lat / 180.0 * PI; + double magic = Math.Sin(radlat); + magic = 1 - ee * magic * magic; + double sqrtmagic = Math.Sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.Cos(radlat) * PI); + double mglat = lat + dlat; + double mglng = lng + dlng; + + wgs84s.Add(new[] { lng * 2 - mglng, lat * 2 - mglat }); + } + } + return wgs84s; + } + + public static double Transformlat(double lng, double lat) + { + double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.Sqrt(Math.Abs(lng)); + ret += (20.0 * Math.Sin(6.0 * lng * PI) + 20.0 * Math.Sin(2.0 * lng * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.Sin(lat * PI) + 40.0 * Math.Sin(lat / 3.0 * PI)) * 2.0 / 3.0; + ret += (160.0 * Math.Sin(lat / 12.0 * PI) + 320 * Math.Sin(lat * PI / 30.0)) * 2.0 / 3.0; + + return ret; + } + + public static double Transformlng(double lng, double lat) + { + double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.Sqrt(Math.Abs(lng)); + ret += (20.0 * Math.Sin(6.0 * lng * PI) + 20.0 * Math.Sin(2.0 * lng * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.Sin(lng * PI) + 40.0 * Math.Sin(lng / 3.0 * PI)) * 2.0 / 3.0; + ret += (150.0 * Math.Sin(lng / 12.0 * PI) + 300.0 * Math.Sin(lng / 30.0 * PI)) * 2.0 / 3.0; + + return ret; + } + + /// + /// 判断是否在国内,不在国内则不做偏移 + /// 纬度3.86~53.55,经度73.66~135.05 + /// + /// + /// + /// + public static bool Out_of_china(double lng, double lat) + { + return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55); ; + } + + /// + /// WGS84坐标系->百度坐标系 + /// + /// + /// + /// + public static double[] Wgs84tobd09(double lon, double lat) + { + var gcj02 = Wgs84togcj02(lon, lat); + + return Gcj02tobd09(gcj02[0], gcj02[1]); + } + + /// + /// 百度坐标系->WGS84坐标系 + /// + /// + /// + /// + public static double[] Bd09towgs84(double bd_lon, double bd_lat) + { + var gcj02 = Bd09togcj02(bd_lon, bd_lat); + + return Gcj02towgs84(gcj02[0], gcj02[1]); + } + } +} diff --git a/src/JTTools/wwwroot/js/map.js b/src/JTTools/wwwroot/js/map.js new file mode 100644 index 0000000..7007d6c --- /dev/null +++ b/src/JTTools/wwwroot/js/map.js @@ -0,0 +1,22 @@ +function mapInit() { + console.debug("mapinit"); + //延迟加载下 + setTimeout(() => { + window.map = new AMap.Map('mapContainer', { + zoom: 12, + center: [114.085947, 22.547] + }); + }, 1500) +} + +function createMarker(gcj02_lng,gcj02_lat) { + console.debug("Marker", gcj02_lng, gcj02_lat); + var marker = new AMap.Marker({ + position: new AMap.LngLat(gcj02_lng, gcj02_lat), // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9] + icon: new AMap.Icon({ + imageSize: new AMap.Size(36, 36), + }) + }); + window.map.add(marker); + window.map.setFitView(marker); +}