首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GPS将16位十六进制值转换为经度和纬度

GPS将16位十六进制值转换为经度和纬度
EN

Stack Overflow用户
提问于 2021-11-15 12:41:23
回答 2查看 318关注 0票数 0

从设备中,我得到以下类型的十六进制值3305511C0424573C (存储在sql数据库中)。我要把经度和纬度去掉。

我还得到这种格式的经度和纬度值(单精度浮点数):

  • 经度= 1083419342
  • 纬度= 1112302388

我知道结果是:

  • 经度= 4.6146
  • 纬度= 51.09688

我试图用C#编写几个转换代码,但结果都不正确。

来自sql server的数据:

StreamID = 15620,GPS0 = 3305511C0424573C,GPS1 = 0000000000000000,GPS经度= 1083419342,GPS纬度= 1112302388

标号=全球定位系统经度,单位=度,DataItemType =单精度浮标,精度= 0,BytePosition = 11标号= GPS纬度,单位=度,DataItemType =单精度浮标,精度= 0,BytePosition = 12

数据如何在sql中获取对我来说是个未知数。

如何使用坐标:

<script> var XMarker = L.marker([51.09688, 4.6146]).addTo(mymap); </script>

这就是您需要在html或get应用程序中添加的内容,以便在由传单is创建的地图上获得额外的标记(链接: leafletjs.com )。

因此,我需要知道从:的转换

  • 3305511C0424573C ->经度= 4.6146,纬度= 51.09688
  • 330D262A030C1247 ->经度= 3.19325013523526,纬度= 51.222186941538

C#

代码语言:javascript
复制
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;
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-23 07:12:40

从3305511C0424573C到经度= 4.6146和纬度= 51.09688的转换如下。

  1. 将16个字符拆分成两个8个字符的单独字符串。
  2. 将8个字符长字符串拆分为4个字节(2个字符长)的字节数组。
  3. 然后计算如下:byte[0]+((Byte[1]+(byte[2]/100)+(byte[3]/10000))/60)

对经度和纬度执行以下步骤。

代码语言:javascript
复制
    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;
    }
票数 0
EN

Stack Overflow用户

发布于 2021-11-16 14:55:08

你在要求找到两种不同的解码方式。

第一部分(原始问题),是关于转换的。

代码语言:javascript
复制
longitude = 1083419342
latitude = 1112302388

代码语言:javascript
复制
longitude = 4.6146
latitude = 51.09688

数字是在现代计算机上找到的浮点数的整数表示(因此IEEE 754单精度二进制表示与普通整数表示)。注:我们没有负数,所以我们不知道符号是如何表示的。

算法(第一个问题)

  • 取每个数字(没有分隔字段的C )
  • 将其转换为字节数组(4个字节)
  • 读取浮点这样的字节(浮点数有标准格式)。

在C语言中,uint32_tfloat的结合。在Python struct.unpack('>f', bytearray.fromhex(hex(your_number)[2:])中。C#有BitConverter,您可以在位转换器文档中看到一个例子。我让对方写了一个正确的C#答案。注意:我们仍然需要测试负数,但它们应该是可以的(几个月前,我们在澳大利亚遇到了一个类似的问题,所以是负纬度)。

现在,您询问了十六进制数字表示,这与第一个问题无关(因此您的软件已经完成了如何转换坐标)。

问题是,我不能得到精确的坐标,但我非常精确,上升0.02度的误差。也许还有一个基准转换(您的坐标WGS84,是否如GPS所期望的那样)。或者数据库将坐标转换成不同的数据?

在任何情况下,第二编码的解决方案:

  • 将字符串拆分为8个字符中的一半。前一半是纬度,后一半是经度。
  • 两个字符的第一组是度。
  • 第二组两个字符是素数(或分)。所以你应该把坐标写成4'36"52.56,3'11"35.70,51'5"48.77,51'13"19.87
  • 那我也不知道。也许第二组是第二组,然后是两个小数,或者是四个小数。

再说一遍:我不知道负纬度或经度是如何编码的。请考虑经度可以有360个值,但在两个字符中,最多只能编码256个值。

几个月前,我发现澳大利亚坐标上没有类似的问题(没有答案)。这可能有助于证实这一点。但是,您可以尝试使用更多的坐标,并检查错误(也许是为了找出是否也存在数据转换,因此两个不同的坐标约定)。但我认为(只有4个数据)这样的方法已经足够精确了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69974567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档