【发布时间】:2021-12-26 16:05:00
【问题描述】:
从设备我得到以下类型的十六进制值 3305511C0424573C(存储在 sql 数据库中)。我需要从中得到经度和纬度。
我也得到这种格式的经度和纬度值(单精度浮点数):
- 经度 = 1083419342
- 纬度 = 1112302388
我知道结果是:
- 经度 = 4.6146
- 纬度 = 51.09688
我尝试在 C# 中编写多个转换代码,但所有结果都不正确。
来自 sql server 的数据:
StreamID = 15620,GPS0 = 3305511C0424573C,GPS1 = 0000000000000000,GPS 经度 = 1083419342,GPS 纬度 = 1112302388
标签 = GPS 经度,单位 = 度,DataItemType = 单精度浮点数,精度 = 0,字节位置 = 11 label = GPS 纬度,Unit = 度,DataItemType = Single-Precision Float,Precision = 0,BytePosition = 12
数据如何进入 sql 对我来说是个未知数。
我如何使用坐标:<script> var XMarker = L.marker([51.09688, 4.6146]).addTo(mymap); </script>
这是您需要在您的 html 或 web 应用程序中添加的内容,以在您的地图上获得由 leafletjs 创建的额外标记(链接:leafletjs.com)
因此我需要知道转换来自:
- 3305511C0424573C -> 经度 = 4.6146,纬度 = 51.09688
- 330D262A030C1247 -> 经度 = 3.19325013523526,纬度 = 51.222186941538
C# 答案
public static double GPSCoordinateConversion(string GPSCoordinate)
{
double coordinate = 0;
byte[] _byte = new byte[GPSCoordinate.Length / 2];
double value1 = 0;
double value2 = 0;
for (int i = 0; i < _byte.Length; i++)
{
string byteValue = GPSCoordinate.Substring(i * 2, 2);
_byte[i] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
}
value1 = Convert.ToDouble(_byte[2]) / 100;
value2 = Convert.ToDouble(_byte[3]) / 10000;
coordinate = Convert.ToDouble(_byte[0] + ((_byte[1]+value1+value2) / 60));
return coordinate;
}
public static double GetLatitude(string GPSHexCoordinate)
{
double latitude = 0;
latitude = GPSCoordinateConversion(GPSHexCoordinate.Substring(0, 8));
return latitude;
}
public static double GetLongitude(string GPSHexCoordinate)
{
double longitude = 0;
longitude = GPSCoordinateConversion(GPSHexCoordinate.Substring(8, 8));
return longitude;
}
【问题讨论】:
-
您使用的是哪个 dbms?
-
我使用的是 microsoft SQL server management studio,但我使用 C# (visual studio) 制作的应用程序读取了 sql server。在我想要进行转换的应用程序代码中。
-
我不是第一次看到这样的数据,但据我所知,如何转换它并没有明确的答案。你能从众所周知的坐标中计算出上述数字吗?这将有助于找出编码
-
经度 (4.6146) 和纬度 (51.09688) 是 3305511C0424573C 的正确结果。我希望坐标保持这种格式,我可以直接在leaflet.js插件中输入。
标签: c# sql sql-server gps