舍入Lat和Long以在Google地图中显示近似位置

时间:2011-03-11 06:29:58

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

我正在我的Rails应用视图中显示Google地图,并将使用标记/叠加层。

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

问题是,我不希望在我的网页源中看到精确的纬度/经度...即我想标记一个大致的位置而不给出真正的纬度/经度。

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

(例如:你将如何围绕35.2827524,-120.6596156?)

4 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:0)

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

Is there any easy way to make GPS coordinates coarse?

答案 2 :(得分:0)

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

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

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 :(得分:-3)

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