四舍五入经纬度以在 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 地图中显示大致位置的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 flutter_google_places_autocomplete.dart 的错误?