将Lat/Lon转换为Integer

本文关键字:Integer 转换 Lon Lat | 更新日期: 2023-09-27 18:13:39

我使用的服务要求我将地址的lat/lon作为整数传递给它。目前,我的纬度/经度存储为双精度:

double lat = 38.898748;
double lon = -77.037684;

我已经用尽了我的Google fu,找不到将lat/lon转换为整数表示的方法。如有任何帮助,我们将不胜感激。

将Lat/Lon转换为Integer

有时很简单,只需乘以100万。

乘以0.00001可转换回来。

假设您只需要精确到小数点后第6位。

您需要知道您使用的大地测量系统以及API的期望。例如WGS84、NAD83、OSGB36、ED50…(例如:谷歌地球使用WGS84(

如果他们需要一个整数,那么他们可能使用了与谷歌和其他提供商不同的东西。四舍五入一个双精度或其他整数转换可能不起作用。您需要大地测量系统信息,然后在这两个值之间进行转换。

我能看到这种情况发生的唯一方法是移动小数点。

int lat = (int)(38.898748 * 1000000.0);
int lon = (int)(-77.037684 * 1000000.0);

如果需要以秒为单位的坐标,只需乘以60 * 60:

int latitude = (int)Math.Round(lat * 60.0 * 60.0);
int longitude = (int)Math.Round(lon * 60.0 * 60.0);

如果你需要更高分辨率的坐标,例如100秒,只需再乘以100。

我将对此进行一次大胆的尝试,并猜测您想要将纯度数转换为单个整数形式的度:分钟:秒。

这里有一种方法可以将其转换为整数,但很明显,您需要确认这是他们使用的格式。

double originalLat = 38.898748,
    TEMPdecimal;
int degrees = (int)originalLat;
TEMPdecimal = (originalLat - degrees) * 60;
int minutes = (int)TEMPdecimal;
TEMPdecimal = (TEMPdecimal - minutes) * 60;
int seconds = (int)TEMPdecimal;
int lat = (degrees * 10000) + (minutes * 100) + seconds;

在这种情况下,返回值为385355或38度53分55秒。很抱歉,如果这看起来有点草率,并且类型转换可能不是最有效的(肯定需要确保它正确取整,我认为类型转换为int一直在取整(,但它会给你经度/纬度。

答案可能是

int FactorConversion(double degrees)
{
    return (int) degrees * MagicConversionFactor 
    //You supply this number, a likely candidate is 360 since
    //this converts degrees to seconds 
}

 int BinaryConversion32(float degrees)
 {
     return BitConvetor.ToInt32(BitConvertor.GetBytes(degrees))
 }

long BinaryConversion64(double degrees)
{
    return BitConvetor.ToInt64(BitConvertor.GetBytes(degrees))
}

注意,double是一种8字节类型。正如我和其他人之前所说,这完全取决于API的期望。

后两个选项是无损的,但很奇怪。

double_lat = 38.898748;
double_lon = -77.037684;

将十进制位置存储为整数的一种简单方法:

lat = (double_lat + 90) * 1000000;
lon = (double_lon + 180) * 1000000;
lat = 128898748;
lon = 102962316;