【问题标题】:Rounding Lat and Long to Show Approximate Location in Google Maps四舍五入经纬度以在 Google 地图中显示大致位置
【发布时间】:2011-07-13 06:51:33
【问题描述】:

我正在我的 Rails 应用程序视图中显示 Google 地图,并将使用标记/覆盖。

坐标数据将来自手机 (GPS) 并存储在我的 Rails 应用程序的数据库中。

问题是,我不希望在我的网页源代码中显示精确的纬度/经度……也就是说,我想标记一个大概的位置,而不泄露真正的纬度/经度。

如何舍入/截断纬度/经度值,使其仍然准确(例如,在一英里内),但又不太准确?

(例如:你将如何舍入 35.2827524, -120.6596156 ?)

【问题讨论】:

    标签: javascript ruby-on-rails google-maps geolocation geospatial


    【解决方案1】:

    最简单的做法是将两个坐标四舍五入到一定的小数位,或者为坐标添加随机抖动:

    lat = Math.floor(lat*1000+0.5)/1000; (round within 0.001)
    

    dither=0.001;
    lat = lat + (Math.random()-0.5)*dither;
    

    如果你真的想在一定的英里范围内,你需要做更复杂的数学,可能使用极坐标。

    【讨论】:

    【解决方案2】:

    这可以相当简单地完成。如果您要四舍五入到网格,则纬度会在地球上的所有点以恒定的量变化。根据您与赤道的距离,经度会发生不同程度的变化。

    以下代码将纬度和经度捕捉到任意网格大小

    double EARTH_RADIUS_KM = 6371;
    
    double GRID_SIZE_KM = 1.6; // <----- Our grid size in km..
    
    double DEGREES_LAT_GRID = Math.toDegrees(GRID_SIZE_KM / EARTH_RADIUS_KM);
    //     ^^^^^^ This is constant for a given grid size.
    
    public Location snapToGrid(Location myLoc) {
      double cos = Math.cos(Math.toRadians(myLoc.latitude));
    
      double degreesLonGrid = DEGREES_LAT_GRID / cos;
    
      return new Location (
          Math.round(myLoc.longitude / degreesLonGrid) * degreesLonGrid,
          Math.round(myLoc.latitude / DEGREES_LAT_GRID) * DEGREES_LAT_GRID);
    
    }
    

    请注意,如果您在极点(当 cos 函数接近零时),这将失败。根据您的网格大小,当您接近 +/- 90 度的纬度时,结果会变得不可预测。处理这个是留给读者的练习:)

    【讨论】:

      【解决方案3】:

      查看我的不涉及随机数的解决方案,它将在查询之间提供一致的结果:

      Is there any easy way to make GPS coordinates coarse?

      【讨论】:

        【解决方案4】:

        尝试四舍五入到小数点后两位。

        【讨论】:

        • 这就是他要问的问题,所以几乎不是一个有用的答案。
        • 这个答案有什么问题?它可能有点不完整(缺少数值,例如“四舍五入到小数点后两位将位置精度截断到公里左右”),但除此之外我认为它至少是可以接受的
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多