【问题标题】:System.FormatException: 24201: Latitude values must be between -90 and 90 degreesSystem.FormatException:24201:纬度值必须在 -90 到 90 度之间
【发布时间】:2011-12-05 16:37:40
【问题描述】:

更新

问题是用户的语言环境! 我已经用

对问题进行了分类
double lat = double.Parse(Request.Form["lat"], CultureInfo.InvariantCulture);

实际问题

这是我第一次尝试在我的移动网站上实现定位。我正在使用 w3 地理定位 API 从他们的手机获取用户的位置并将其转换为双精度,然后将其作为浮点数存储在 sqlserver 中。

在大多数情况下,它可以正常工作,但在某些情况下,手机提供的坐标很长。例如,纬度可能是3.1234567890123,所以点后有 14 个数字。

这会保存为3.1234567890123+E16,当我尝试计算用户到某个点的距离时,会导致标题出错。

避免它的最佳方法是什么?我应该将用户的输入修剪到一定长度以便正确转换吗?

获取和保存数据的方法

double lat = Convert.ToDouble(Request.Form["lat"]);
double lng = Convert.ToDouble(Request.Form["lng"]);
user.UpdateMyLocationCoordinates(user.id, lat, lng);

public void UpdateMyLocationCoordinates(int userId, double lat, double lng)
{
    SiteDbHelper db = new SiteDbHelper();
    List<SqlParameter> sqlParameters = new List<SqlParameter>();
    sqlParameters.Add(db.CreateParameter("@userId", SqlDbType.Int, userId));
    sqlParameters.Add(db.CreateParameter("@latitude", SqlDbType.Float, lat));
    sqlParameters.Add(db.CreateParameter("@longitude", SqlDbType.Float, lng));
    db.UpdateInsertDeleteReturnAffectedRowCount ("SocialSiteUser_UpdateMyLocationCoordinates", CommandType.StoredProcedure, sqlParameters);
}

创建参数

public SqlParameter CreateParameter(string name, SqlDbType type, double value)
{
    SqlParameter param = new SqlParameter(name, value);
    param.SqlDbType = type;
    return param;
}

SP o 存储数据是

ALTER PROCEDURE [dbo].[SocialSiteUser_UpdateMyLocationCoordinates]
@userId int,
@latitude float,
@longitude float
AS
BEGIN
    SET NOCOUNT ON
    update domains_users set latitude=@latitude, longitude=@longitude where id=@userId
END

【问题讨论】:

  • 您应该发布您的输入、您运行的计算以及您格式化结果的实际部分。
  • 数字太多与-90 ... 90 范围无关。
  • 我正在通过手机发帖,但使用精确的纬度输入更新了问题。将更新休息位层
  • E+16 是你的问题。您是否在某处丢失了小数点?
  • 我正在将输入转换为双精度并保存到 SQL 服务器。 SQL server 列中的数据类型为浮点数

标签: c# sql-server-2008 geolocation


【解决方案1】:

问题是用户的语言环境!我已经对问题进行了排序

 double lat = double.Parse(Request.Form["lat"], CultureInfo.InvariantCulture);

【讨论】:

    【解决方案2】:

    虽然3.1234567890123+E16 是一个有效的浮点数,但它比 90 大很多,所以它不是一个有效的纬度,它必须位于 -90+90 度之间。

    另外,3.1234567890123 实际上是3.1234567890123+E01,所以我不确定它是如何在转换为3.1234567890123+E16 时乘以10^16

    【讨论】:

    • 实际存储值为3.9951341674225E+16, 3.27377879977052E+16
    • @nLL 这些不是有效的纬度(或经度) - Request["lat"] 中的确切字符串是什么?
    • @nLL 例如 3.9951341674225E+16 大致相当于 39951341674225000 (我们在您给出的示例中总共只有 14 位精度),所以如果您有 17 位数字,没有小数点, 它将是 X.XXXXE+16 的科学计数法。
    • 感谢我与用户取得联系并与他们一起进行测试以了解发生了什么。我会进一步更新。
    • 终于!我能够通过在 SP 中使用“@lat float(53)”而不是“@lat float”来使其工作
    猜你喜欢
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    相关资源
    最近更新 更多