将纬度/经度转换为整数

将纬度/经度转换为整数

问题描述:

我正在使用的一项服务要求我将纬度/经度作为整数传递给地址。目前,我的经/纬度的存储为双打:将纬度/经度转换为整数

double lat = 38.898748; 
double lon = -77.037684; 

我已经用尽我的谷歌福而找不到/经度纬度转换为整数表示的方法。任何帮助,将不胜感激。

+7

您需要从服务规范(或实例)。有多种方法可以做到这一点。 –

+0

你想要四舍五入吗?还是更精确一点?可能是几分钟或几秒?正如亨克所说,这取决于。 – Jodrell

+1

@HenkHolterman,我将不得不给他们的支持发邮件。 –

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

乘以.000001转换回来。

这个假设你只想精确到小数点后第六位。

+1

尽管此转换适用于您(基于您接受答案),但您仍应检查您和您的提供商的大地测量系统。许多情况非常相似,在许多情况下,差异可能不会显现或可忽略/不明显,但在某些情况下可能极端。 –

我可以看到这种情况发生的唯一方法是如果你移动小数点。

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

但为什么不是'10000000'或'10000'? –

+0

@HenkHolterman - 任何一个乘法都没关系,会给你错误的答案。 –

+0

@亨克 - 如果你使用noggin,你会注意到他的例子使用了6位精度。他实际上可以使用任何精度。 – ChaosPandion

如果您需要在几秒钟的座标,只要乘以60 * 60

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

如果您需要在座标更高的分辨率,例如1/100秒,只是乘以100多个。

+0

为什么downvote?如果你不解释你认为是错误的,它不能改善答案。 – Guffa

+0

这个批评指向所有加入这个问题的人中的90%,并清楚地表明为什么它应该在http://gis.stackexchange.com/上被询问。 如果你使用坐标,你至少必须知道地球是不统一的,并且存在比“google谷歌地图现在使用什么”更多的坐标系。 我很确定我读了GMaps在坐标系中的变化(一些细节),但对于大多数脚踏实地的用例,请记住“WGS84”。 –

您需要知道您使用的Geodetic System以及API的期望值。例如。 WGS84,NAD83,OSGB36,ED50 ...(例如:Google Earth uses WGS84

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

答案可能是另一个,

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)) 
} 

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

第二个选项将是无损但奇怪的。

我将对此进行一次野蛮刺探,并猜测您希望将纯度转换为Degrees:Minutes:Seconds形式的单个整数。

这里有一种方法可以将它转换为一个整数,但显然你要确认这是他们正在使用的格式。

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的方式总是四舍五入),但它会给你经度/纬度。

+1

我在数据集中遇到了这种奇怪的格式。这个答案解释了它。谢谢! – bdetweiler

double_lat = 38.898748; 

double_lon = -77.037684; 

一个简单的方法来存储小数位为整数:

lat = (double_lat + 90) * 1000000; 

lon = (double_lon + 180) * 1000000; 

lat = 128898748; 
lon = 102962316;