四舍五入经纬度以在 Google 地图中显示大致位置

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

您能否提供有关极坐标方法的任何指导?谢谢***.com/questions/8018788/… 这里讨论了相关的公式:mathforum.org/library/drmath/view/51756.html 一旦你得到了公式,它“仅仅是”一个问题,即为球体上的所有点推导方程,其中这些点之间的距离点和原始点小于阈值。【参考方案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】:

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

【讨论】:

这就是他要问的问题,所以几乎不是一个有用的答案。 这个答案有什么问题?它可能有点不完整(缺少数值,例如“四舍五入到小数点后两位将位置精度截断到公里左右”),但除此之外我认为它至少是可以接受的

以上是关于四舍五入经纬度以在 Google 地图中显示大致位置的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Google 版本地图中的拖动标记中获取格式化地址

单击时获取存储的 LatLng 以在地图上显示位置

如何修复 flutter_google_places_autocomplete.dart 的错误?

使用标记在 HTML 中嵌入 Google 地图代码

如何使用 JSON 纬度数组和 JSON 经度数组在 Google 地图上显示折线?

Javascript Google地图,按经度和纬度坐标显示图钉[重复]